Page tree
Skip to end of metadata
Go to start of metadata

Aby bylo možné ve Vivo backendu administrovat velké množství dokumentů (>100K) byla upravena implementace třídy Vivo\IO\LocalFileSystem tak, aby metoda Vivo\IO\LocalFileSystem::scan() vracela místo pole instanci iterátoru. Výhoda tohoto přístupu je, že lze použít stránkovaný přístup. Nevýhodou je, že výsledná kolekce dokumentů vrácená solrem není setříděná. Setřídit lze pouze dokumenty v rámci stránky. Pokud je potřeba, aby dokumenty byly seřazeny (např. abecedně) i v rámci všech stránek (toto je použito např. při zobrazení stromu dokumentů v administraci), je potřeba použít tzv. storageCallback (viz. dále).

Adekvátně byla upravena i implementace Vivo\CMS\Repository::getChildren(), jakožto konzument výstupu metody Vivo\IO\LocalFileSystem::scan(). Během volání metody Vivo\CMS\Repository::getChildren() se "odpalují" následující události:

  • CHILDREN_COLLECTION_AFTER_LOAD_FROM_STORAGE
  • <PAGINATOR_ID>::CHILDREN_COLLECTION_AFTER_LOAD_FROM_STORAGE
  • CHILDREN_COLLECTION_BEFORE_PAGINATION
  • <PAGINATOR_ID>::CHILDREN_COLLECTION_BEFORE_PAGINATION

V rámci těchto událostí je možné pozměnit výslednou kolekci vrácených dokumentů.

Ukázka použití modifikace kolekce dokumentů pomocí události CHILDREN_COLLECTION_BEFORE_PAGINATION:

// in Vivo\CMS\UI\Manager\Explorer\Tree
public function init()
{
   $cms = $this->cms;
   $eventName = self::PAGINATOR_ID_PREFIX . Paginator::ID_SEPARATOR . Repository::CHILDREN_COLLECTION_BEFORE_PAGINATION;
   $this->event->register($eventName, function(&$data) use ($cms) {
      $data->collection = new \CallbackFilterIterator($data->collection, function($current) use ($cms) {
         return $cms->uxProfile->check('url', $current->getURL());
      });
   });
}

V rámci obsluhy události dochází k redukci kolekce dokumentů podle nastavení v uxProfile (Beginnner, Advanced, Expert).

Přidané argumenty metody getChildren():

- $paginatorId
- $storageCallback - funkce, která pokud je poskytnuta, se použije místo volání metody scan(). Volá se s argumenty ($path, $sorting)

Storage callback se používá například při zobrazení stromu dokumentů, kdy je potřeba, aby byly dokumenty poskytovány solrem.

PaginatorToolkitMixin

PaginatorToolkitMixin je trait, který poskytuje metody pro práci s paginátory.

// public methods of Vivo\PaginatorToolkitMixin
public function initPaginator($paginatorId = null, $pageSize = 50);
public function lookupPaginator($paginatorId);
public function setNextPage($paginatorId);
public function getPaginatorFactory();
public function getPaginatorRegistry();
public function createPaginatorId($id, $prefix = null);

Pro práci s paginátory slouží ještě dvě třídy:

  • Vivo\Util\PaginatorFactory - factory třída pro vytváření paginátorů
  • Vivo\Util\PaginatorRegistry - třída, která se stará o persistenci paginátorů napříč requesty (ukládání do session)

Instance těchto tříd jsou k dispozici jako aplikační objekty paginatorFactory, resp. paginatorRegistry. Používání traity PaginatorToolkitMixin od přímého používání výše zmíněných aplikačních objektů odstiňuje.

Práce s paginátorem

Následují ukázky práce s paginátorem v komponentě Vivo\CMS\UI\Manager\Explorer\Tree:

// in Vivo\CMS\UI\Manager\Explorer\Tree::view()
use PaginatorToolkitMixin; // use trait Vivo\PaginatorToolkitMixin
// ...
$paginatorId = $this->createPaginatorId($parent->getPath(), self::PAGINATOR_ID_PREFIX);
$this->initPaginator($paginatorId, self::$MAX_SUBTREE_ITEMS); // self::$MAX_SUBTREE_ITEMS contains paginator page size
// paginator with $paginatorId is already created
$children = $this->repository->getChildren(
   $path,
   false,
   false,
   true,
   $paginatorId,
   $this->getTreeCallback()
);

V $children je obsažena první stránka dokumentů. Načtení další stránky probíhá následovně:

// in Vivo\CMS\UI\Manager\Explorer\Tree::viewMoreSubtreeItems()
$this->setNextPage($paginatorId); // increase page number

$children = $this->repository->getChildren(
   $path,
   false,
   false,
   true,
   $paginatorId,
   $this->getTreeCallback()
);



  • No labels