Дерево поведения
Делает таблицу, к которой это прикреплено, ведёт себя как вложенный набор и предоставляет методы для управления и извлечения информации из полученной иерархической структуры.
Таблицы, к которым прикреплено это поведение, должны иметь столбец, ссылающийся на родительскую строку, и два других числовых столбца (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
Убеждается, что предоставленная сущность содержит непустые значения для полей left и right
- _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
Устанавливает правильные значения left и right для переданной сущности, чтобы её можно было обновить до нового родителя. Также создаёт пустоту в дереве, чтобы перемещение узла можно было выполнить без повреждения структуры.
- _sync() protected
Вспомогательная функция, используемая для автоматического изменения значения как левого, так и правого столбцов на определённую величину, соответствующую переданным условиям
- _unmarkInternalTree() protected
Вспомогательный метод, используемый для инвертирования знака левого и правого столбцов, которые меньше 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()source protected
_ensureFields( Cake\Datasource\EntityInterface $entity )
Убеждается, что предоставленная сущность содержит непустые значения для полей left и right
Параметры
-
Cake\Datasource\EntityInterface$entity - Сущность для проверки полей
_getMax()source protected
_getMax( )
Возвращает максимальное значение индекса в таблице.
Возвращает
целое число_getNode()source protected
_getNode( mixed $id )
Возвращает один узел из дерева по его первичному ключу
Параметры
- mixed
$id - Идентификатор записи.
Возвращает
Cake\Datasource\EntityInterfaceИсключение
Cake\Datasource\Exception\RecordNotFoundExceptionКогда узел не был найден
_getPrimaryKey()source protected
_getPrimaryKey( )
Возвращает одно строковое значение, представляющее первичный ключ присоединённой таблицы
Возвращает
строка_moveDown()source protected
_moveDown( Cake\Datasource\EntityInterface $node , integer|boolean $number )
Вспомогательная функция, используемая в фактическом коде для moveDown
Параметры
-
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 )
Вспомогательная функция, используемая в фактическом коде для moveUp
Параметры
-
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
$counteroptional 0 - Последнее значение левого столбца, которое было присвоено
- mixed
$parentIdoptional null - Идентификатор родительского узла уровня, который необходимо восстановить
- integer
$leveloptional -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
$markoptional false Определяет, нужно ли помечать обновлённые значения, чтобы их нельзя было изменить последующими вызовами этой функции.
_unmarkInternalTree()source protected
_unmarkInternalTree( )
Вспомогательный метод, используемый для изменения знака столбцов слева и справа, которые меньше 0. Они были установлены в отрицательные значения ранее, чтобы их абсолютное значение не изменялось во время выполнения других преобразований дерева.
afterSave()source public
afterSave( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Обработчик после сохранения.
Управляет обновлением уровня потомков текущего сохранённого объекта.
Параметры
-
Cake\Event\Event$event - Событие после сохранения, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - Объект, который будет сохранён
beforeDelete()source public
beforeDelete( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Также удаляет узлы в поддереве объекта, который будет удалён
Параметры
-
Cake\Event\Event$event - Событие перед удалением, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - Объект, который будет сохранён
beforeSave()source public
beforeSave( Cake\Event\Event $event , Cake\Datasource\EntityInterface $entity )
Обработчик перед сохранением. Прозрачно управляет установкой полей lft и rght, если поле родителя включено в параметры, которые нужно сохранить.
Параметры
-
Cake\Event\Event$event - Событие перед сохранением, которое было вызвано
-
Cake\Datasource\EntityInterface$entity - Объект, который будет сохранён
Вызывает
RuntimeExceptionЕсли родитель для узла недействителен
childCount()source public
childCount( Cake\Datasource\EntityInterface $node , boolean $direct = false )
Получение количества дочерних узлов.
Параметры
-
Cake\Datasource\EntityInterface$node - Объект, для которого нужно посчитать количество дочерних узлов
- boolean
$directoptional 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->метод, в котором реализуются методы поиска. Пример:
[ 'this' => 'findThis', 'alias' => 'findMethodName' ]
В приведенном примере вызов $Table->find('this') вызовет $Behavior->findThis(), а вызов $Table->find('alias') вызовет $Behavior->findMethodName()
Рекомендуется, хотя это необязательно, определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. См. примеры в основных поведенческих моделях.
Возвращает
массивВыбрасывает
ReflectionExceptionimplementedMethods()source public
implementedMethods( )
implementedMethods
Предоставляет отображение alias->метод, в котором реализуются методы. Пример:
[ 'method' => 'method', 'aliasedmethod' => 'somethingElse' ]
В приведенном примере вызов $Table->method() вызовет $Behavior->method(), а вызов $Table->aliasedmethod() вызовет $Behavior->somethingElse()
Рекомендуется, хотя это необязательно, определять implementedFinders в свойстве config дочерних классов, чтобы не было необходимости использовать рефлексию для получения списка доступных методов. См. примеры в основных поведенческих моделях.
Возвращает
массивВыбрасывает
ReflectionExceptionverifyConfig()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']);
Устарело
3.4.0 используйте setConfig()/getConfig() вместо этого.Параметры
- строка|массив|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->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 - Значение для установки.
- логический тип
$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–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.7/class-Cake.ORM.Behavior.TreeBehavior.html