Дерево поведения
Делает таблицу, к которой оно прикреплено, похожей на вложенные наборы и предоставляет методы для управления и извлечения информации из полученной иерархической структуры.
Таблицы, к которым прикреплено это поведение, должны иметь столбец, ссылающийся на родительскую строку, и два других числовых столбца (lft и rght), где неявный порядок будет кэшироваться.
Дополнительную информацию о том, что такое вложенный набор и как он работает, см. на https://www.sitepoint.com/hierarchical-data-database-2/
- Cake\ORM\Behavior реализует Cake\Event\EventListenerInterface использует Cake\Core\InstanceConfigTrait
-
Cake\ORM\Behavior\TreeBehavior
Краткое описание свойств
-
$_defaultConfigprotectedКонфигурация по умолчаниюarray -
$_primaryKeyprotectedКэшированная копия первого столбца в первичном ключе таблицы.string
Унаследованные свойства
Краткое описание методов
- _ensureFields() protected
Убеждается, что предоставленная сущность содержит непустые значения для полей слева и справа
- _getMax() protectedВозвращает максимальное значение индекса в таблице.
- _getNode() protectedВозвращает единственный узел из дерева по его первичному ключу
- _getPrimaryKey() protectedВозвращает единственное строковое значение, представляющее первичный ключ присоединенной таблицы
- _moveDown() protectedВспомогательная функция, используемая с фактическим кодом для moveDown
- _moveUp() protectedВспомогательная функция, используемая с фактическим кодом для moveUp
- _recoverTree() protectedРекурсивный метод, используемый для восстановления одного уровня дерева
- _removeFromTree() protectedВспомогательная функция, содержащая фактический код для removeFromTree
- _scope() protected
Изменяет переданный запрос так, чтобы он возвращал только отфильтрованные записи, как определено в конфигурации дерева.
- _setAsRoot() protected
Обновляет поля слева и справа для переданной сущности, чтобы она могла быть установлена как новый корень в дереве. Также изменяет порядок в остальной части дерева, чтобы структура оставалась корректной
- _setChildrenLevel() protectedУстановить уровень для потомков.
- _setParent() protected
Устанавливает правильные значения слева и справа для переданной сущности, чтобы ее можно было обновить до нового родителя. Также делает отверстие в дереве, чтобы перемещение узла можно было выполнить без повреждения структуры.
- _sync() protected
Вспомогательная функция, используемая для автоматического изменения значения полей слева и справа на определенную величину, соответствующую переданным условиям
- _unmarkInternalTree() protected
Вспомогательный метод, используемый для инвертирования знака полей слева и справа, которые меньше 0. Они были установлены в отрицательные значения ранее, чтобы их абсолютное значение не изменилось при выполнении других преобразований дерева.
- afterSave() publicСлушатель после сохранения.
- beforeDelete() publicТакже удаляет узлы в поддереве сущности, которую нужно удалить
- beforeSave() public
Слушатель перед сохранением. Прозрачно управляет установкой полей lft и rght, если поле родителя включено в параметры для сохранения.
- childCount() publicПолучить количество дочерних узлов.
- findChildren() publicПолучить дочерние узлы текущей модели
- findPath() public
Пользовательский метод поиска, который может использоваться для возвращения списка узлов от корня до конкретного узла в дереве. Этот пользовательский поиск требует, чтобы ключ 'for' передавался в параметрах, содержащих идентификатор узла, чтобы получить его путь.
- findTreeList() public
Получает представление элементов в дереве как плоского списка, где ключи — первичный ключ таблицы, а значения — поле отображения таблицы. Значения добавляются префиксом, чтобы визуально указать относительную глубину в дереве.
- formatTreeList() public
Форматирует запрос как плоский список, где ключи — первичный ключ таблицы, а значения — поле отображения таблицы. Значения добавляются префиксом, чтобы визуально указать относительную глубину в дереве.
- getLevel() publicВозвращает уровень глубины узла в дереве.
- initialize() publicМетод начальной загрузки конструктора.
- moveDown() publicПереупорядочивает узел без изменения родителя.
- moveUp() publicПереупорядочивает узел без изменения родителя.
- recover() public
Восстанавливает значения столбцов lft и right из иерархии, определенной столбцом родителя.
- removeFromTree() public
Удаляет текущий узел из дерева, размещая его как новый корень и перемещая всех потомков на один уровень вверх.
Подробное описание методов
_ensureFields()source protected
_ensureFields( Cake\Datasource\EntityInterface $entity )
Убеждается, что предоставленная сущность содержит непустые значения для полей слева и справа
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность, для которой нужно убедиться в наличии полей
_getMax()source protected
_getMax( )
Возвращает максимальное значение индекса в таблице.
Возвращает
целое число_getNode()source protected
_getNode( mixed $id )
Возвращает единственный узел из дерева по его первичному ключу
Параметры
- смешанный
$id - Идентификатор записи.
Возвращает
Cake\Datasource\EntityInterfaceИсключения
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
_getPrimaryKey()source 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, если поле родителя включено в параметры, которые будут сохранены.
Параметры
-
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 из иерархии, определенной столбцом родителя.
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
Возвращает
массив_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
Предоставляет отображение алиас->имя_метода реализованных методов поиска. Пример:
[ '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 - Значение для записи.
- boolean|строка
$mergeнеобязательно false Истинно для рекурсивного объединения, «поверхностное» для простого объединения, ложно для перезаписи, по умолчанию ложно.
Выбрасывает
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']);
Устаревшее
3.4.0 используйте setConfig()/getConfig() вместо этого.Параметры
- строка|массив|null
$keyнеобязательно null - Ключ для получения/установки или весь массив конфигураций.
- смешанный|null
$valueнеобязательно null - Значение для установки.
- boolean
$mergeнеобязательно 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 - Возвращаемое значение, когда ключ не существует.
Возвращает
смешанныйЗначение конфигурации, которое считывается.
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 - Значение для установки.
- boolean
$mergeнеобязательно 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–2018 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.5/class-Cake.ORM.Behavior.TreeBehavior.html