diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php
index 800947f31..ebc78224b 100644
--- a/airtime_mvc/application/controllers/PreferenceController.php
+++ b/airtime_mvc/application/controllers/PreferenceController.php
@@ -348,7 +348,9 @@ class PreferenceController extends Zend_Controller_Action
public function getLibraryDatatableAction() {
$data = Application_Model_Preference::GetValue("library_datatable", true);
- $this->view->settings = unserialize($data);
+ if ($data != "") {
+ $this->view->settings = unserialize($data);
+ }
}
public function setTimelineDatatableAction() {
@@ -363,7 +365,9 @@ class PreferenceController extends Zend_Controller_Action
public function getTimelineDatatableAction() {
$data = Application_Model_Preference::GetValue("timeline_datatable", true);
- $this->view->settings = unserialize($data);
+ if ($data != "") {
+ $this->view->settings = unserialize($data);
+ }
}
}
diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php
index 85452efd3..03b92973f 100644
--- a/airtime_mvc/application/models/StoredFile.php
+++ b/airtime_mvc/application/models/StoredFile.php
@@ -582,46 +582,60 @@ class Application_Model_StoredFile {
public static function searchFilesForPlaylistBuilder($datatables) {
global $CC_CONFIG;
- $displayData = array("track_title", "artist_name", "album_title", "genre", "length",
- "year", "utime", "mtime", "ftype", "track_number");
+ $displayColumns = array("id", "track_title", "artist_name", "album_title", "genre", "length",
+ "year", "utime", "mtime", "ftype", "track_number", "mood", "bpm", "composer", "info_url",
+ "bit_rate", "sample_rate", "isrc_number", "encoded_by", "label", "copyright", "mime", "language"
+ );
- $plSelect = "SELECT ";
- $fileSelect = "SELECT ";
- foreach ($displayData as $key) {
+ $plSelect = array();
+ $fileSelect = array();
+ foreach ($displayColumns as $key) {
- if ($key === "track_title") {
- $plSelect .= "name AS ".$key.", ";
- $fileSelect .= $key.", ";
+ if ($key === "id") {
+ $plSelect[] = "PL.id AS ".$key;
+ $fileSelect[] = $key;
+ } else if ($key === "track_title") {
+ $plSelect[] = "name AS ".$key;
+ $fileSelect[] = $key;
} else if ($key === "ftype") {
- $plSelect .= "'playlist' AS ".$key.", ";
- $fileSelect .= $key.", ";
+ $plSelect[] = "'playlist' AS ".$key;
+ $fileSelect[] = $key;
} else if ($key === "artist_name") {
- $plSelect .= "login AS ".$key.", ";
- $fileSelect .= $key.", ";
+ $plSelect[] = "login AS ".$key;
+ $fileSelect[] = $key;
} else if ($key === "length") {
- $plSelect .= $key.", ";
- $fileSelect .= $key."::interval, ";
+ $plSelect[] = $key;
+ $fileSelect[] = $key."::interval";
} else if ($key === "year") {
- $plSelect .= "CAST(utime AS varchar) AS ".$key.", ";
- $fileSelect .= $key.", ";
+ $plSelect[] = "CAST(utime AS varchar) AS ".$key;
+ $fileSelect[] = $key;
} else if ($key === "utime") {
- $plSelect .= $key.", ";
- $fileSelect .= $key.", ";
+ $plSelect[] = $key;
+ $fileSelect[] = $key;
} else if ($key === "mtime") {
- $plSelect .= $key.", ";
- $fileSelect .= $key.", ";
+ $plSelect[] = $key;
+ $fileSelect[] = $key;
} else {
- $plSelect .= "NULL AS ".$key.", ";
- $fileSelect .= $key.", ";
+ $plSelect[] = "NULL AS ".$key;
+ $fileSelect[] = $key;
}
}
- $fromTable = " ((".$plSelect."PL.id
- FROM cc_playlist AS PL LEFT JOIN cc_subjs AS sub ON (sub.id = PL.creator_id))
- UNION
- (".$fileSelect."id FROM ".$CC_CONFIG["filesTable"]." AS FILES WHERE file_exists = 'TRUE')) AS RESULTS";
+ $plSelect = "SELECT ". join(",", $plSelect);
+ $fileSelect = "SELECT ". join(",", $fileSelect);
- $results = Application_Model_StoredFile::searchFiles($fromTable, $datatables);
+ $fromTable = " (({$plSelect} FROM cc_playlist AS PL
+ LEFT JOIN cc_subjs AS sub ON (sub.id = PL.creator_id))
+ UNION
+ ({$fileSelect} FROM ".$CC_CONFIG["filesTable"]." AS FILES WHERE file_exists = 'TRUE')) AS RESULTS";
+
+ //TODO see Allan's reply about iDataSort working for serverside processing.
+ //hack to sort on ftype when image "type" col selected for sorting.
+ if ($datatables["iSortCol_0"] == 1) {
+ $datatables["iSortCol_0"] = 2;
+ }
+
+ $results = Application_Model_StoredFile::searchFiles($displayColumns, $fromTable, $datatables);
foreach ($results['aaData'] as &$row) {
@@ -657,46 +671,45 @@ class Application_Model_StoredFile {
return $results;
}
- public static function searchFiles($fromTable, $data)
+ public static function searchFiles($displayColumns, $fromTable, $data)
{
- global $CC_CONFIG, $CC_DBC;
+ $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME);
+ $where = array();
- $columnsDisplayed = explode(",", $data["sColumns"]);
+ /*
+ $columnsDisplayed = array();
+ for ($i = 0; $i < $data["iColumns"]; $i++) {
+ if (in_array($data["mDataProp_".$i], $displayColumns)) {
+ $columnsDisplayed[] = $data["mDataProp_".$i];
+ }
+ }
+ */
- if($data["sSearch"] !== "")
+ if ($data["sSearch"] !== "") {
$searchTerms = explode(" ", $data["sSearch"]);
+ }
$selectorCount = "SELECT COUNT(*)";
- foreach( $columnsDisplayed as $key=>$col){
- if($col == ''){
- unset($columnsDisplayed[$key]);
- }
- }
- //$selectorRows = "SELECT " . join(',', $columnsDisplayed );
- $selectorRows = "SELECT * ";
+ //$selectorRows = "SELECT ". join(",", $displayColumns);
+ $selectorRows = "SELECT *";
$sql = $selectorCount." FROM ".$fromTable;
- $totalRows = $CC_DBC->getOne($sql);
+ $sqlTotalRows = $sql;
- // Where clause
- if(isset($data["optWhere"])) {
- $where[] = join(" AND ", $data["optWhere"]);
- }
-
- if(isset($searchTerms)) {
+ if (isset($searchTerms)) {
$searchCols = array();
- for($i=0; $i<$data["iColumns"]; $i++) {
- if($data["bSearchable_".$i] == "true") {
- $searchCols[] = $columnsDisplayed[$i];
+ for ($i = 0; $i < $data["iColumns"]; $i++) {
+ if ($data["bSearchable_".$i] == "true") {
+ $searchCols[] = $data["mDataProp_{$i}"];
}
}
$outerCond = array();
- foreach($searchTerms as $term) {
+ foreach ($searchTerms as $term) {
$innerCond = array();
- foreach($searchCols as $col) {
+ foreach ($searchCols as $col) {
$escapedTerm = pg_escape_string($term);
$innerCond[] = "{$col}::text ILIKE '%{$escapedTerm}%'";
}
@@ -708,32 +721,48 @@ class Application_Model_StoredFile {
// Order By clause
$orderby = array();
- for($i=0; $i<$data["iSortingCols"]; $i++){
- $orderby[] = $columnsDisplayed[$data["iSortCol_".$i]]." ".$data["sSortDir_".$i];
+ for ($i = 0; $i < $data["iSortingCols"]; $i++){
+ $num = $data["iSortCol_".$i];
+ $orderby[] = $data["mDataProp_{$num}"]." ".$data["sSortDir_".$i];
}
$orderby[] = "id";
$orderby = join("," , $orderby);
// End Order By clause
- if(isset($where)) {
+ if (count($where) > 0) {
$where = join(" AND ", $where);
$sql = $selectorCount." FROM ".$fromTable." WHERE ".$where;
- $totalDisplayRows = $CC_DBC->getOne($sql);
+ $sqlTotalDisplayRows = $sql;
+
$sql = $selectorRows." FROM ".$fromTable." WHERE ".$where." ORDER BY ".$orderby." OFFSET ".$data["iDisplayStart"]." LIMIT ".$data["iDisplayLength"];
}
else {
$sql = $selectorRows." FROM ".$fromTable." ORDER BY ".$orderby." OFFSET ".$data["iDisplayStart"]." LIMIT ".$data["iDisplayLength"];
}
+ try {
+ $r = $con->query($sqlTotalRows);
+ $totalRows = $r->fetchColumn(0);
+
+ if (isset($sqlTotalDisplayRows)) {
+ $r = $con->query($sqlTotalDisplayRows);
+ $totalDisplayRows = $r->fetchColumn(0);
+ }
+ else {
+ $totalDisplayRows = $totalRows;
+ }
+
+ $r = $con->query($sql);
+ $r->setFetchMode(PDO::FETCH_ASSOC);
+ $results = $r->fetchAll();
+ }
+ catch (Exception $e) {
+ Logging::log($e->getMessage());
+ }
+
//display sql executed in airtime log for testing
Logging::log($sql);
- $results = $CC_DBC->getAll($sql);
-
- if(!isset($totalDisplayRows)) {
- $totalDisplayRows = $totalRows;
- }
-
return array("sEcho" => intval($data["sEcho"]), "iTotalDisplayRecords" => $totalDisplayRows, "iTotalRecords" => $totalRows, "aaData" => $results);
}
diff --git a/airtime_mvc/application/models/User.php b/airtime_mvc/application/models/User.php
index 3e94e61ae..f06a3c918 100644
--- a/airtime_mvc/application/models/User.php
+++ b/airtime_mvc/application/models/User.php
@@ -240,6 +240,7 @@ class Application_Model_User {
public static function getUsersDataTablesInfo($datatables_post) {
+ $displayColumns = array("id", "login", "first_name", "last_name", "type");
$fromTable = "cc_subjs";
// get current user
@@ -250,7 +251,7 @@ class Application_Model_User {
$username = $auth->getIdentity()->login;
}
- $res = Application_Model_StoredFile::searchFiles($fromTable, $datatables_post);
+ $res = Application_Model_StoredFile::searchFiles($displayColumns, $fromTable, $datatables_post);
// mark record which is for the current user
foreach($res['aaData'] as &$record){
diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js
index 3098277d5..d03803214 100644
--- a/airtime_mvc/public/js/airtime/library/library.js
+++ b/airtime_mvc/public/js/airtime/library/library.js
@@ -219,24 +219,36 @@ $(document).ready(function() {
oTable = $('#library_display').dataTable( {
"aoColumns": [
- /* Checkbox */ {"sTitle": "", "bSortable": false, "bSearchable": false, "mDataProp": "checkbox", "sWidth": "25px", "sClass": "library_checkbox"},
- /* Type */ {"sName": "ftype", "bSearchable": false, "mDataProp": "image", "sWidth": "25px", "sClass": "library_type"},
- /* Title */ {"sTitle": "Title", "sName": "track_title", "mDataProp": "track_title", "sClass": "library_title"},
- /* Creator */ {"sTitle": "Creator", "sName": "artist_name", "mDataProp": "artist_name", "sClass": "library_creator"},
- /* Album */ {"sTitle": "Album", "sName": "album_title", "mDataProp": "album_title", "sClass": "library_album"},
- /* Genre */ {"sTitle": "Genre", "sName": "genre", "mDataProp": "genre", "sClass": "library_genre"},
- /* Year */ {"sTitle": "Year", "sName": "year", "mDataProp": "year", "sClass": "library_year"},
- /* Length */ {"sTitle": "Length", "sName": "length", "mDataProp": "length", "sClass": "library_length"},
- /* Upload Time */ {"sTitle": "Uploaded", "sName": "utime", "mDataProp": "utime", "sClass": "library_upload_time"},
- /* Last Modified */ {"sTitle": "Last Modified", "sName": "mtime", "bVisible": false, "mDataProp": "mtime", "sClass": "library_modified_time"},
- /* Track Number */ {"sTitle": "Track", "sName": "track_number", "bSearchable": false, "bVisible": false, "mDataProp": "track_number", "sClass": "library_track"}
+ /* Checkbox */ {"sTitle": "", "mDataProp": "checkbox", "bSortable": false, "bSearchable": false, "sWidth": "25px", "sClass": "library_checkbox"},
+ /* Type */ {"sTitle": "", "mDataProp": "image", "bSearchable": false, "sWidth": "25px", "sClass": "library_type", "iDataSort": 2},
+ /* ftype */ {"sTitle": "", "mDataProp": "ftype", "bSearchable": false, "bVisible": false},
+ /* Title */ {"sTitle": "Title", "mDataProp": "track_title", "sClass": "library_title"},
+ /* Creator */ {"sTitle": "Creator", "mDataProp": "artist_name", "sClass": "library_creator"},
+ /* Album */ {"sTitle": "Album", "mDataProp": "album_title", "sClass": "library_album"},
+ /* Genre */ {"sTitle": "Genre", "mDataProp": "genre", "sClass": "library_genre"},
+ /* Year */ {"sTitle": "Year", "mDataProp": "year", "sClass": "library_year"},
+ /* Length */ {"sTitle": "Length", "mDataProp": "length", "sClass": "library_length"},
+ /* Upload Time */ {"sTitle": "Uploaded", "mDataProp": "utime", "sClass": "library_upload_time"},
+ /* Last Modified */ {"sTitle": "Last Modified", "mDataProp": "mtime", "bVisible": false, "sClass": "library_modified_time"},
+ /* Track Number */ {"sTitle": "Track", "mDataProp": "track_number", "bSearchable": false, "bVisible": false, "sClass": "library_track"},
+ /* Mood */ {"sTitle": "Mood", "mDataProp": "mood", "bSearchable": false, "bVisible": false, "sClass": "library_mood"},
+ /* BPM */ {"sTitle": "BPM", "mDataProp": "bpm", "bSearchable": false, "bVisible": false, "sClass": "library_bpm"},
+ /* Composer */ {"sTitle": "Composer", "mDataProp": "composer", "bSearchable": false, "bVisible": false, "sClass": "library_composer"},
+ /* Website */ {"sTitle": "Website", "mDataProp": "info_url", "bSearchable": false, "bVisible": false, "sClass": "library_url"},
+ /* Bit Rate */ {"sTitle": "Bit Rate", "mDataProp": "bit_rate", "bSearchable": false, "bVisible": false, "sClass": "library_bitrate"},
+ /* Sameple Rate */ {"sTitle": "Sample Rate", "mDataProp": "sample_rate", "bSearchable": false, "bVisible": false, "sClass": "library_sr"},
+ /* ISRC Number */ {"sTitle": "ISRC", "mDataProp": "isrc_number", "bSearchable": false, "bVisible": false, "sClass": "library_isrc"},
+ /* Encoded */ {"sTitle": "Encoded", "mDataProp": "encoded_by", "bSearchable": false, "bVisible": false, "sClass": "library_encoded"},
+ /* Label */ {"sTitle": "Label", "mDataProp": "label", "bSearchable": false, "bVisible": false, "sClass": "library_label"},
+ /* Copyright */ {"sTitle": "Copyright", "mDataProp": "copyright", "bSearchable": false, "bVisible": false, "sClass": "library_copyright"},
+ /* Mime */ {"sTitle": "Mime", "mDataProp": "mime", "bSearchable": false, "bVisible": false, "sClass": "library_mime"},
+ /* Language */ {"sTitle": "Language", "mDataProp": "language", "bSearchable": false, "bVisible": false, "sClass": "library_language"}
],
"bProcessing": true,
"bServerSide": true,
"bStateSave": true,
-
"fnStateSaveParams": function (oSettings, oData) {
//remove oData components we don't want to save.
delete oData.oSearch;
@@ -356,7 +368,7 @@ $(document).ready(function() {
$(nHead).find("input[type=checkbox]").attr("checked", false);
},
- "aaSorting": [[2,'asc']],
+ "aaSorting": [[3, 'asc']],
"sPaginationType": "full_numbers",
"bJQueryUI": true,
"bAutoWidth": false,
@@ -395,13 +407,12 @@ $(document).ready(function() {
"oColVis": {
"buttonText": "Show/Hide Columns",
"sAlign": "right",
- "aiExclude": [0, 1],
+ "aiExclude": [0, 1, 2],
"sSize": "css"
},
"oColReorder": {
- "iFixedColumns": 2,
- "aiOrder": [ 0,1,2,3,4,5,6,7,8,9,10 ]
+ "iFixedColumns": 2
}
});