queue_by_priority = new PriorityQueue (); $this->queue_by_degradation = new PriorityQueue (); foreach ($this->enumerateCriteria () as $criterion) { $this->queue_by_priority->insert ($criterion, $criterion->getParamParsingPriority ()); $this->queue_by_degradation->insert ($criterion, $criterion->getDegradationPriority ()); } } abstract function run ($page); protected function processUserInput () { $request = new ArrayObject ($this->getInputParams ()); $http_params = array (); foreach ($this->getCriteria () as $criterion) { $criterion->acceptUserInput ($request); if ($params = $criterion->getHttpParams ()) { $http_params = $http_params + $params; } } return $http_params; } protected function getCriteria () { return $this->queue_by_priority; } protected function isDegradeable () { foreach ($this->getCriteria () as $criterion) { if ($criterion->isDegradeable ()) { return true; } } } protected function degrade () { foreach ($this->queue_by_degradation as $criterion) { if ($criterion->isDegradeable ()) { $this->setFuzzy (true); $criterion->degrade (); return; } } } protected function enumerateCriteria () { static $cache; if (! isset ($cache)) { $result = array (); $cretirion_directory = dirname (__FILE__) . '/SearchCriterion'; $php_extension = '/\.php$/'; foreach (new RegexIterator (new DirectoryIterator ($cretirion_directory), $php_extension) as $item) { if ($item->isFile ()) { $before = get_declared_classes (); { require_once $item->getPathname (); } } } foreach (get_declared_classes () as $class_name) { if (preg_match ('/SearchCriterion_/', $class_name)) { $criterion = new $class_name (); $result [] = $criterion; } } $cache = $result; } return $cache; } public function createRequestByCriteria () { $request = new Sql_Template (); foreach ($this->getCriteria () as $criterion) { $criterion->attachSql ($request); } return $request; } function getTemplateVariables () { $result = array (); foreach ($this->getCriteria () as $criterion) { $result = $result + $criterion->getTemplateVariables (); } foreach ($result as $key => $value) { if (empty ($value)) { unset ($result [$key]); } } return $result; } function getMacros () { $result = array (); foreach ($this->getCriteria () as $criterion) { if ($new_macros = $criterion->getMacros ()) { $result = array_merge ($result, $new_macros); } } return $result; } private function filterSearchParam ($value) { if (!is_scalar ($value)) { $value = ''; } settype ($value, 'string'); $result = trim ($value); if (strlen ($value)) { return $value; } } function setFuzzy ($fuzzy) { $this->fuzzy = $fuzzy; } function getFuzzy () { if ($this->fuzzy) { return true; } foreach ($this->getCriteria () as $criterion) { if ($criterion->getFuzzy ()) { return true; } } } function addInputParam ($name, $value) { $this->_input_params [$name] = $value; } function getInputParams () { return $this->_input_params; } function setInputParams ($params) { $this->_input_params = $params; } function setView ($view) { $this->view = $view; } function getView () { return $this->view; } }