CakePHP | Problem z TreeBehavior podczas edycji

Podczas pracy z CakePHP, niezależnie od wersji frameworka, już od wersji 1.3 aż do wersji 2.4 występuje często problem z edycją wpisów, gdy używany jest TreeBahavior.

Do czego służy TreeBehavior? Jest to zachowanie się modelu, przypisywane do $actsAs w modelu. Dzięki temu można budować strukturę drzewa, zagnieżdżając wpisy, czyli tworząc kategorie, podkategorie itd. Korzystając z Tree można także dowolnie sterować kolejnością wpisów. Czyli jednym słowem Tree jest gotowym komponentem, który wyręcza programistę w wielu kwestiach.

Tree udostępnia szereg gotowych funkcji do zmiany pozycji (przemieszczania wpisów), czy też ewentualnej naprawy pozycji - ponowne przeliczenie pól: lft, rght czy parent_id.

Problem pojawia się dopiero podczas edycji wpisu. Często po udanym zapisie elementy zmieniają swoje pozycje. Jest to bardzo kłopotliwe szczególnie gdy mamy większą liczbę wpisów i trzeba potem ręcznie przemieszczać 100 lub więcej wpisów.

Rozwiązanie kłopotu zamieszczam poniżej.

function beforeSave($options) {    
if (empty($this->data[$this->alias]['parent_id']) ) {
         
$this->Behaviors->disable('Tree');
    
}
    
return true;
}
 
Powyższy kod należy dodać do wybranego modelu, w którym korzystamy z TreeBahavior lub też do AppModel.php - wtedy problem będzie rozwiązany w całej aplikacji, niezależnie od modułu w którym będziemy pracować. Jak działa powyższy kod w praktyce - jeżeli w danych przesłanych do zapisu występuje pole parent_id (jest używane zawsze w TreeBahavior) to na czas zapisu zostaje wyłączone Tree, dzięki czemu nie wystąpi zmiana pozycji elementów w bazie danych.

Kontakt