*/ /** * Required classes */ require_once(dirname(__FILE__) . '/classes/SearchUtilities.class'); /** * @package Search * @subpackage UserInterface */ class SearchScanController extends GalleryController { /** * @see GalleryController::handleRequest */ function handleRequest($form) { global $gallery; $results = array(); if (isset($form['action']['slideshow'])) { if (isset($form['searchCriteria'])) { $form['searchCriteria'] = trim($form['searchCriteria']); } list ($ret, $slideshow) = GalleryCoreApi::newFactoryInstance('SlideshowInterface_1_0'); if ($ret->isError() || !isset($slideshow)) { return array($ret->wrap(__FILE__, __LINE__), null); } GalleryCoreApi::requireOnce(dirname(__FILE__) . '/classes/GallerySearchInterface_1_0.class'); list ($ret, $ids) = GalleryCoreApi::getAllFactoryImplementationIds('GallerySearchInterface_1_0'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } foreach ($ids as $id => $className) { list ($ret, $searchInstances[$id]) = GalleryCoreApi::newFactoryInstance('GallerySearchInterface_1_0', $className); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } $itemIds = array(); foreach ($searchInstances as $id => $instance) { if (isset($form['options'][$id])) { list ($ret, $resultSet) = $instance->search($form['options'][$id], SearchUtilities::sanitizeSearchCriteria($form['searchCriteria'])); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } foreach ($resultSet['results'] as $result) { if (isset($result['itemId'])) { $itemIds[$result['itemId']] = 1; } } } } $itemIds = array_keys($itemIds); list ($ret, $results['delegate']) = $slideshow->getLinkData($itemIds); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } else if (isset($form['action']['showAll'])) { $results['delegate']['view'] = 'search:SearchShowAll'; } else { $results['delegate']['view'] = 'search:SearchScan'; } $results['status'] = array(); $results['error'] = array(); return array(GalleryStatus::success(), $results); } } /** * @package Search * @subpackage UserInterface */ class SearchScanView extends GalleryView { /** * @see GalleryView::loadTemplate */ function loadTemplate(&$template, &$form) { global $gallery; /* TODO: Parameterize this */ $scanSize = 3; /* Find all the modules that support the Search interface */ GalleryCoreApi::requireOnce(dirname(__FILE__) . '/classes/GallerySearchInterface_1_0.class'); list ($ret, $ids) = GalleryCoreApi::getAllFactoryImplementationIds('GallerySearchInterface_1_0'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } foreach ($ids as $id => $className) { list ($ret, $searchInstances[$id]) = GalleryCoreApi::newFactoryInstance('GallerySearchInterface_1_0', $className); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } /* Load the search info for each module */ foreach ($searchInstances as $id => $instance) { list ($ret, $modules[$id]) = $instance->getSearchModuleInfo(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } $items = array(); $thumbnails = array(); $searchResults = array(); $searchResultThumbnails = array(); if ($form['formName'] == 'SearchScan' || $form['formName'] == 'SearchShowAll' || $form['formName'] == 'SearchSystemContent') { if (isset($form['searchCriteria'])) { $form['searchCriteria'] = trim($form['searchCriteria']); } if (empty($form['searchCriteria'])) { $form['error']['searchCriteria']['missing'] = 1; } else { if (isset($form['useDefaultSettings']) || $form['formName'] == 'SearchShowAll') { foreach ($searchInstances as $id => $instance) { $form['options'][$id] = $modules[$id]['options']; } } /* Execute a "scan" search */ foreach ($searchInstances as $id => $instance) { if (isset($form['options'][$id])) { list ($ret, $searchResults[$id]) = $instance->search($form['options'][$id], SearchUtilities::sanitizeSearchCriteria($form['searchCriteria']), 0, $scanSize); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } } } /* Pull out all the item ids and save them */ $itemIds = array(); foreach ($searchResults as $id => $resultSet) { foreach ($resultSet['results'] as $result) { if (isset($result['itemId'])) { $itemIds[$result['itemId']] = 1; } } } $itemIds = array_keys($itemIds); $thumbnails = array(); if (!empty($itemIds)) { /* Fetch items */ list ($ret, $itemList) = GalleryCoreApi::loadEntitiesById($itemIds); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } foreach ($itemList as $item) { $items[$item->getId()] = $item->getMemberData(); } /* Fetch thumbnails */ list ($ret, $thumbnailList) = GalleryCoreApi::fetchThumbnailsByItemIds($itemIds); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } foreach ($thumbnailList as $thumbnail) { $thumbnails[$thumbnail->getParentId()] = $thumbnail->getMemberData(); } } } else { $form['searchCriteria'] = ''; foreach ($searchInstances as $id => $instance) { $form['options'][$id] = $modules[$id]['options']; } } list ($ret, $ids) = GalleryCoreApi::getAllFactoryImplementationIds('SlideshowInterface_1_0'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $slideshowAvailable = !empty($ids); /* Render the HTML body */ $SearchScan = array(); $SearchScan['modules'] = $modules; $SearchScan['searchResults'] = $searchResults; $SearchScan['thumbnails'] = $thumbnails; $SearchScan['items'] = $items; $SearchScan['controller'] = 'search:SearchScan'; $SearchScan['slideshowAvailable'] = $slideshowAvailable; $template->setVariable('SearchScan', $SearchScan); list ($ret, $navigationView) = GalleryView::loadView('core:Navigation'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $ignored) = $navigationView->loadTemplate($template, $form); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $module) = GalleryCoreApi::loadPlugin('module', 'search'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $template->title($module->translate('Gallery Search')); return array(GalleryStatus::success(), array('body' => 'modules/search/templates/SearchScan.tpl')); } } ?>