Example #1
0
 function __construct(array &$data, array $filteringRules = array(), array $sortingColumns = array())
 {
     parent::__construct($filteringRules, $sortingColumns);
     $this->_data =& $data;
     $count =& $this->_count;
     // Filtering and counting
     $this->_iterator = new Nette\Iterators\Filter(new \ArrayIterator($data), function ($rowData) use($filteringRules, &$count) {
         foreach ($filteringRules as $key => $rule) {
             $keywords = $rule['regexp'] ? array($rule['keywords']) : preg_split('/\\s+/', trim($rule['keywords']));
             $columns = isset($rule['columns']) ? $rule['columns'] : array($key);
             foreach ($keywords as $keyword) {
                 $found = FALSE;
                 foreach ($columns as $col) {
                     if (preg_match($rule['regexp'] ? $keyword : '/' . preg_quote($keyword, '/') . '/', $rowData[$col])) {
                         $found = TRUE;
                         break;
                     }
                 }
                 if (!$found) {
                     return FALSE;
                 }
             }
         }
         // Count and allow
         $count++;
         return TRUE;
     });
     // Sorting
     if (count($sortingColumns)) {
         // @todo Not optimal
         // @note Values are compared as strings (ie. 12 < 2)
         $this->_iterator = new \IteratorIterator(new vBuilder\Utils\SortingIterator($this->_iterator, function ($a, $b) use($sortingColumns) {
             foreach ($sortingColumns as $key => $direction) {
                 if (!isset($a[$key])) {
                     return $direction == 'asc' ? 1 : -1;
                 }
                 if (!isset($b[$key])) {
                     return $direction == 'asc' ? -1 : 1;
                 }
                 if ($a[$key] > $b[$key]) {
                     return $direction == 'asc' ? 1 : -1;
                 } elseif ($a[$key] < $b[$key]) {
                     return $direction == 'asc' ? -1 : 1;
                 }
             }
             return 0;
         }));
     }
 }
Example #2
0
 function __construct(DibiFluent $fluent, array $filteringRules = array(), array $sortingColumns = array())
 {
     parent::__construct($filteringRules, $sortingColumns);
     $this->fluent = $fluent;
 }