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; })); } }
function __construct(DibiFluent $fluent, array $filteringRules = array(), array $sortingColumns = array()) { parent::__construct($filteringRules, $sortingColumns); $this->fluent = $fluent; }