Home > CakePHP, php > Verwirrende Signatur von Tree generatetreelist()

Verwirrende Signatur von Tree generatetreelist()

February 2nd, 2009

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:

  1. CakePHP – Pagination bei einer HABTM Beziehung Das Handbuch ist nicht allzu Gesprächig was dieses Thema angeht....
  2. CakePHP – Einfluss auf die Paginator URL nehmen In den Views mit Hilfe der Methoden prev(), next() und...
  3. Fortgeschrittene Anwendung der Tree Komponente Das Tree Behaviour von CakePHP nutzt die Modified Preorder Tree...

CakePHP, php ,

  1. Marcus Straßer
    March 18th, 2009 at 09:03 | #1

    Wow – Danke!!! Du hast mein Leben gerettet :-)
    Im Ernst: Warum steht sowas nicht in der offiziellen Doku????
    Jetzt klappt’s!
    Danke!!!!!

  2. March 19th, 2009 at 14:19 | #2

    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.

  3. ian
    September 20th, 2010 at 11:45 | #3

    Thanks for this – very useful. I’ve tried submitting a change to the 1.2 documentation. http://book.cakephp.org/view/517/generatetreelist

  1. No trackbacks yet.