_mode = $mode; } /** * Returns another iterator which will return the values ready to be displayed * to a user. It does so by extracting one property from each of the elements * and prefixing it with a spacer so that the relative position in the tree * can be visualized. * * Both $valuePath and $keyPath can be a string with a property name to extract * or a dot separated path of properties that should be followed to get the last * one in the path. * * Alternatively, $valuePath and $keyPath can be callable functions. They will get * the current element as first parameter, the current iteration key as second * parameter, and the iterator instance as third argument. * * ### Example * * ``` * $printer = (new Collection($treeStructure))->listNested()->printer('name'); * ``` * * Using a closure: * * ``` * $printer = (new Collection($treeStructure)) * ->listNested() * ->printer(function ($item, $key, $iterator) { * return $item->name; * }); * ``` * * @param string|callable $valuePath The property to extract or a callable to return * the display value * @param string|callable|null $keyPath The property to use as iteration key or a * callable returning the key value. * @param string $spacer The string to use for prefixing the values according to * their depth in the tree * @return \Cake\Collection\Iterator\TreePrinter */ public function printer($valuePath, $keyPath = null, $spacer = '__') { if (!$keyPath) { $counter = 0; $keyPath = function () use (&$counter) { return $counter++; }; } return new TreePrinter( $this->getInnerIterator(), $valuePath, $keyPath, $spacer, $this->_mode ); } }