Autor | Zpráva | ||
---|---|---|---|
czechsasa Profil * |
#1 · Zasláno: 28. 1. 2014, 18:48:40
Chci se zeptat jestli někdo nevíte o nějaké třídě, která by po zadání vlastností uměla vytvářet seznamy položek a měla v sobě integrované stránkování, řazení a filtrování?
Díky za info |
||
Alphard Profil |
#2 · Zasláno: 29. 1. 2014, 21:07:01
Zajímavý nápad. Do učebnice PHP mám připravenou ukázku implementace FilterIteratoru.
// obecny vyhledavaci iterator class RecursiveSearchIterator extends RecursiveFilterIterator { protected $filters = []; public function __construct(RecursiveIterator $recursiveIter) { parent::__construct($recursiveIter); } public function addFilter(callable $filter) { $this->filters[] = $filter; } public function accept() { if ($this->hasChildren()) { return true; } foreach ($this->filters as $filter) { if (!$filter($this->current())) { return false; // mezi pravidly je AND } } return true; } public function getChildren() { $iterator = new self($this->getInnerIterator()->getChildren()); $iterator->filters = $this->filters; return $iterator; } } Vyhledávací pravidla lze zadávat anonymními funkcemi // filtrovaci funkce, v praxi by byly umisteny v nejake tovarnicce // predpoklada se, ze budou doplneny dle potreby $filterFilename = function($pattern) { return function($file) use ($pattern) { return (bool) preg_match($pattern, $file->getFilename()); }; }; $filterContent = function($pattern) { return function($file) use ($pattern) { return (bool) is_readable($file->getPathname()) && preg_match($pattern, file_get_contents($file->getPathname())); }; }; Na řazení mám taktéž připravený jeden iterátor class SortableDirectoryIterator implements IteratorAggregate { private $storage; public function __construct($path, $order = 1) { $this->storage = new ArrayObject(); $files = new DirectoryIterator($path); foreach ($files as $file) { $this->storage->append($file->getFileInfo()); } $this->storage->uasort( function ($a, $b) use ($order) { return $a->getSize() < $b->getSize() ? $order : -$order; } ); // podobně jako u SearchIteratoru lze třídu napsat obecně // a řadíci funkci doplnit externě // $this->storage->uasort($this->sort); } public function getIterator() { return $this->storage->getIterator(); } } Pro výpočet stránkování bych se inspiroval Paginatorem z Nette api.nette.org/2.1.0/source-Utils.Paginator.php.html#13-228. Kdyžtak si to dejte dohromady. |
||
Časová prodleva: 10 let
|
0