Verwirrende Signatur von Tree generatetreelist()
Das Behaviour Tree von CakePHP ist schon recht nützlich, aber mitunter ist CakePHP nicht sooo gut dokumentiert. Die Doku sagt die Methode generatetreelist() hätte folgende Signatur:
$this->Category->generatetreelist ( &$model, $conditions=null, $keyPath=null, $valuePath=null, $spacer= '_', $recursive=null );
Ruft man die Funktion aber so wie inder Doku beschrieben auf:
$this->Category->generatetreelist( null, null, null, '--' );
erhält man nicht das gewünschte Ergebnis. Das Problem liegt im ersten Parameter. Diese ist für den Aufruf irrelevant und muss ignogiert werden. Die Methode muss so aufgerufen werden als hätte Sie diese Signatur:
$this->Category->generatetreelist ( $conditions=null, $keyPath=null, $valuePath=null, $spacer= '_', $recursive=null );
Wobei der erste Parameter also schon das Conditions Array ist.
Wenig intuitiv mutet auch die Auswahl der Felder für key und value an:
$this->Category->generatetreelist( null, '{n}.Category.email', '{n}.Category.title', '-' );
Ja, richtig das Konstukt {n}. muss drin sein. Ein Blick in den Quelltext der Methode macht dass deutlich:
function generatetreelist(&$Model, $conditions = null, $keyPath = null, $valuePath = null, $spacer = '_', $recursive = null) { $overrideRecursive = $recursive; extract($this->settings[$Model->alias]); if (!is_null($overrideRecursive)) { $recursive = $overrideRecursive; } if ($keyPath == null && $valuePath == null && $Model->hasField($Model->displayField)) { $fields = array($Model->primaryKey, $Model->displayField, $left, $right); } else { $fields = null; } if ($keyPath == null) { $keyPath = '{n}.' . $Model->alias . '.' . $Model->primaryKey; } if ($valuePath == null) { $valuePath = array('{0}{1}', '{n}.tree_prefix', '{n}.' . $Model->alias . '.' . $Model->displayField); } elseif (is_string($valuePath)) { $valuePath = array('{0}{1}', '{n}.tree_prefix', $valuePath); } else { $valuePath[0] = '{' . (count($valuePath) - 1) . '}' . $valuePath[0]; $valuePath[] = '{n}.tree_prefix'; } $order = $Model->alias . '.' . $left . ' asc'; $results = $Model->find('all', compact('conditions', 'fields', 'order', 'recursive')); $stack = array(); foreach ($results as $i => $result) { while ($stack && ($stack[count($stack) - 1] < $result[$Model->alias][$right])) { array_pop($stack); } $results[$i]['tree_prefix'] = str_repeat($spacer,count($stack)); $stack[] = $result[$Model->alias][$right]; } if (empty($results)) { return array(); } return Set::combine($results, $keyPath, $valuePath); }
In diesem Zusammenhang:
- CakePHP – Pagination bei einer HABTM Beziehung Das Handbuch ist nicht allzu Gesprächig was dieses Thema angeht....
- CakePHP – Einfluss auf die Paginator URL nehmen In den Views mit Hilfe der Methoden prev(), next() und...
- Fortgeschrittene Anwendung der Tree Komponente Das Tree Behaviour von CakePHP nutzt die Modified Preorder Tree...
Wow – Danke!!! Du hast mein Leben gerettet
Im Ernst: Warum steht sowas nicht in der offiziellen Doku????
Jetzt klappt’s!
Danke!!!!!
Das hat mich auch einiges an Zeit gekostet
Ursache für diese unscharfe Doku ist sicher ein Tool das den Source ausliest und daraus die Docs baut.
Thanks for this – very useful. I’ve tried submitting a change to the 1.2 documentation. http://book.cakephp.org/view/517/generatetreelist