| 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: 13 let
|
|||
0