Obsługuje złożone struktury hierarchiczne. Zapewnia wiele metod dostępu, prezentacji, generowania list, ścieżek i manipulacji elementami.
Kolumny wymagane w tabeli
parent_id lft rght level - przechowuje poziom (opcjonalna) model - lub country własna kolumna dla opcji skope (opcjonalna)
Podstawowa konfiguracja – wymagane kolumny (parent_id, lft, rght).
class CategoriesTable extends Table { public function initialize(array $config) { $this->addBehavior('Tree'); } }
Zmiana ustawień domyślnych
public function initialize(array $config) { $this->addBehavior('Tree' [ 'parent' => 'parent_id', 'left' => 'lft', 'right' => 'rght', 'level' => 'level', 'scope' => ['model' => 'products'] ]); }
Inicjalizacja struktury jeśli były w tabeli jakieś rekordy
$categories = $this->Categories;
$categories->recover();
$category = $categories->get(1);
echo $categories->childCount($category);
Płaska lista potomków
$descendants = $categories->find('children', [ 'for' => 1]);
Zagnieżdżona lista potomków
$children = $categories ->find('children' , [ 'for' => 1]) ->find('threaded' ) ->toArray(); foreach ($children as $child) { echo "{$child->name} has " . count($child->children) . " direct children"; }
Lista opcji
$list = $categories->find('treeList' , [ 'keyPath' => 'url', 'valuePath' => 'id', 'spacer' => ' ' ] ); // domyślnie spacer (głębokość zagnieżdżenia) jest podkreśleniem // W szablonie (template): echo $this->Form->control('categories', ['options' => $list]);
Breadcrumbs – ścieżka do root
$crumbs = $categories->find('path' , ['for' => 5]); foreach ($crumbs as $crumb) { echo $crumb->name . ' > '; }
Zmiana kolejności
$node = $categories->get(5); // Przesunięcie w górę o 1 pozycję $categories->moveUp($node); // Przeniesienie na górę w zakresie tego poziomu $categories->moveUp($node, true); // Przeniesienie na sam dół w ramach poziomu $categories->moveDown($node, true);
Przypisywanie podkategorii
$aCategory = $categoriesTable->get(10); $aCategory->parent_id = 5; $aCategory->parent_id = null; // Ustawi jako nadrzędną $categoriesTable->save($aCategory);
Usuwanie kategorii – bez metody removeFromTree usunie kategorię i wszystkie jej dzieci. Jeśli przed usunięciem użyje się removeFromTree usunie tylko wskazaną kategorię – dzieci odziedziczy kategoria nadrzędna
$aCategory = $categoriesTable->get(10); $categoriesTable->removeFromTree($aCategory); $categoriesTable->delete($aCategory);