Makes the table to which this is attached to behave like a nested set and provides methods for managing and retrieving information out of the derived hierarchical structure.
Tables attaching this behavior are required to have a column referencing the parent row, and two other numeric columns (lft and rght) where the implicit order will be cached.
For more information on what is a nested set and a how it works refer to https://www.sitepoint.com/hierarchical-data-database-2/
array
Runtime config
bool
Whether the config property has already been configured with defaults
array
Default config
string
Cached copy of the first column in a table's primary key.
array
Reflection method cache for behaviors.
\Cake\ORM\Table
Table instance.
Ensures that the provided entity contains non-empty values for the left and right fields
Returns a single string value representing the primary key of the attached table
Removes aliased methods that would otherwise be duplicated by userland configuration.
Alters the passed query so that it only returns scoped records as defined in the tree configuration.
Updates the left and right column for the passed entity so it can be set as a new root in the tree. It also modifies the ordering in the rest of the tree so the structure remains valid
Sets the correct left and right values for the passed entity so it can be updated to a new parent. It also makes the hole in the tree so the node move can be done without corrupting the structure.
Auxiliary function used to automatically alter the value of both the left and right columns by a certain amount that match the passed conditions
Helper method used to invert the sign of the left and right columns that are less than 0. They were set to negative values before so their absolute value wouldn't change while performing other tree transformations.
Merge provided config with existing config. Unlike config()
which does a recursive merge for nested keys, this method does a simple merge.
Custom finder method which can be used to return the list of nodes from the root to a specific node in the tree. This custom finder requires that the key 'for' is passed in the options containing the id of the node to get its path for.
Gets a representation of the elements in the tree as a flat list where the keys are the primary key for the table and the values are the display field for the table.
Formats query as a flat list where the keys are the primary key for the table and the values are the display field for the table. Values are prefixed to visually indicate relative depth in the tree.
Recovers the lft and right column values out of the hierarchy defined by the parent column.
Removes the current node from the tree, by positioning it as a new root and re-parents all children up one level.
__construct(\Cake\ORM\Table $table, array $config)
Constructor
Merges config with the default and store in the config property
\Cake\ORM\Table
$table The table this behavior is attached to.
array
$config optional The config for this behavior.
_configDelete(string $key)
Deletes a single config key.
string
$key Key to delete.
Cake\Core\Exception\Exception
_configRead(?string $key)
Reads a config key.
string|null
$key Key to read.
mixed
_configWrite(mixed $key, mixed $value, mixed $merge)
Writes a config key.
string|array
$key Key to write to.
mixed
$value Value to write.
bool|string
$merge optional True to merge recursively, 'shallow' for simple merge, false to overwrite, defaults to false.
Cake\Core\Exception\Exception
_ensureFields(\Cake\Datasource\EntityInterface $entity)
Ensures that the provided entity contains non-empty values for the left and right fields
\Cake\Datasource\EntityInterface
$entity The entity to ensure fields for
_getMax()
Returns the maximum index value in the table.
int
_getNode(mixed $id)
Returns a single node from the tree from its primary key
mixed
$id Record id.
\Cake\Datasource\EntityInterface
Cake\Datasource\Exception\RecordNotFoundException
_getPrimaryKey()
Returns a single string value representing the primary key of the attached table
string
_moveDown(\Cake\Datasource\EntityInterface $node, mixed $number)
Helper function used with the actual code for moveDown
\Cake\Datasource\EntityInterface
$node The node to move
int|true
$number How many places to move the node, or true to move to last position
\Cake\Datasource\EntityInterface
$node The node after being moved or false on failure
Cake\Datasource\Exception\RecordNotFoundException
_moveUp(\Cake\Datasource\EntityInterface $node, mixed $number)
Helper function used with the actual code for moveUp
\Cake\Datasource\EntityInterface
$node The node to move
int|true
$number How many places to move the node, or true to move to first position
\Cake\Datasource\EntityInterface
$node The node after being moved or false on failure
Cake\Datasource\Exception\RecordNotFoundException
_recoverTree(int $counter, mixed $parentId, mixed $level)
Recursive method used to recover a single level of the tree
int
$counter optional The Last left column value that was assigned
mixed
$parentId optional the parent id of the level to be recovered
int
$level optional Node level
int
The next value to use for the left column
_reflectionCache()
Gets the methods implemented by this behavior
Uses the implementedEvents() method to exclude callback methods. Methods starting with _
will be ignored, as will methods declared on Cake\ORM\Behavior
array
ReflectionException
_removeFromTree(\Cake\Datasource\EntityInterface $node)
Helper function containing the actual code for removeFromTree
\Cake\Datasource\EntityInterface
$node The node to remove from the tree
\Cake\Datasource\EntityInterface|false
the node after being removed from the tree or false on error
_resolveMethodAliases(string $key, array $defaults, array $config)
Removes aliased methods that would otherwise be duplicated by userland configuration.
string
$key The key to filter.
array
$defaults The default method mappings.
array
$config The customized method mappings.
array
A de-duped list of config data.
_scope(\Cake\ORM\Query $query)
Alters the passed query so that it only returns scoped records as defined in the tree configuration.
\Cake\ORM\Query
$query the Query to modify
\Cake\ORM\Query
_setAsRoot(\Cake\Datasource\EntityInterface $entity)
Updates the left and right column for the passed entity so it can be set as a new root in the tree. It also modifies the ordering in the rest of the tree so the structure remains valid
\Cake\Datasource\EntityInterface
$entity The entity to set as a new root
_setChildrenLevel(\Cake\Datasource\EntityInterface $entity)
Set level for descendants.
\Cake\Datasource\EntityInterface
$entity The entity whose descendants need to be updated.
_setParent(\Cake\Datasource\EntityInterface $entity, mixed $parent)
Sets the correct left and right values for the passed entity so it can be updated to a new parent. It also makes the hole in the tree so the node move can be done without corrupting the structure.
\Cake\Datasource\EntityInterface
$entity The entity to re-parent
mixed
$parent the id of the parent to set
RuntimeException
_sync(int $shift, string $dir, string $conditions, bool $mark)
Auxiliary function used to automatically alter the value of both the left and right columns by a certain amount that match the passed conditions
int
$shift the value to use for operating the left and right columns
string
$dir The operator to use for shifting the value (+/-)
string
$conditions a SQL snipped to be used for comparing left or right against it.
bool
$mark optional whether to mark the updated values so that they can not be modified by future calls to this function.
_unmarkInternalTree()
Helper method used to invert the sign of the left and right columns that are less than 0. They were set to negative values before so their absolute value wouldn't change while performing other tree transformations.
afterSave(\Cake\Event\EventInterface $event, \Cake\Datasource\EntityInterface $entity)
After save listener.
Manages updating level of descendants of currently saved entity.
\Cake\Event\EventInterface
$event The afterSave event that was fired
\Cake\Datasource\EntityInterface
$entity the entity that is going to be saved
beforeDelete(\Cake\Event\EventInterface $event, \Cake\Datasource\EntityInterface $entity)
Also deletes the nodes in the subtree of the entity to be delete
\Cake\Event\EventInterface
$event The beforeDelete event that was fired
\Cake\Datasource\EntityInterface
$entity The entity that is going to be saved
beforeSave(\Cake\Event\EventInterface $event, \Cake\Datasource\EntityInterface $entity)
Before save listener.
Transparently manages setting the lft and rght fields if the parent field is included in the parameters to be saved.
\Cake\Event\EventInterface
$event The beforeSave event that was fired
\Cake\Datasource\EntityInterface
$entity the entity that is going to be saved
RuntimeException
childCount(\Cake\Datasource\EntityInterface $node, bool $direct)
Get the number of children nodes.
\Cake\Datasource\EntityInterface
$node The entity to count children for
bool
$direct optional whether to count all nodes in the subtree or just direct children
int
Number of children nodes.
configShallow(mixed $key, mixed $value)
Merge provided config with existing config. Unlike config()
which does a recursive merge for nested keys, this method does a simple merge.
Setting a specific value:
$this->configShallow('key', $value);
Setting a nested value:
$this->configShallow('some.nested.key', $value);
Updating multiple config settings at the same time:
$this->configShallow(['one' => 'value', 'another' => 'value']);
string|array
$key The key to set, or a complete array of configs.
mixed|null
$value optional The value to set.
$this
findChildren(\Cake\ORM\Query $query, array $options)
Get the children nodes of the current model
Available options are:
If the direct option is set to true, only the direct children are returned (based upon the parent_id field)
\Cake\ORM\Query
$query Query.
array
$options Array of options as described above
\Cake\ORM\Query
InvalidArgumentException
findPath(\Cake\ORM\Query $query, array $options)
Custom finder method which can be used to return the list of nodes from the root to a specific node in the tree. This custom finder requires that the key 'for' is passed in the options containing the id of the node to get its path for.
\Cake\ORM\Query
$query The constructed query to modify
array
$options the list of options for the query
\Cake\ORM\Query
InvalidArgumentException
findTreeList(\Cake\ORM\Query $query, array $options)
Gets a representation of the elements in the tree as a flat list where the keys are the primary key for the table and the values are the display field for the table.
Values are prefixed to visually indicate relative depth in the tree.
\Cake\ORM\Query
$query Query.
array
$options Array of options as described above.
\Cake\ORM\Query
formatTreeList(\Cake\ORM\Query $query, array $options)
Formats query as a flat list where the keys are the primary key for the table and the values are the display field for the table. Values are prefixed to visually indicate relative depth in the tree.
\Cake\ORM\Query
$query The query object to format.
array
$options optional Array of options as described above.
\Cake\ORM\Query
Augmented query.
getConfig(?string $key, mixed $default)
Returns the config.
Reading the whole config:
$this->getConfig();
Reading a specific value:
$this->getConfig('key');
Reading a nested value:
$this->getConfig('some.nested.key');
Reading with default value:
$this->getConfig('some-key', 'default-value');
string|null
$key optional The key to get or null for the whole config.
mixed
$default optional The return value when the key does not exist.
mixed
Configuration data at the named key or null if the key does not exist.
getConfigOrFail(string $key)
Returns the config for this specific key.
The config value for this key must exist, it can never be null.
string
$key The key to get.
mixed
Configuration data at the named key
InvalidArgumentException
getLevel(mixed $entity)
Returns the depth level of a node in the tree.
int|string|\Cake\Datasource\EntityInterface
$entity The entity or primary key get the level of.
int|false
Integer of the level or false if the node does not exist.
getTable()
Get the table instance this behavior is bound to.
\Cake\ORM\Table
The bound table instance.
implementedEvents()
Gets the Model callbacks this behavior is interested in.
By defining one of the callback methods a behavior is assumed to be interested in the related event.
Override this method if you need to add non-conventional event listeners. Or if you want your behavior to listen to non-standard events.
array
implementedFinders()
implementedFinders
Provides an alias->methodname map of which finders a behavior implements. Example:
[ 'this' => 'findThis', 'alias' => 'findMethodName' ]
With the above example, a call to $table->find('this')
will call $behavior->findThis()
and a call to $table->find('alias')
will call $behavior->findMethodName()
It is recommended, though not required, to define implementedFinders in the config property of child classes such that it is not necessary to use reflections to derive the available method list. See core behaviors for examples
array
ReflectionException
implementedMethods()
implementedMethods
Provides an alias->methodname map of which methods a behavior implements. Example:
[ 'method' => 'method', 'aliasedMethod' => 'somethingElse' ]
With the above example, a call to $table->method()
will call $behavior->method()
and a call to $table->aliasedMethod()
will call $behavior->somethingElse()
It is recommended, though not required, to define implementedFinders in the config property of child classes such that it is not necessary to use reflections to derive the available method list. See core behaviors for examples
array
ReflectionException
initialize(array $config)
Constructor hook method.
Implement this method to avoid having to overwrite the constructor and call parent.
array
$config The configuration settings provided to this behavior.
moveDown(\Cake\Datasource\EntityInterface $node, mixed $number)
Reorders the node without changing the parent.
If the node is the last child, or is a top level node with no subsequent node this method will return false
\Cake\Datasource\EntityInterface
$node The node to move
int|true
$number optional How many places to move the node or true to move to last position
\Cake\Datasource\EntityInterface|false
the entity after being moved or false on failure
Cake\Datasource\Exception\RecordNotFoundException
moveUp(\Cake\Datasource\EntityInterface $node, mixed $number)
Reorders the node without changing its parent.
If the node is the first child, or is a top level node with no previous node this method will return false
\Cake\Datasource\EntityInterface
$node The node to move
int|true
$number optional How many places to move the node, or true to move to first position
\Cake\Datasource\EntityInterface|false
$node The node after being moved or false on failure
Cake\Datasource\Exception\RecordNotFoundException
recover()
Recovers the lft and right column values out of the hierarchy defined by the parent column.
removeFromTree(\Cake\Datasource\EntityInterface $node)
Removes the current node from the tree, by positioning it as a new root and re-parents all children up one level.
Note that the node will not be deleted just moved away from its current position without moving its children with it.
\Cake\Datasource\EntityInterface
$node The node to remove from the tree
\Cake\Datasource\EntityInterface|false
the node after being removed from the tree or false on error
setConfig(mixed $key, mixed $value, mixed $merge)
Sets the config.
Setting a specific value:
$this->setConfig('key', $value);
Setting a nested value:
$this->setConfig('some.nested.key', $value);
Updating multiple config settings at the same time:
$this->setConfig(['one' => 'value', 'another' => 'value']);
string|array
$key The key to set, or a complete array of configs.
mixed|null
$value optional The value to set.
bool
$merge optional Whether to recursively merge or overwrite existing config, defaults to true.
$this
Cake\Core\Exception\Exception
verifyConfig()
verifyConfig
Checks that implemented keys contain values pointing at callable.
Cake\Core\Exception\Exception
Runtime config
array
Whether the config property has already been configured with defaults
bool
Default config
These are merged with user-provided configuration when the behavior is used.
array
Cached copy of the first column in a table's primary key.
string
Reflection method cache for behaviors.
Stores the reflected method + finder methods per class. This prevents reflecting the same class multiple times in a single process.
array
Table instance.
\Cake\ORM\Table
© 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/4.1/class-Cake.ORM.Behavior.TreeBehavior.html