Класс TreeBehavior
Делает таблицу, к которой он прикреплён, похожей на вложенный набор и предоставляет методы для управления и извлечения информации из полученной иерархической структуры.
Таблицы, к которым прикреплено это поведение, должны иметь столбец, ссылающийся на родительскую строку, и ещё два числовых столбца (lft и rght), где неявный порядок будет кэшироваться.
Для получения дополнительной информации о том, что такое вложенный набор и как он работает, обратитесь к http://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\ORM\EntityИсключения
Cake\Datasource\Exception\RecordNotFoundExceptionЕсли узел не найден
_getPrimaryKey()исходный код protected
_getPrimaryKey( )
Возвращает строку, представляющую первичный ключ присоединённой таблицы
Возвращает
строка_moveDown()исходный код protected
_moveDown( Cake\Datasource\EntityInterface $node , integer|boolean $number )
Вспомогательная функция, используемая с фактическим кодом для moveDown
Параметры
-
Cake\Datasource\EntityInterface$node - Узел, который нужно переместить
- целое число|логическое
$number - На сколько позиций переместить узел или true для перемещения в последнюю позицию
Возвращает
Cake\ORM\Entity|логическое$node Узел после перемещения или false при ошибке
Исключения
Cake\Datasource\Exception\RecordNotFoundExceptionЕсли узел не найден
_moveUp()source protected
_moveUp( Cake\Datasource\EntityInterface $node , integer|boolean $number )
Вспомогательная функция, используемая в фактическом коде для moveUp
Параметры
-
Cake\Datasource\EntityInterface$node - Узел, который нужно переместить
- integer|boolean
$number - Количество позиций для перемещения узла или true для перемещения в первую позицию
Возвращает
Cake\ORM\Entity|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\ORM\Entity|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 - Сформированный запрос для модификации
- array
$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 - Сущность или первичный ключ, для которого нужно получить уровень.
Возвращает
целое число|логическое значениеЦелое значение уровня или ложь, если узел не существует.
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\ORM\Entity|логическое значениесущность после перемещения или 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\ORM\Entity|логическое значение$node Узел после перемещения или false при ошибке
Выбрасывает
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
recover()source public
recover( )
Восстанавливает значения столбцов lft и right из иерархии, определенной столбцом родителя.
removeFromTree()source public
removeFromTree( Cake\Datasource\EntityInterface $node )
Удаляет текущий узел из дерева, размещая его как новый корень и перемещая всех дочерних элементов на уровень выше.
Обратите внимание, что узел не будет удален, а только перемещен из текущего положения без перемещения его дочерних элементов вместе с ним.
Параметры
-
Cake\Datasource\EntityInterface$node - Узел, который нужно удалить из дерева
Возвращает
Cake\ORM\Entity|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
Возвращает
массив_resolveMethodAliases()source protected
_resolveMethodAliases( string $key , array $defaults , array $config )
Удаляет алиасированные методы, которые в противном случае были бы дублированы конфигурацией пользователя.
Параметры
- строка
$key - Ключ для фильтрации.
- массив
$defaults - Определения методов по умолчанию.
- массив
$config - Настроенные определения методов.
Возвращает
массивСписок конфигурации без дублирования.
implementedEvents()source public
implementedEvents( )
Получает обратные вызовы модели, которые интересуют данное поведение.
Определяя один из методов обратного вызова, предполагается, что поведение заинтересовано в соответствующем событии.
Переопределите этот метод, если вам нужно добавить обработчики событий нестандартных методов. Или если вы хотите, чтобы ваше поведение слушало нестандартные события.
Возвращает
массивРеализация
Cake\Event\EventListenerInterface::implementedEvents() implementedFinders()source public
implementedFinders( )
implementedFinders
Предоставляет отображение алиас->имя_метода для наборов методов поиска, реализованных поведением. Пример:
[ 'this' => 'findThis', 'alias' => 'findMethodName' ]
С этим примером вызов $Table->find('this') вызовет $Behavior->findThis(), а вызов $Table->find('alias') вызовет $Behavior->findMethodName()
Рекомендуется, но не обязательно, определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. См. примеры основных поведений
Возвращает
массивimplementedMethods()source public
implementedMethods( )
implementedMethods
Предоставляет отображение алиас->имя_метода для реализованных методов поведения. Пример:
[ 'method' => 'method', 'aliasedmethod' => 'somethingElse' ]
С этим примером вызов $Table->method() вызовет $Behavior->method(), а вызов $Table->aliasedmethod() вызовет $Behavior->somethingElse()
Рекомендуется, но не обязательно, определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. См. примеры основных поведений
Возвращает
массивverifyConfig()source public
verifyConfig( )
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 Истина для рекурсивного слияния, 'shallow' для простого слияния, ложь для перезаписи, по умолчанию ложь.
Исключения
Cake\Core\Exception\Exceptionпри попытке перезаписи существующей конфигурации
config()source public
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']);
Параметры
- строка|массив|null
$keyнеобязательно null - Ключ для получения/установки или полный массив конфигурации.
- смешанный|null
$valueнеобязательно null - Значение для установки.
- булево
$mergeнеобязательно true - Выполнять рекурсивное слияние или перезаписывать существующую конфигурацию, по умолчанию истинно.
Возвращает
смешанныйЗначение конфигурации, которое читается, или сам объект при операциях записи.
Исключения
Cake\Core\Exception\ExceptionПри попытке установить недопустимый ключ.
configShallow()source public
configShallow( string|array $key , mixed|null $value null )
Объединить предоставленную конфигурацию с существующей. В отличие от config(), которая выполняет рекурсивное слияние для вложенных ключей, этот метод выполняет простое слияние.
Установка определенного значения:
$this->config('key', $value); Установка вложенного значения:
$this->config('some.nested.key', $value); Обновление нескольких параметров конфигурации одновременно:
$this->config(['one' => 'value', 'another' => 'value']);
Параметры
- строка|массив
$key - Ключ для установки или полный массив конфигурации.
- смешанный|null
$valueнеобязательно null - Значение для установки.
Возвращает
$this Объект сам по себе.
Подробное описание свойств
$_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–2017 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.3/class-Cake.ORM.Behavior.TreeBehavior.html