Класс TreeBehavior
Делает таблицу, к которой он прикреплён, похожей на вложенный набор и предоставляет методы для управления и извлечения информации из полученной иерархической структуры.
Таблицы, к которым прикреплено это поведение, должны иметь столбец, ссылающийся на родительскую строку, и ещё два числовых столбца (lft и rght), где неявный порядок будет кэширован.
Для получения дополнительной информации о том, что такое вложенный набор и как он работает, обратитесь к https://www.sitepoint.com/hierarchical-data-database-2/
- Cake\ORM\Behavior implements Cake\Event\EventListenerInterface uses Cake\Core\InstanceConfigTrait
-
Cake\ORM\Behavior\TreeBehavior
Краткое описание свойств
-
$_defaultConfigprotectedЗначение по умолчанию конфигурацииarray -
$_primaryKeyprotectedКэшированная копия первого столбца первичного ключа таблицы.string
Унаследованные свойства
Краткое описание методов
- _ensureFields() protected
Убеждается, что предоставленный объект содержит непустые значения для полей left и right
- _getMax() protectedВозвращает максимальное значение индекса в таблице.
- _getNode() protectedВозвращает один узел из дерева по его первичному ключу
- _getPrimaryKey() protectedВозвращает строковое значение первичного ключа присоединённой таблицы
- _moveDown() protectedВспомогательная функция, используемая с фактическим кодом для moveDown
- _moveUp() protectedВспомогательная функция, используемая с фактическим кодом для moveUp
- _recoverTree() protectedРекурсивный метод, используемый для восстановления одного уровня дерева
- _removeFromTree() protectedВспомогательная функция, содержащая фактический код для removeFromTree
- _scope() protected
Изменяет переданный запрос так, чтобы он возвращал только отфильтрованные записи, как определено в конфигурации дерева.
- _setAsRoot() protected
Обновляет поля left и right для переданного объекта, чтобы он мог быть установлен в качестве нового корня в дереве. Также изменяет порядок в остальной части дерева, чтобы структура оставалась корректной.
- _setChildrenLevel() protectedУстанавливает уровень потомков.
- _setParent() protected
Устанавливает правильные значения left и right для переданного объекта, чтобы он мог быть обновлён с новым родителем. Также создаёт отверстие в дереве, чтобы перемещение узла можно было выполнить без повреждения структуры.
- _sync() protected
Вспомогательная функция, используемая для автоматического изменения значения полей left и right на определённую величину, соответствующую переданным условиям.
- _unmarkInternalTree() protected
Вспомогательный метод, используемый для изменения знака полей left и right, которые меньше 0. Они были установлены с отрицательными значениями ранее, чтобы их абсолютное значение не изменилось при выполнении других преобразований дерева.
- afterSave() publicСлушатель после сохранения.
- beforeDelete() publicТакже удаляет узлы в поддереве объекта, который нужно удалить
- beforeSave() public
Слушатель перед сохранением. Прозрачно управляет установкой полей lft и rght, если поле parent включено в параметры, которые нужно сохранить.
- childCount() publicПолучить количество дочерних узлов.
- findChildren() publicПолучить дочерние узлы текущей модели
- findPath() public
Пользовательский метод поиска, который можно использовать для возвращения списка узлов от корня до определённого узла в дереве. Для этого пользовательского поиска необходимо, чтобы ключ 'for' передавался в опциях, содержащих идентификатор узла, для которого нужно получить путь.
- findTreeList() public
Получает представление элементов в дереве в виде плоского списка, где ключами являются первичные ключи таблицы, а значениями — поле отображения таблицы. Значения предваряются префиксом для визуального обозначения относительной глубины в дереве.
- formatTreeList() public
Форматирует запрос в виде плоского списка, где ключами являются первичные ключи таблицы, а значениями — поле отображения таблицы. Значения предваряются префиксом для визуального обозначения относительной глубины в дереве.
- getLevel() publicВозвращает уровень глубины узла в дереве.
- initialize() publicМетод инициализации конструктора.
- moveDown() publicПереупорядочивает узел без изменения родителя.
- moveUp() publicПереупорядочивает узел без изменения родителя.
- recover() public
Восстанавливает значения полей lft и right из иерархии, определённой столбцом parent.
- removeFromTree() public
Удаляет текущий узел из дерева, разместив его как новый корень и переместив всех потомков на один уровень вверх.
Подробное описание методов
_ensureFields()исходный код protected
_ensureFields( Cake\Datasource\EntityInterface $entity )
Убеждается, что предоставленный объект содержит непустые значения для полей left и right
Параметры
-
Cake\Datasource\EntityInterface$entity - Объект, для которого нужно убедиться в наличии полей
_getMax()исходный код protected
_getMax( )
Возвращает максимальное значение индекса в таблице.
Возвращает
целое число_getNode()исходный код protected
_getNode( mixed $id )
Возвращает один узел из дерева по его первичному ключу
Параметры
- смешанное
$id - Идентификатор записи.
Возвращает
Cake\Datasource\EntityInterfaceИсключения
Cake\Datasource\Exception\RecordNotFoundExceptionПри отсутствии узла
_getPrimaryKey()исходный код protected
_getPrimaryKey( )
Возвращает строковое значение первичного ключа присоединённой таблицы
Возвращает
строка_moveDown()source protected
_moveDown( Cake\Datasource\EntityInterface $node , integer|boolean $number )
Вспомогательная функция, используемая с фактическим кодом для перемещения вниз
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для перемещения
- integer|boolean
$number - Количество позиций для перемещения узла, или true для перемещения в последнюю позицию
Возвращает
Cake\Datasource\EntityInterface|boolean$node Узел после перемещения или false при ошибке
Исключения
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
_moveUp()source protected
_moveUp( Cake\Datasource\EntityInterface $node , integer|boolean $number )
Вспомогательная функция, используемая с фактическим кодом для перемещения вверх
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для перемещения
- integer|boolean
$number - Количество позиций для перемещения узла, или true для перемещения в первую позицию
Возвращает
Cake\Datasource\EntityInterface|boolean$node Узел после перемещения или false при ошибке
Исключения
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
_recoverTree()source protected
_recoverTree( integer $counter = 0 , mixed $parentId = null , integer $level = -1 )
Рекурсивный метод, используемый для восстановления одного уровня дерева
Параметры
- integer
$counterнеобязательно 0 - Значение последнего левого столбца, которое было назначено
- mixed
$parentIdнеобязательно null - идентификатор родительского узла уровня, который необходимо восстановить
- integer
$levelнеобязательно -1 - Уровень узла
Возвращает
integerСледующее значение для использования в левом столбце
_removeFromTree()source protected
_removeFromTree( Cake\Datasource\EntityInterface $node )
Вспомогательная функция, содержащая фактический код для removeFromTree
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для удаления из дерева
Возвращает
Cake\Datasource\EntityInterface|falseузел после удаления из дерева или false при ошибке
_scope()source protected
_scope( Cake\ORM\Query $query )
Изменяет переданный запрос так, чтобы он возвращал только отфильтрованные записи, как определено в конфигурации дерева.
Параметры
-
Cake\ORM\Query$query - запрос для изменения
Возвращает
Cake\ORM\Query_setAsRoot()source protected
_setAsRoot( Cake\Datasource\EntityInterface $entity )
Обновляет левую и правую колонки для переданной сущности, чтобы её можно было установить как новый корень в дереве. Также изменяет порядок в остальной части дерева, чтобы структура осталась корректной
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, которую нужно установить как новый корень
_setChildrenLevel()source protected
_setChildrenLevel( Cake\Datasource\EntityInterface $entity )
Устанавливает уровень для потомков.
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, потомки которой необходимо обновить.
_setParent()source protected
_setParent( Cake\Datasource\EntityInterface $entity , mixed $parent )
Устанавливает правильные значения левого и правого столбцов для переданной сущности, чтобы её можно было обновить до нового родителя. Также создаёт разрыв в дереве, чтобы перемещение узла можно было выполнить без нарушения структуры.
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, которую нужно переместить к новому родителю
- mixed
$parent - идентификатор родителя для установки
Исключения
RuntimeExceptionЕсли родитель для установки для сущности недействителен
_sync()source protected
_sync( integer $shift , string $dir , string $conditions , boolean $mark = false )
Вспомогательная функция, используемая для автоматического изменения значения левого и правого столбцов на определённую величину, соответствующую переданным условиям
Параметры
- integer
$shift - значение, используемое для обработки левого и правого столбцов
- string
$dir - Оператор для смещения значения (+/-)
- string
$conditions SQL фрагмент, используемый для сравнения левого или правого со значением.
- boolean
$markнеобязательно false указывает, нужно ли отметить обновлённые значения, чтобы они не могли быть изменены последующими вызовами этой функции.
_unmarkInternalTree()source protected
_unmarkInternalTree( )
Вспомогательный метод, используемый для изменения знака левого и правого столбцов, которые меньше 0. Они были установлены отрицательными значениями ранее, чтобы их абсолютное значение не изменялось во время выполнения других преобразований дерева.
afterSave()source public
afterSave( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Обработчик после сохранения.
Управляет обновлением уровня потомков текущей сохранённой сущности.
Параметры
-
Cake\Event\Event$event - событие afterSave, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - сущность, которая будет сохранена
beforeDelete()source public
beforeDelete( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Также удаляет узлы в поддереве сущности, которая будет удалена
Параметры
-
Cake\Event\Event$event - событие beforeDelete, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - сущность, которая будет сохранена
beforeSave()source public
beforeSave( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Обработчик перед сохранением. Прозрачно управляет установкой полей lft и rght, если поле parent включено в параметры для сохранения.
Параметры
-
Cake\Event\Event$event - событие beforeSave, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - сущность, которая будет сохранена
Исключения
RuntimeExceptionЕсли родитель для установки для узла недействителен
childCount()source public
childCount( Cake\Datasource\EntityInterface $node , boolean $direct = false )
Получить количество дочерних узлов.
Параметры
-
Cake\Datasource\EntityInterface$node - Сущность, для которой нужно подсчитать количество дочерних элементов
- boolean
$directнеобязательно false указывает, нужно ли подсчитать все узлы в поддереве или только непосредственные дочерние элементы
Возвращает
integerКоличество дочерних узлов.
findChildren()source public
findChildren( Cake\ORM\Query $query , array $options )
Получить дочерние узлы текущей модели
Доступные параметры:
- for: Идентификатор записи для чтения.
- direct: Булево значение, возвращать только прямых (true) или всех (false) потомков, по умолчанию false (все потомки).
Если параметр direct установлен в true, возвращаются только прямые потомки (на основе поля parent_id)
Параметры
-
Cake\ORM\Query$query - Запрос.
- array
$options - Массив параметров, как описано выше
Возвращает
Cake\ORM\QueryИсключения
InvalidArgumentExceptionКогда ключ 'for' не передан в $options
findPath()source public
findPath( Cake\ORM\Query $query , array $options )
Метод поиска пути, который можно использовать для возвращения списка узлов от корня до конкретного узла в дереве. Этот пользовательский поиск требует, чтобы ключ 'for' был передан в опциях, содержащих идентификатор узла, для которого требуется путь.
Параметры
-
Cake\ORM\Query$query - Конструируемый запрос для изменения
- массив
$options - список опций для запроса
Возвращает
Cake\ORM\QueryИсключения
InvalidArgumentExceptionЕсли ключ 'for' отсутствует в опциях
findTreeList()source public
findTreeList( Cake\ORM\Query $query , array $options )
Получает представление элементов в дереве как плоский список, где ключами являются первичные ключи для таблицы, а значениями — поле отображения для таблицы. Значения добавляются в качестве префиксов, чтобы визуально указать относительную глубину в дереве.
Опции
- keyPath: Путь с точками для извлечения поля, которое будет использоваться в качестве ключа массива, или замыкание для возврата ключа из предоставленной строки.
- valuePath: Путь с точками для извлечения поля, которое будет использоваться в качестве значения массива, или замыкание для возврата значения из предоставленной строки.
- spacer: Строка, используемая в качестве префикса для обозначения глубины в дереве для каждого элемента
Параметры
-
Cake\ORM\Query$query - Запрос.
- массив
$options - Массив опций, как описано выше.
Возвращает
Cake\ORM\QueryformatTreeList()source public
formatTreeList( Cake\ORM\Query $query , array $options = [] )
Форматирует запрос в виде плоского списка, где ключами являются первичные ключи таблицы, а значениями — поле отображения таблицы. Значения добавляются в качестве префиксов, чтобы визуально указать относительную глубину в дереве.
Опции
- keyPath: Путь с точками к полю, которое будет ключом результирующего массива, или замыкание для возврата ключа из предоставленной строки.
- valuePath: Путь с точками к полю, которое является значением массива, или замыкание для возврата значения из предоставленной строки.
- spacer: Строка, используемая в качестве префикса для обозначения глубины в дереве для каждого элемента.
Параметры
-
Cake\ORM\Query$query - Объект запроса для форматирования.
- массив
$optionsнеобязательно [] - Массив опций, как описано выше.
Возвращает
Cake\ORM\QueryРасширенный запрос.
getLevel()source public
getLevel( integer|string|Cake\Datasource\EntityInterface $entity )
Возвращает уровень вложенности узла в дереве.
Параметры
- целое число|строка|
Cake\Datasource\EntityInterface$entity - Сущность или первичный ключ, для которого необходимо получить уровень.
Возвращает
целое число|логическое значениеЦелое значение уровня или false, если узел не существует.
initialize()source public
initialize( array $config )
Метод хука конструктора.
Параметры
- массив
$config - Настройки конфигурации, предоставленные данному поведению.
Переопределяет
Cake\ORM\Behavior::initialize() moveDown()source public
moveDown( Cake\Datasource\EntityInterface $node , integer|boolean $number = 1 )
Переупорядочивает узел без изменения родителя.
Если узел является последним дочерним элементом или является узлом верхнего уровня без последующего узла, этот метод вернет false.
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для перемещения
- целое число|логическое значение
$numberнеобязательно 1 - Количество позиций для перемещения узла или true для перемещения в последнюю позицию
Возвращает
Cake\Datasource\EntityInterface|логическое значениеСущность после перемещения или false при неудаче
Исключения
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
moveUp()source public
moveUp( Cake\Datasource\EntityInterface $node , integer|boolean $number = 1 )
Переупорядочивает узел без изменения его родителя.
Если узел является первым дочерним элементом или является узлом верхнего уровня без предыдущего узла, этот метод вернет false.
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для перемещения
- целое число|логическое значение
$numberнеобязательно 1 - Количество позиций для перемещения узла или true для перемещения в первую позицию
Возвращает
Cake\Datasource\EntityInterface|логическое значение$node Узел после перемещения или false при неудаче
Исключения
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
recover()source public
recover( )
Восстанавливает значения столбцов lft и right из иерархии, определенной столбцом parent.
removeFromTree()source public
removeFromTree( Cake\Datasource\EntityInterface $node )
Удаляет текущий узел из дерева, помещая его в качестве нового корня и перемещая всех дочерних элементов вверх на один уровень.
Обратите внимание, что узел не будет удален, а только перемещен из текущей позиции без перемещения его дочерних элементов.
Параметры
-
Cake\Datasource\EntityInterface$node - Узел для удаления из дерева
Возвращает
Cake\Datasource\EntityInterface|falseУзел после удаления из дерева или false при ошибке
Методы, унаследованные от Cake\ORM\Behavior
__construct()source public
__construct( Cake\ORM\Table $table , array $config = [] )
Конструктор
Объединяет конфигурацию со значением по умолчанию и сохраняет ее в свойстве config
Параметры
-
Cake\ORM\Table$table - Таблица, к которой прикреплено это поведение.
- массив
$configнеобязательно [] - Конфигурация для этого поведения.
_reflectionCache()source protected
_reflectionCache( )
Получает реализованные методы данного поведения
Использует метод implementedEvents() для исключения методов обратного вызова. Методы, начинающиеся с _ будут проигнорированы, как и методы, объявленные в Cake\ORM\Behavior
Возвращает
массивИсключения
ReflectionException_resolveMethodAliases()source protected
_resolveMethodAliases( string $key , array $defaults , array $config )
Удаляет алиасированные методы, которые в противном случае были бы дублированы пользовательской конфигурацией.
Параметры
- строка
$key - Ключ для фильтрации.
- массив
$defaults - Карта соответствия методов по умолчанию.
- массив
$config - Настроенная карта соответствия методов.
Возвращает
массивСписок данных конфигурации без дублирования.
getTable()source public
getTable( )
Получить экземпляр таблицы, к которой прикреплено это поведение.
Возвращает
Cake\ORM\TableЭкземпляр связанной таблицы.
implementedEvents()source public
implementedEvents( )
Получает обратные вызовы модели, к которым заинтересовано данное поведение.
Определяя один из методов обратного вызова, предполагается, что поведение заинтересовано в соответствующем событии.
Переопределите этот метод, если вам нужно добавить слушателей событий, отличных от стандартных. Или если вы хотите, чтобы ваше поведение слушало нестандартные события.
Возвращает
массивРеализация
Cake\Event\EventListenerInterface::implementedEvents() implementedFinders()source public
implementedFinders( )
implementedFinders
Предоставляет карту alias->methodname, которые реализует поведение. Пример:
[ 'this' => 'findThis', 'alias' => 'findMethodName' ]
В приведенном выше примере вызов $Table->find('this') вызовет $Behavior->findThis(), а вызов $Table->find('alias') вызовет $Behavior->findMethodName()
Рекомендуется (но не обязательно) определять implementedFinders в свойстве config дочерних классов, чтобы не нужно было использовать рефлексию для вывода доступного списка методов. См. примеры основных поведений.
Возвращает
массивИсключения
ReflectionExceptionimplementedMethods()source public
implementedMethods( )
Реализованные методы
Предоставляет отображение alias->имя_метода, показывающее, какие методы реализует поведение. Пример:
[ 'method' => 'method', 'aliasedmethod' => 'somethingElse' ]
В приведенном примере вызов $Table->method() вызовет $Behavior->method(), а вызов $Table->aliasedmethod() вызовет $Behavior->somethingElse()
Рекомендуется (но не обязательно) определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. Смотрите примеры в базовых поведенииях.
Возвращает
массивИсключение
ReflectionExceptionverifyConfig()source public
verifyConfig( )
Проверка конфигурации
Проверяет, что реализованные ключи содержат значения, указывающие на вызываемые объекты.
Исключение
Cake\Core\Exception\Exceptionесли конфигурация некорректна
Методы, используемые из Cake\Core\InstanceConfigTrait
_configDelete()source protected
_configDelete( string $key )
Удаляет один ключ конфигурации.
Параметры
- строка
$key - Ключ для удаления.
Исключение
Cake\Core\Exception\Exceptionесли пытаетесь перезаписать существующую конфигурацию
_configRead()source protected
_configRead( string|null $key )
Читает значение ключа конфигурации.
Параметры
- строка|null
$key - Ключ для чтения.
Возвращает
смешанное_configWrite()source protected
_configWrite( string|array $key , mixed $value , boolean|string $merge = false )
Записывает значение ключа конфигурации.
Параметры
- строка|массив
$key - Ключ для записи.
- смешанное
$value - Значение для записи.
- логическое|строка
$mergeнеобязательно false True для рекурсивного слияния, 'shallow' для простого слияния, false для перезаписи, по умолчанию false.
Исключение
Cake\Core\Exception\Exceptionесли пытаетесь перезаписать существующую конфигурацию
config()source public deprecated
config( string|array|null $key = null , mixed|null $value = null , boolean $merge = true )
Получение/установка конфигурации.
Использование
Чтение всей конфигурации:
$this->config();
Чтение конкретного значения:
$this->config('key'); Чтение вложенного значения:
$this->config('some.nested.key'); Установка конкретного значения:
$this->config('key', $value); Установка вложенного значения:
$this->config('some.nested.key', $value); Обновление нескольких параметров конфигурации одновременно:
$this->config(['one' => 'value', 'another' => 'value']);
Устарело
3.4.0 используйте setConfig()/getConfig() вместо этого.Параметры
- строка|массив|null
$keyнеобязательно null - Ключ для получения/установки или полный массив конфигураций.
- смешанное|null
$valueнеобязательно null - Значение для установки.
- логическое
$mergeнеобязательно true - Рекурсивно сливать или перезаписывать существующую конфигурацию, по умолчанию true.
Возвращает
смешанноеЗначение конфигурации, которое читается, или сам объект при операциях записи.
Исключение
Cake\Core\Exception\ExceptionПри попытке установить неверный ключ.
configShallow()source public
configShallow( string|array $key , mixed|null $value = null )
Объединяет предоставленную конфигурацию с существующей конфигурацией. В отличие от config(), которая выполняет рекурсивное слияние вложенных ключей, этот метод выполняет простое слияние.
Установка конкретного значения:
$this->configShallow('key', $value); Установка вложенного значения:
$this->configShallow('some.nested.key', $value); Обновление нескольких параметров конфигурации одновременно:
$this->configShallow(['one' => 'value', 'another' => 'value']);
Параметры
- строка|массив
$key - Ключ для установки, или полный массив конфигураций.
- смешанное|null
$valueнеобязательно null - Значение для установки.
Возвращает
$this
getConfig()source public
getConfig( string|null $key = null , mixed $default = null )
Возвращает конфигурацию.
Использование
Чтение всей конфигурации:
$this->getConfig();
Чтение конкретного значения:
$this->getConfig('key'); Чтение вложенного значения:
$this->getConfig('some.nested.key'); Чтение со значением по умолчанию:
$this->getConfig('some-key', 'default-value'); Параметры
- строка|null
$keyнеобязательно null - Ключ для получения или null для всей конфигурации.
- смешанное
$defaultнеобязательно null - Значение по умолчанию, если ключ не существует.
Возвращает
смешанноеДанные конфигурации по указанному ключу или null, если ключ не существует.
setConfig()source public
setConfig( string|array $key , mixed|null $value = null , boolean $merge = true )
Устанавливает конфигурацию.
Использование
Установка конкретного значения:
$this->setConfig('key', $value); Установка вложенного значения:
$this->setConfig('some.nested.key', $value); Обновление нескольких параметров конфигурации одновременно:
$this->setConfig(['one' => 'value', 'another' => 'value']);
Параметры
- строка|массив
$key - Ключ для установки или полный массив конфигураций.
- смешанное|null
$valueнеобязательно null - Значение для установки.
- логическое
$mergeнеобязательно true - Рекурсивно сливать или перезаписывать существующую конфигурацию, по умолчанию true.
Возвращает
$this
Исключение
Cake\Core\Exception\ExceptionПри попытке установить неверный ключ.
Подробное описание свойств
$_defaultConfigsource
protected массив
Конфигурация по умолчанию
Эти значения сливаются с пользовательскими настройками при использовании поведения.
[
'implementedFinders' => [
'path' => 'findPath',
'children' => 'findChildren',
'treeList' => 'findTreeList',
],
'implementedMethods' => [
'childCount' => 'childCount',
'moveUp' => 'moveUp',
'moveDown' => 'moveDown',
'recover' => 'recover',
'removeFromTree' => 'removeFromTree',
'getLevel' => 'getLevel',
'formatTreeList' => 'formatTreeList',
],
'parent' => 'parent_id',
'left' => 'lft',
'right' => 'rght',
'scope' => null,
'level' => null,
'recoverOrder' => null,
]
© 2005–present The Cake Software Foundation, Inc.
Licensed under the MIT License.
CakePHP is a registered trademark of Cake Software Foundation, Inc.
We are not endorsed by or affiliated with CakePHP.
https://api.cakephp.org/3.8/class-Cake.ORM.Behavior.TreeBehavior.html