From be56bbd453f2345b8df1de0117d962a3ca8c3a79 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 9 Feb 2007 15:38:57 +0000 Subject: [PATCH] Fixed bug where clicking on a column name in the search results gave you no results from that point forward. Now if you click on a column name it will sort by the column. Fixed #2173 - This was done by removing the sorting by track number. However, and upgrade script has been added to clean track numbers (convert from things like "20/1" to "1"), and this same function is used when importing from the command line and the web (however, not from the studio). More fixes for #2107 - changed the way the Web BROWSE columns work so that they matched how the studio works (i.e. each column is dependent on the previous column). --- .../htmlUI/var/templates/library/results.tpl | 12 ++-- .../modules/htmlUI/var/ui_browse.class.php | 68 +++++++++++-------- .../modules/storageServer/var/BasicStor.php | 16 +---- .../modules/storageServer/var/DataEngine.php | 40 ++++++++--- .../modules/storageServer/var/StoredFile.php | 36 ++++++++++ .../var/install/upgrade/upgrade-to-1.2.0.php | 15 ++++ 6 files changed, 129 insertions(+), 58 deletions(-) diff --git a/campcaster/src/modules/htmlUI/var/templates/library/results.tpl b/campcaster/src/modules/htmlUI/var/templates/library/results.tpl index f4ed91522..6bcaeb58d 100644 --- a/campcaster/src/modules/htmlUI/var/templates/library/results.tpl +++ b/campcaster/src/modules/htmlUI/var/templates/library/results.tpl @@ -13,12 +13,12 @@ - - - - - - + + + + + + {foreach from=$_results.items item=i} diff --git a/campcaster/src/modules/htmlUI/var/ui_browse.class.php b/campcaster/src/modules/htmlUI/var/ui_browse.class.php index adb0e1b33..2d10ab4b7 100644 --- a/campcaster/src/modules/htmlUI/var/ui_browse.class.php +++ b/campcaster/src/modules/htmlUI/var/ui_browse.class.php @@ -6,7 +6,10 @@ */ class uiBrowse { - public $Base; // uiBase object + /** + * @var uiBase + */ + public $Base; /** * @var string @@ -188,23 +191,33 @@ class uiBrowse $columnNumber = $p_param['col']; $category = uiBase::formElementDecode($p_param['category']); - // Set the new values for this column. + // Set the new category for this column. $this->col[$columnNumber]['category'] = $category; - $this->col[$columnNumber]['criteria'] = NULL; - $this->col[$columnNumber]['form_value'] = '%%all%%'; + $previousValue = $this->col[$columnNumber]['form_value']; - // Get the values of this category based on the criteria in the - // other columns. + // For this column and all columns above this one, reset the values + for ($i = $columnNumber; $i <= 3; $i++) { + $this->col[$i]['criteria'] = NULL; + $this->col[$i]['form_value'] = '%%all%%'; + } + + // Reload the criteria $this->setCriteria(); $tmpCriteria = $this->criteria; // We put a limit here to because some categories will select // way too many values. $tmpCriteria["limit"] = 1000; $tmpCriteria["offset"] = 0; - $browseValues = $this->Base->gb->browseCategory( - $category, $tmpCriteria, $this->Base->sessid); - if (!PEAR::isError($browseValues)) { - $this->col[$columnNumber]['values'] = $browseValues; + + // For this column and all columns above this one, + // reload the values. + for ($i = $columnNumber; $i <= 3; $i++) { + $browseValues = $this->Base->gb->browseCategory( + $this->col[$i]["category"], $tmpCriteria, $this->Base->sessid); + if (!PEAR::isError($browseValues)) { + $this->col[$i]['values'] = $browseValues; + } + $browseValues = null; } $this->Base->redirUrl = UI_BROWSER.'?act='.$this->prefix; @@ -242,6 +255,12 @@ class uiBrowse $this->col[$columnNumber]['criteria']['conditions'] = $conditions; } + // Clear all columns above this one of selected values. + for ($tmpColNum = $columnNumber + 1; $tmpColNum <= 3; $tmpColNum++) { + $this->col[$tmpColNum]['criteria'] = NULL; + $this->col[$tmpColNum]['form_value'] = '%%all%%'; + } + // Update the criteria $this->setCriteria(); $tmpCriteria = $this->criteria; @@ -250,22 +269,13 @@ class uiBrowse $tmpCriteria["limit"] = 1000; $tmpCriteria["offset"] = 0; - // We need to update all other column values for any column - // that does not have a selected value. - for ($tmpColNum = 1; $tmpColNum <= 3; $tmpColNum++) { - // Make sure not to update current column - if ($tmpColNum != $columnNumber) { - // if the column does not have a selected value - if ($this->col[$tmpColNum]['criteria'] == NULL) { - $tmpCategory = $this->col[$tmpColNum]['category']; - $browseValues = $this->Base->gb->browseCategory( - $tmpCategory, $tmpCriteria, $this->Base->sessid); - if (!PEAR::isError($browseValues)) { - $this->col[$tmpColNum]['values'] = $browseValues; - $this->col[$tmpColNum]['criteria'] = NULL; - $this->col[$tmpColNum]['form_value'] = '%%all%%'; - } - } + // For all columns greater than this one, reload the values. + for ($tmpColNum = $columnNumber + 1; $tmpColNum <= 3; $tmpColNum++) { + $tmpCategory = $this->col[$tmpColNum]['category']; + $browseValues = $this->Base->gb->browseCategory( + $tmpCategory, $tmpCriteria, $this->Base->sessid); + if (!PEAR::isError($browseValues)) { + $this->col[$tmpColNum]['values'] = $browseValues; } } $this->Base->redirUrl = UI_BROWSER.'?act='.$this->prefix; @@ -364,17 +374,17 @@ class uiBrowse } // fn pagination - public function reorder($by) + public function reorder($p_orderBy) { $this->criteria['offset'] = NULL; - if ( ($this->criteria['orderby'] == $by) && !$this->criteria['desc']) { + if ( ($this->criteria['orderby'] == $p_orderBy) && !$this->criteria['desc']) { $this->criteria['desc'] = TRUE; } else { $this->criteria['desc'] = FALSE; } - $this->criteria['orderby'] = $by; + $this->criteria['orderby'] = $p_orderBy; $this->setReload(); } // fn reorder diff --git a/campcaster/src/modules/storageServer/var/BasicStor.php b/campcaster/src/modules/storageServer/var/BasicStor.php index 71bca6b2f..71ab7216d 100644 --- a/campcaster/src/modules/storageServer/var/BasicStor.php +++ b/campcaster/src/modules/storageServer/var/BasicStor.php @@ -66,20 +66,10 @@ class BasicStor { /** * Store new file in the storage * - * @param int $parid + * @param int $p_parentId * Parent id - * @param string $fileName - * Name for new file - * @param string $localFilePath - * Local path of media file - * @param string $metadataFilePath - * Local path of metadata file - * @param string $gunid - * global unique id - * @param string $ftype - * Internal file type - * @param string $mdataLoc - * 'file'|'string' + * @param array $p_values + * See StoredFile::Insert() for details. * @param boolean $copyMedia * copy the media file if true, make symlink if false * @return int|PEAR_Error diff --git a/campcaster/src/modules/storageServer/var/DataEngine.php b/campcaster/src/modules/storageServer/var/DataEngine.php index b28570a58..c3d8e0383 100644 --- a/campcaster/src/modules/storageServer/var/DataEngine.php +++ b/campcaster/src/modules/storageServer/var/DataEngine.php @@ -367,15 +367,33 @@ class DataEngine { // Order by clause $orderby = TRUE; + $orderByAllowedValues = array('dc:creator', 'dc:source', 'dc:title', 'dcterms:extent', "ls:track_num"); + $orderByDefaults = array('dc:creator', 'dc:source', 'dc:title'); if ((!isset($criteria['orderby'])) || (is_array($criteria['orderby']) && (count($criteria['orderby'])==0))) { // default ORDER BY - $orderbyQns = array('dc:creator', 'dc:source', 'ls:track_num', 'dc:title'); + // PaulB: track number removed because it doesnt work yet because + // if track_num is not an integer (e.g. bad metadata like "1/20", + // or if the field is blank) the SQL statement gives an error. + //$orderbyQns = array('dc:creator', 'dc:source', 'ls:track_num', 'dc:title'); + $orderbyQns = $orderByDefaults; } else { - $orderbyQns = $criteria['orderby']; - } - if (!is_array($orderbyQns)) { - $orderbyQns = array($orderbyQns); + // ORDER BY clause is given in the parameters. + + // Convert the parameter to an array if it isnt already. + $orderbyQns = $criteria['orderby']; + if (!is_array($orderbyQns)) { + $orderbyQns = array($orderbyQns); + } + + // Check that it has valid ORDER BY values, if not, revert + // to the default ORDER BY values. + foreach ($orderbyQns as $metadataTag) { + if (!in_array($metadataTag, $orderByAllowedValues)) { + $orderbyQns = $orderByDefaults; + break; + } + } } $descA = (isset($criteria['desc']) ? $criteria['desc'] : NULL); @@ -437,11 +455,13 @@ class DataEngine { // Special case for track number because if we use text // sorting of this value, then 10 comes right after 1. // So we convert track number to an integer for ordering. - if ($qname == "ls:track_num") { - $tmpSql .= ", CAST(m$i.object as integer) as ls_track_num"; - } else { - $tmpSql .= ", m$i.object as ".$dataName[$qname]; - } + + // PaulB: see my note above about why this is commented out. + //if ($qname == "ls:track_num") { + // $tmpSql .= ", CAST(m$i.object as integer) as ls_track_num"; + //} else { + $tmpSql .= ", m$i.object as ".$dataName[$qname]; + //} $i++; } diff --git a/campcaster/src/modules/storageServer/var/StoredFile.php b/campcaster/src/modules/storageServer/var/StoredFile.php index 874011734..bfd05b03c 100644 --- a/campcaster/src/modules/storageServer/var/StoredFile.php +++ b/campcaster/src/modules/storageServer/var/StoredFile.php @@ -3,6 +3,37 @@ require_once("MetaData.php"); require_once("Playlist.php"); require_once(dirname(__FILE__)."/../../getid3/var/getid3.php"); +/** + * Track numbers in metadata tags can come in many formats: + * "1 of 20", "1/20", "20/1". This function parses the track + * number and gets the real number so that we can sort by it + * in the database. + * + * @param string $p_trackNumber + * @return int + */ +function camp_parse_track_number($p_trackNumber) +{ + $num = trim($p_trackNumber); + if (!is_numeric($num)) { + $matches = preg_match("/\s*([0-9]+)([^0-9]*)([0-9]*)\s*/", $num, $results); + $trackNum = 0; + foreach ($results as $result) { + if (is_numeric($result)) { + if ($trackNum == 0) { + $trackNum = $result; + } elseif ($result < $trackNum) { + $trackNum = $result; + } + } + } + } else { + $trackNum = $num; + } + return $trackNum; +} + + /** * Add data to the global array $mdata, also sets global variables * $titleHaveSet and $titleKey. @@ -199,6 +230,11 @@ function camp_get_audio_metadata($p_filename, $p_testonly = false) eval("\$enc = $encodedElement;"); } } + + // Special case handling for track number + if ($key == "ls:track_num") { + $data = camp_parse_track_number($data); + } camp_add_metadata($mdata, $key, $data, $enc); if ($key == $titleKey) { $titleHaveSet = TRUE; diff --git a/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php b/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php index cf756664d..ead55fb00 100644 --- a/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php +++ b/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php @@ -54,6 +54,21 @@ echo " * Adding 'jobpid' to ".$CC_CONFIG['transTable']."..."; $sql = "ALTER TABLE ".$CC_CONFIG['transTable']." ADD COLUMN jobpid int"; camp_install_query($sql); +echo " * Fixing track numbers...\n"; +$sql = "SELECT id, object as track_num FROM ".$CC_CONFIG['mdataTable'] + ." WHERE predns='ls' AND predicate='track_num'"; +$rows = $CC_DBC->GetAll($sql); +foreach ($rows as $row) { + $newTrackNum = camp_parse_track_number($row["track_num"]); + if ($row["track_num"] != $newTrackNum) { + echo " * Converting '".$row["track_num"]."' --> '$newTrackNum'\n"; + $sql = "UPDATE ".$CC_CONFIG["mdataTable"] + ." SET object='$newTrackNum'" + ." WHERE id=".$row["id"]; + $CC_DBC->query($sql); + } +} + // Get MD5 values for all files echo " * Computing MD5 sums for all files (this may take a while)...\n"; $sql = "SELECT to_hex(gunid) as gunid, name FROM ".$CC_CONFIG['filesTable'] ." WHERE ftype='audioclip'";
##Title####Creator####Album####Track####Duration####Type####Title####Creator####Album####Track####Duration##{**}##Type##{**}