CakePHP – Tree behaviour

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);

Dodaj komentarz