Autor Zpráva
czechsasa
Profil *
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: