Re: Patch for date searching
"Heath S. Hendrickson" <[email protected]>
| Newsgroups | gmane.comp.horde.ansel |
|---|---|
| Message-ID | <[email protected]> |
Chuck Hagenbuch wrote: > > Please resubmit this without the old diffs, so that it's just these > changes > against current (as of tonight) CVS, and also with an eye to the style > stuff I > mentioned. > Attached is a new diff against the current version of search.php in CVS. It should have the appropriate style as requested. I cleaned it up a bit and discovered the Horde_Form_Type of 'date' which made it a lot easier to handle the dates. I also inserted a couple of 'spacer' form variables to break it apart into logical groupings. I attempted to use the Horde_Form_Action_conditional_enable to make certain form fields visible/invisible based on the value of the select box for search type, but it wasn't working and I noticed that no other Horde application uses it, so I can only assume that either I'm not calling it correctly or it's not fully functional. I think I was calling it correctly as it was adding to the output, but the JavaScript code didn't quite look right. h -- ansel mailing list - Join the hunt: http://horde.org/bounties/#ansel Frequently Asked Questions: http://horde.org/faq/ To unsubscribe, mail: [email protected]
search.php.patch_dateSearch
(text/plain, 15.1 KB)
Index: search.php =================================================================== RCS file: /usr/local/horde/cvs/ansel/search.php,v retrieving revision 1.6 diff -u -r1.6 search.php --- search.php 22 May 2004 03:37:28 -0000 1.6 +++ search.php 23 May 2004 20:57:16 -0000 @@ -1,6 +1,6 @@ <?php /** - * $Horde: ansel/search.php,v 1.5 2004/05/18 15:25:28 chuck Exp $ + * $Horde: ansel/search.php,v 1.4 2004/05/18 11:37:25 jan Exp $ * * Copyright 2001-2004 Chuck Hagenbuch <[email protected]> * @@ -13,6 +13,7 @@ require_once ANSEL_BASE . '/lib/Exif.php'; require_once 'Horde/Form.php'; require_once 'Horde/Form/Renderer.php'; +require_once 'Horde/Form/Action.php'; require_once 'Horde/Template.php'; require_once 'Horde/Variables.php'; @@ -27,21 +28,24 @@ $this->setButtons(_("Search")); $this->addHidden('', 'actionID', 'text', false); - // Get known Exif fields. + // This gets the known Exif fields. $fields = Ansel_ImageData::getFields(); - // Add additional Ansel-specific fields. - $fields = array_merge($fields, - array('description' => array('description' => _("Description"), 'type' => 'text'), - 'date-uploaded' => array('description' => _("Date Uploaded"), 'type' => 'date'), - 'filename' => array('description' => _("Filename"), 'type' => 'text'), - 'gallery' => array('description' => _("Gallery Name"), 'type' => 'text'))); + // Now add on any others that we may want. + $fields += array('description' => array('description' => _("Description"), 'type' => 'text'), + 'date-uploaded' => array('description' => _("Date Uploaded"), 'type' => 'date'), + 'filename' => array('description' => _("Filename"), 'type' => 'text'), + 'gallery' => array('description' => _("Gallery Name"), 'type' => 'text')); - // Build the enum for the fields to search. + // reformat the array so that the Form Renderer likes it + // amd grab only the non-date based fields $searchFields = array(); foreach ($fields as $field => $data) { - $searchFields[$field] = $data['description']; + if ($data['type'] != 'date') { + $searchFields += array($field => $data['description']); + } } + asort($searchFields); $ops = array('=' => _("Is"), @@ -51,14 +55,42 @@ 'LIKE' => _("Contains"), 'NOT LIKE' => _("Does Not Contain")); - $this->addVariable(_("Field"), 'field', 'enum', false, false, null, array($searchFields)); - $this->addVariable(_("Operator"), 'op', 'enum', false, false, null, array($ops)); - $this->addVariable(_("Value"), 'value', 'text', false, false, null); - } + // add the select box to tell us what type of search to perform + $this->addVariable(_("Search Type"), 'searchType', 'enum', false, false, null, + array(array('TEXT' => _("Text Fields"), 'DATE' => _("Date Fields")))); + + $this->addVariable(null, null, 'spacer', false, false, null); + + // add the text search form items + $this->addVariable(_("Text Field"), 'textField', 'enum', false, false, null, array($searchFields)); + $this->addVariable(_("Text Operator"), 'textOp', 'enum', false, false, null, array($ops)); + $this->addVariable(_("Text Value"), 'textValue', 'text', false, false, null); + $this->addVariable(null, null, 'spacer', false, false, null); + // reformat the array so that the Form Renderer likes it + // and grab only the date based fields. + $searchFields = array(); + foreach ($fields as $field => $data) { + if ($data['type'] == 'date') { + $searchFields[$field] = $data['description']; + } + } + + asort($searchFields); + + $ops = array('BETWEEN' => _("Between"), + '>' => _("After"), + '<' => _("Before")); + + $this->addVariable(_("Date Field"), 'dateField', 'enum', false, false, null, array($searchFields)); + $this->addVariable(_("Date Operator"), 'dateOp', 'enum', false, false, null, array($ops)); + $this->addVariable(_("Start Date"), 'startDate', 'monthDayYear', false, false, null); + $this->addVariable(_("End Date"), 'endDate', 'monthDayYear', false, false, null); + } } $actionID = Util::getFormData('actionID'); +$searchType = Util::getFormData('searchType'); $vars = &Variables::getDefaultVariables(); $title = _("Search for Images"); require ANSEL_TEMPLATES . '/common-header.inc'; @@ -67,67 +99,143 @@ $vars->set('actionID', 'search'); $form = &Horde_Form::singleton('SearchForm', $vars, sprintf(_("Search for Images"), $title)); +// this should be automatically included by the setAction() calls above, but it's not, so let's include +// it here manually. +Horde::addScriptFile('form_helpers.js', 'horde'); + $renderer = &new Horde_Form_Renderer(); $form->renderActive($renderer, $vars, 'search.php', 'post', 'multipart/form-data'); // Now display any results, if a search was performed. switch ($actionID) { case 'search': - // Set up the search criteria to use. - $attr_name = Util::getFormData('field'); - $attr_op = Util::getFormData('op'); - $attr_value = Util::getFormData('value'); - - // Escape any SQL wildcards. - $attr_value = str_replace(array('%', '_'), array('\%', '\_'), $attr_value); - - // For the CONTAINS and DOES NOT CONTAIN cases, we add the SQL - // regex wildcards to the front and back of the value. - if ($attr_op == 'LIKE' || $attr_op == 'NOT LIKE') { - $attr_value = '%' . $attr_value . '%'; - } elseif ($attr_op == 'BEGIN') { - $attr_op = 'LIKE'; - $attr_value = $attr_value . '%'; - } elseif ($attr_op == 'END') { - $attr_op = 'LIKE'; - $attr_value = '%' . $attr_value; - } + switch ($searchType) { + case 'TEXT': + // Set up the search criteria to use. + $attr_name = Util::getFormData('textField'); + $attr_op = Util::getFormData('textOp'); + $attr_value = Util::getFormData('textValue'); + + // Escape any SQL wildcards. + $attr_value = str_replace(array('%', '_'), array('\%', '\_'), $attr_value); + + // For the CONTAINS and DOES NOT CONTAIN cases, we add the SQL + // regex wildcards to the front and back of the value. + if ($attr_op == 'LIKE' || $attr_op == 'NOT LIKE') { + $attr_value = '%' . $attr_value . '%'; + } elseif ($attr_op == 'BEGIN') { + $attr_op = 'LIKE'; + $attr_value = $attr_value . '%'; + } elseif ($attr_op == 'END') { + $attr_op = 'LIKE'; + $attr_value = '%' . $attr_value; + } + + $criteria['AND'] = array(array('field' => 'name', + 'op' => '=', + 'test' => $attr_name), + array('field' => 'value', + 'op' => $attr_op, + 'test' => $attr_value)); + + $imagelist = $ansel_shares->searchAllImages($criteria); + + // Now display the results. + Horde::addScriptFile('popup.js', 'horde'); + + $i = 0; + $images = array(); + foreach ($imagelist as $id => $name) { + $image = &$ansel_shares->getImage($name); + $galleryName = $image->get('gallery'); + $gallery = $ansel_shares->getShare($galleryName); + // check that the user has permission to view this image before displaying the link + if (is_a($gallery, 'PEAR_Error') || !$gallery->hasPermission(Auth::getAuth(), PERMS_READ)) { + continue; + } + + $img = Util::addParameter('image.php', array('gallery' => $image->get('gallery'), + 'image' => $image->getId(), + 'actionID' => 'imagethumb')); + $images[] = array('i' => ($i++ %2), + 'image' => Horde::link('', _("Thumbnail"), '', '', 'popup(\'' . Horde::applicationUrl($img) . '\',' . ($conf['thumbnail']['width'] + 10) . ', ' . ($conf['thumbnail']['height'] + 10) . '); return false;') . $image->get('filename') . '</a>', + 'gallery' => Horde::link(Horde::applicationUrl(Util::addParameter('view.php', array('gallery' => $galleryName, 'page' => '1')))) . $gallery->get('name') . '</a>', + 'description' => $image->get('description') ? htmlspecialchars($image->get('description')) : ' '); + } - $criteria['AND'] = array(array('field' => 'name', - 'op' => '=', - 'test' => $attr_name), - array('field' => 'value', - 'op' => $attr_op, - 'test' => $attr_value)); - - $imagelist = $ansel_shares->searchAllImages($criteria); - - // Now display the results. - Horde::addScriptFile('popup.js', 'horde'); - - $i = 0; - $images = array(); - foreach ($imagelist as $id => $name) { - $image = &$ansel_shares->getImage($name); - $galleryName = $image->get('gallery'); - $gallery = $ansel_shares->getShare($galleryName); - if (is_a($gallery, 'PEAR_Error') || !$gallery->hasPermission(Auth::getAuth(), PERMS_READ)) { - continue; - } - - $img = Util::addParameter('image.php', array('gallery' => $image->get('gallery'), - 'image' => $image->getId(), - 'actionID' => 'imagethumb')); - $images[] = array('i' => ($i++ %2), - 'image' => Horde::link('', _("Thumbnail"), '', '', 'popup(\'' . Horde::applicationUrl($img) . '\',' . ($conf['thumbnail']['width'] + 10) . ', ' . ($conf['thumbnail']['height'] + 10) . '); return false;') . $image->get('filename') . '</a>', - 'gallery' => Horde::link(Horde::applicationUrl(Util::addParameter('view.php', array('gallery' => $galleryName, 'page' => '1')))) . $gallery->get('name') . '</a>', - 'description' => $image->get('description') ? htmlspecialchars($image->get('description')) : ' '); + $template = &new Horde_Template(); + $template->set('images', $images); + $template->set('heading', count($images) == 1 ? _("Matched 1 image") : sprintf(_("Matched %s images"), count($images))); + echo $template->fetch(ANSEL_TEMPLATES . '/search/search.html'); + break; + + case 'DATE': + $attr_name = Util::getFormData('dateField'); + $attr_op = Util::getFormData('dateOp'); + $attr_startDate = Util::getFormData('startDate'); + $attr_endDate = Util::getFormData('endDate'); + + // convert the date form fields to a timestamp + $startDate = strtotime(sprintf("%s/%s/%s 00:00:00", $attr_startDate['month'], $attr_startDate['day'], $attr_startDate['year'])); + $endDate = strtotime(sprintf("%s/%s/%s 00:00:00", $attr_endDate['month'], $attr_endDate['day'], $attr_endDate['year'])); + + // set up the proper search criteria + $criteria = array(); + if ($attr_op == "BETWEEN") { + $criteria['AND'] = array(array('AND' => array(array('field' => 'name', + 'op' => '=', + 'test' => $attr_name), + array('field' => 'value', + 'op' => '>', + 'test' => $startDate))), + array('AND' => array(array('field' => 'name', + 'op' => '=', + 'test' => $attr_name), + array('field' => 'value', + 'op' => '<', + 'test' => $endDate)))); + } else { + $criteria['AND'] = array(array('field' => 'name', + 'op' => '=', + 'test' => $attr_name), + array('field' => 'value', + 'op' => $attr_op, + 'test' => $startDate)); + } + + // actually do the search + $imagelist = $ansel_shares->searchAllImages($criteria); + + // Now display the results. + Horde::addScriptFile('popup.js', 'horde'); + + $i = 0; + $images = array(); + foreach ($imagelist as $id => $name) { + $image = &$ansel_shares->getImage($name); + $galleryName = $image->get('gallery'); + $gallery = $ansel_shares->getShare($galleryName); + // check that the user has permission to view this image before displaying the link + if (is_a($gallery, 'PEAR_Error') || !$gallery->hasPermission(Auth::getAuth(), PERMS_READ)) { + continue; + } + + $img = Util::addParameter('image.php', array('gallery' => $image->get('gallery'), + 'image' => $image->getId(), + 'actionID' => 'imagethumb')); + $images[] = array('i' => ($i++ %2), + 'image' => Horde::link('', _("Thumbnail"), '', '', 'popup(\'' . Horde::applicationUrl($img) . '\',' . ($conf['thumbnail']['width'] + 10) . ', ' . ($conf['thumbnail']['height'] + 10) . '); return false;') . $image->get('filename') . '</a>', + 'gallery' => Horde::link(Horde::applicationUrl(Util::addParameter('view.php', array('gallery' => $galleryName, 'page' => '1')))) . $gallery->get('name') . '</a>', + 'description' => $image->get('description') ? htmlspecialchars($image->get('description')) : ' '); + } + + $template = &new Horde_Template(); + $template->set('images', $images); + $template->set('heading', count($images) == 1 ? _("Matched 1 image") : sprintf(_("Matched %s images"), count($images))); + echo $template->fetch(ANSEL_TEMPLATES . '/search/search.html'); + break; } - $template = &new Horde_Template(); - $template->set('images', $images); - $template->set('heading', count($images) == 1 ? _("Matched 1 image") : sprintf(_("Matched %s images"), count($images))); - echo $template->fetch(ANSEL_TEMPLATES . '/search/search.html'); } require $registry->getParam('templates', 'horde') . '/common-footer.inc';