Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /*
- * =============================================================================
- * 2010/02/03
- * $Id: SearchCriteria.php 2 2010-03-31 14:16:51Z whirlwind $
- * =============================================================================
- */
- class SearchCriteriaException extends Exception {}
- /**
- * Базовый фильтр отбора. Принимает в конструктор список атрибутов, для которых
- * разрешена установка фильтров и список атрибутов, для которых разрешена
- * сортировка.
- *
- * Поддерживает вызовы get{$ATTR} для получения списка значений фильтра (IN)
- * соотв. атрибута, get{$ATTR}Exclude для получения списка исключений фильтра
- * (NOT IN) соотв. атрибута. Эти геттеры фильтров возвращают массивы (даже если
- * там всего 1 элемент).
- *
- * Поддерживает вызовы get1{$ATTR} и get1{$ATTR}Exclude для получения
- * единственного (первого) значения фильтра.
- *
- * Поддерживает вызовы set{$ATTR} для установки значений фильтра (IN) соотв.
- * атрибута, set{$ATTR}Exclude для получения списка исключений для фильтра
- * (NOT IN) соотв. атрибута. Все сеттеры принимают единичное значение или
- * массив и возвращают ссылку на объект критериев, что бы можно было цепочкой
- * указывать фильтры, например
- *
- * $sc->setName(array('foo','bar'))
- * ->setAge(15)
- * ->setEnabled(true)
- * ->orderByName(true);
- *
- * Поддерживает вызовы orderBy{$ATTR} с параметром orderDesc (по-умолчанию
- * false) для установки порядка сортировки по одному атрибуту из второго списка,
- * переданного в конструктор.
- *
- * Выбрасывает исключения для запросов к неуказанным в конструкторе атрибутам.
- *
- * @author whirlwind
- *
- */
- class SearchCriteria
- {
- private $offset = 0;
- private $limit,$filters,$orders;
- private $order;
- private $orderDesc=false;
- private $filterValues = array();
- private $excludeValues = array();
- function getFilterVars() {
- return $this->filters;
- }
- function getOrderVars() {
- return $this->orders;
- }
- function __construct(array $filters, array $orders)
- {
- $this->filters = $filters;
- $this->orders = $orders;
- }
- function filter($name, $values)
- {
- if ( ! in_array($name, $this->filters) )
- {
- throw new SearchCriteriaException("No filter attribute: $name");
- }
- if ( ! is_array($values) )
- {
- $values = array($values);
- }
- $this->filterValues[$name] = $values;
- return $this;
- }
- function getFilter($name)
- {
- if ( ! in_array($name, $this->filters) )
- {
- throw new SearchCriteriaException("No filter attribute: $name");
- }
- return isset($this->filterValues[$name])
- ? $this->filterValues[$name] : array();
- }
- function getFilter1($name)
- {
- if ( ! in_array($name, $this->filters) )
- {
- throw new SearchCriteriaException("No filter attribute: $name");
- }
- return isset($this->filterValues[$name])
- ? $this->filterValues[$name][0] : null;
- }
- function excludeFilter($name, $values)
- {
- if ( ! in_array($name, $this->filters) )
- {
- throw new SearchCriteriaException("No filter attribute: $name");
- }
- if ( ! is_array($values) )
- {
- $values = array($values);
- }
- $this->excludeValues[$name] = $values;
- return $this;
- }
- function getExcludeFilter($name)
- {
- if ( ! in_array($name, $this->filters) )
- {
- throw new SearchCriteriaException("No filter attribute: $name");
- }
- return isset($this->excludeValues[$name])
- ? $this->excludeValues[$name] : array();
- }
- function getExcludeFilter1($name)
- {
- if ( ! in_array($name, $this->filters) )
- {
- throw new SearchCriteriaException("No filter attribute: $name");
- }
- return isset($this->excludeValues[$name])
- ? $this->excludeValues[$name][0] : null;
- }
- function orderBy($name, $desc=false)
- {
- if ( ! in_array($name, $this->orders) )
- {
- throw new SearchCriteriaException("No order attribute: $name");
- }
- $this->order = $name;
- $this->orderDesc = $desc;
- return $this;
- }
- function getOrderBy()
- {
- return $this->order;
- }
- function isOrderDesc()
- {
- return $this->orderDesc;
- }
- function limit($limit, $offset=0)
- {
- $this->limit = $limit;
- $this->offset = $offset;
- return $this;
- }
- function getLimit()
- {
- return $this->limit;
- }
- function getOffset()
- {
- return $this->offset;
- }
- /**
- *
- * @param $method
- * @param $args
- * @return unknown_type
- */
- function __call($method, array $args)
- {
- if ( substr($method, 0, 7) == 'orderBy' )
- {
- return $this->orderBy
- (substr($method, 7), sizeof($args) ? $args[0] : false);
- }
- else if ( substr($method, 0, 9) == 'isOrderBy' )
- {
- return $this->order == substr($method, 9) ? true : false;
- }
- else if ( substr($method, 0, 11) == 'get1Exclude' )
- {
- return $this->getExcludeFilter1(substr($method, 11));
- }
- if ( substr($method, 0, 4) == 'get1' )
- {
- return $this->getFilter1(substr($method, 4));
- }
- else if ( substr($method, 0, 10) == 'getExclude' )
- {
- return $this->getExcludeFilter(substr($method, 10));
- }
- else if ( substr($method, 0, 3) == 'get' )
- {
- return $this->getFilter(substr($method, 3));
- }
- else if ( substr($method, 0, 10) == 'setExclude' )
- {
- if ( sizeof($args) < 1 )
- {
- throw new SearchCriteriaException("Arguments required");
- }
- $attr = substr($method, 10);
- if ( is_array($args[0]) )
- {
- return $this->excludeFilter($attr, $args[0]);
- }
- else
- {
- return $this->excludeFilter($attr, $args);
- }
- }
- else if ( substr($method, 0, 3) == 'set' )
- {
- if ( sizeof($args) < 1 )
- {
- throw new SearchCriteriaException("Arguments required");
- }
- $attr = substr($method, 3);
- if ( is_array($args[0]) )
- {
- return $this->filter($attr, $args[0]);
- }
- else
- {
- return $this->filter($attr, $args);
- }
- }
- throw new SearchCriteriaException("Unknown method: $method");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement