Advertisement
Guest User

SearchCriteria

a guest
Oct 4th, 2010
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.97 KB | None | 0 0
  1. <?php
  2. /*
  3.  * =============================================================================
  4.  * 2010/02/03
  5.  * $Id: SearchCriteria.php 2 2010-03-31 14:16:51Z whirlwind $
  6.  * =============================================================================
  7.  */
  8.  
  9. class SearchCriteriaException extends Exception {}
  10.  
  11. /**
  12.  * Базовый фильтр отбора. Принимает в конструктор список атрибутов, для которых
  13.  * разрешена установка фильтров и список атрибутов, для которых разрешена
  14.  * сортировка.
  15.  *
  16.  * Поддерживает вызовы get{$ATTR} для получения списка значений фильтра (IN)
  17.  * соотв. атрибута, get{$ATTR}Exclude для получения списка исключений фильтра
  18.  * (NOT IN) соотв. атрибута. Эти геттеры фильтров возвращают массивы (даже если
  19.  * там всего 1 элемент).
  20.  *
  21.  * Поддерживает вызовы get1{$ATTR} и get1{$ATTR}Exclude для получения
  22.  * единственного (первого) значения фильтра.
  23.  *
  24.  * Поддерживает вызовы set{$ATTR} для установки значений фильтра (IN) соотв.
  25.  * атрибута, set{$ATTR}Exclude для получения списка исключений для фильтра
  26.  * (NOT IN) соотв. атрибута. Все сеттеры принимают единичное значение или
  27.  * массив и возвращают ссылку на объект критериев, что бы можно было цепочкой
  28.  * указывать фильтры, например
  29.  *
  30.  *  $sc->setName(array('foo','bar'))
  31.  *      ->setAge(15)
  32.  *      ->setEnabled(true)
  33.  *      ->orderByName(true);
  34.  *      
  35.  * Поддерживает вызовы orderBy{$ATTR} с параметром orderDesc (по-умолчанию
  36.  * false) для установки порядка сортировки по одному атрибуту из второго списка,
  37.  * переданного в конструктор.
  38.  *
  39.  * Выбрасывает исключения для запросов к неуказанным в конструкторе атрибутам.
  40.  *
  41.  * @author whirlwind
  42.  *
  43.  */
  44. class SearchCriteria
  45. {
  46.     private $offset = 0;
  47.     private $limit,$filters,$orders;
  48.     private $order;
  49.     private $orderDesc=false;
  50.     private $filterValues = array();
  51.     private $excludeValues = array();
  52.    
  53.     function getFilterVars() {
  54.         return $this->filters;
  55.     }
  56.    
  57.     function getOrderVars() {
  58.         return $this->orders;
  59.     }
  60.    
  61.     function __construct(array $filters, array $orders)
  62.     {
  63.         $this->filters = $filters;
  64.         $this->orders = $orders;
  65.     }
  66.    
  67.     function filter($name, $values)
  68.     {
  69.         if ( ! in_array($name, $this->filters) )
  70.         {
  71.             throw new SearchCriteriaException("No filter attribute: $name");
  72.         }
  73.         if ( ! is_array($values) )
  74.         {
  75.             $values = array($values);
  76.         }
  77.         $this->filterValues[$name] = $values;
  78.         return $this;
  79.     }
  80.    
  81.     function getFilter($name)
  82.     {
  83.         if ( ! in_array($name, $this->filters) )
  84.         {
  85.             throw new SearchCriteriaException("No filter attribute: $name");
  86.         }
  87.         return isset($this->filterValues[$name])
  88.             ? $this->filterValues[$name] : array();
  89.     }
  90.    
  91.     function getFilter1($name)
  92.     {
  93.         if ( ! in_array($name, $this->filters) )
  94.         {
  95.             throw new SearchCriteriaException("No filter attribute: $name");
  96.         }
  97.         return isset($this->filterValues[$name])
  98.             ? $this->filterValues[$name][0] : null;
  99.     }
  100.    
  101.     function excludeFilter($name, $values)
  102.     {
  103.         if ( ! in_array($name, $this->filters) )
  104.         {
  105.             throw new SearchCriteriaException("No filter attribute: $name");
  106.         }
  107.         if ( ! is_array($values) )
  108.         {
  109.             $values = array($values);
  110.         }
  111.         $this->excludeValues[$name] = $values;
  112.         return $this;
  113.     }
  114.    
  115.     function getExcludeFilter($name)
  116.     {
  117.         if ( ! in_array($name, $this->filters) )
  118.         {
  119.             throw new SearchCriteriaException("No filter attribute: $name");
  120.         }
  121.         return isset($this->excludeValues[$name])
  122.             ? $this->excludeValues[$name] : array();
  123.     }
  124.    
  125.     function getExcludeFilter1($name)
  126.     {
  127.         if ( ! in_array($name, $this->filters) )
  128.         {
  129.             throw new SearchCriteriaException("No filter attribute: $name");
  130.         }
  131.         return isset($this->excludeValues[$name])
  132.             ? $this->excludeValues[$name][0] : null;
  133.     }
  134.    
  135.     function orderBy($name, $desc=false)
  136.     {
  137.         if ( ! in_array($name, $this->orders) )
  138.         {
  139.             throw new SearchCriteriaException("No order attribute: $name");
  140.         }
  141.         $this->order = $name;
  142.         $this->orderDesc = $desc;
  143.         return $this;
  144.     }
  145.    
  146.     function getOrderBy()
  147.     {
  148.         return $this->order;
  149.     }
  150.    
  151.     function isOrderDesc()
  152.     {
  153.         return $this->orderDesc;
  154.     }
  155.    
  156.     function limit($limit, $offset=0)
  157.     {
  158.         $this->limit = $limit;
  159.         $this->offset = $offset;
  160.         return $this;
  161.     }
  162.    
  163.     function getLimit()
  164.     {
  165.         return $this->limit;
  166.     }
  167.    
  168.     function getOffset()
  169.     {
  170.         return $this->offset;
  171.     }
  172.    
  173.     /**
  174.      *
  175.      * @param $method
  176.      * @param $args
  177.      * @return unknown_type
  178.      */
  179.     function __call($method, array $args)
  180.     {
  181.         if ( substr($method, 0, 7) == 'orderBy' )
  182.         {
  183.             return $this->orderBy
  184.                 (substr($method, 7), sizeof($args) ? $args[0] : false);
  185.         }
  186.         else if ( substr($method, 0, 9) == 'isOrderBy' )
  187.         {
  188.             return $this->order == substr($method, 9) ? true : false;
  189.         }
  190.         else if ( substr($method, 0, 11) == 'get1Exclude' )
  191.         {
  192.             return $this->getExcludeFilter1(substr($method, 11));
  193.         }
  194.         if ( substr($method, 0, 4) == 'get1' )
  195.         {
  196.             return $this->getFilter1(substr($method, 4));
  197.         }
  198.         else if ( substr($method, 0, 10) == 'getExclude' )
  199.         {
  200.             return $this->getExcludeFilter(substr($method, 10));
  201.         }
  202.         else if ( substr($method, 0, 3) == 'get' )
  203.         {
  204.             return $this->getFilter(substr($method, 3));
  205.         }
  206.         else if ( substr($method, 0, 10) == 'setExclude' )
  207.         {
  208.             if ( sizeof($args) < 1 )
  209.             {
  210.                 throw new SearchCriteriaException("Arguments required");
  211.             }
  212.             $attr = substr($method, 10);
  213.             if ( is_array($args[0]) )
  214.             {
  215.                 return $this->excludeFilter($attr, $args[0]);
  216.             }
  217.             else
  218.             {
  219.                 return $this->excludeFilter($attr, $args);
  220.             }
  221.         }
  222.         else if ( substr($method, 0, 3) == 'set' )
  223.         {
  224.             if ( sizeof($args) < 1 )
  225.             {
  226.                 throw new SearchCriteriaException("Arguments required");
  227.             }
  228.             $attr = substr($method, 3);
  229.             if ( is_array($args[0]) )
  230.             {
  231.                 return $this->filter($attr, $args[0]);
  232.             }
  233.             else
  234.             {
  235.                 return $this->filter($attr, $args);
  236.             }
  237.         }
  238.         throw new SearchCriteriaException("Unknown method: $method");
  239.     }
  240.    
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement