\Cake\ORM\BehaviorTreeBehavior

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/

Summary

Methods
Properties
Constants
__construct()
initialize()
getTable()
verifyConfig()
implementedEvents()
implementedFinders()
implementedMethods()
setConfig()
getConfig()
config()
configShallow()
beforeSave()
afterSave()
beforeDelete()
findPath()
childCount()
findChildren()
findTreeList()
formatTreeList()
removeFromTree()
moveUp()
moveDown()
recover()
getLevel()
No public properties found
No constants found
_resolveMethodAliases()
_reflectionCache()
_configRead()
_configWrite()
_configDelete()
_setChildrenLevel()
_setParent()
_setAsRoot()
_unmarkInternalTree()
_removeFromTree()
_moveUp()
_moveDown()
_getNode()
_recoverTree()
_getMax()
_sync()
_scope()
_ensureFields()
_getPrimaryKey()
$_table
$_reflectionCache
$_defaultConfig
$_config
$_configInitialized
$_primaryKey
N/A
No private methods found
No private properties found
N/A

Properties

$_reflectionCache

$_reflectionCache : array

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.

Type

array

$_defaultConfig

$_defaultConfig : array

Default config

These are merged with user-provided configuration when the behavior is used.

Type

array

$_config

$_config : array

Runtime config

Type

array

$_configInitialized

$_configInitialized : boolean

Whether the config property has already been configured with defaults

Type

boolean

$_primaryKey

$_primaryKey : string

Cached copy of the first column in a table's primary key.

Type

string

Methods

__construct()

__construct(\Cake\ORM\Table  $table, array  $config = array()) 

Constructor

Merges config with the default and store in the config property

Parameters

\Cake\ORM\Table $table

The table this behavior is attached to.

array $config

The config for this behavior.

initialize()

initialize(array  $config) : void

Constructor hook method.

Implement this method to avoid having to overwrite the constructor and call parent.

Parameters

array $config

The configuration settings provided to this behavior.

getTable()

getTable() : \Cake\ORM\Table

Get the table instance this behavior is bound to.

Returns

\Cake\ORM\Table

The bound table instance.

verifyConfig()

verifyConfig() : void

verifyConfig

Checks that implemented keys contain values pointing at callable.

Throws

\Cake\Core\Exception\Exception

if config are invalid

implementedEvents()

implementedEvents() : array

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.

Returns

array

implementedFinders()

implementedFinders() : array

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

Throws

\ReflectionException

Returns

array

implementedMethods()

implementedMethods() : array

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

Throws

\ReflectionException

Returns

array

setConfig()

setConfig(string|array  $key, mixed|null  $value = null, boolean  $merge = true) : $this

Sets the config.

Usage

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']);

Parameters

string|array $key

The key to set, or a complete array of configs.

mixed|null $value

The value to set.

boolean $merge

Whether to recursively merge or overwrite existing config, defaults to true.

Throws

\Cake\Core\Exception\Exception

When trying to set a key that is invalid.

Returns

$this

getConfig()

getConfig(string|null  $key = null, mixed  $default = null) : mixed

Returns the config.

Usage

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');

Parameters

string|null $key

The key to get or null for the whole config.

mixed $default

The return value when the key does not exist.

Returns

mixed —

Config value being read.

config()

config(string|array|null  $key = null, mixed|null  $value = null, boolean  $merge = true) : mixed

Gets/Sets the config.

Usage

Reading the whole config:

$this->config();

Reading a specific value:

$this->config('key');

Reading a nested value:

$this->config('some.nested.key');

Setting a specific value:

$this->config('key', $value);

Setting a nested value:

$this->config('some.nested.key', $value);

Updating multiple config settings at the same time:

$this->config(['one' => 'value', 'another' => 'value']);

Parameters

string|array|null $key

The key to get/set, or a complete array of configs.

mixed|null $value

The value to set.

boolean $merge

Whether to recursively merge or overwrite existing config, defaults to true.

Throws

\Cake\Core\Exception\Exception

When trying to set a key that is invalid.

Returns

mixed —

Config value being read, or the object itself on write operations.

configShallow()

configShallow(string|array  $key, mixed|null  $value = null) : $this

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']);

Parameters

string|array $key

The key to set, or a complete array of configs.

mixed|null $value

The value to set.

Returns

$this

beforeSave()

beforeSave(\Cake\Event\Event  $event, \Cake\Datasource\EntityInterface  $entity) : void

Before save listener.

Transparently manages setting the lft and rght fields if the parent field is included in the parameters to be saved.

Parameters

\Cake\Event\Event $event

The beforeSave event that was fired

\Cake\Datasource\EntityInterface $entity

the entity that is going to be saved

Throws

\RuntimeException

if the parent to set for the node is invalid

afterSave()

afterSave(\Cake\Event\Event  $event, \Cake\Datasource\EntityInterface  $entity) : void

After save listener.

Manages updating level of descendants of currently saved entity.

Parameters

\Cake\Event\Event $event

The afterSave event that was fired

\Cake\Datasource\EntityInterface $entity

the entity that is going to be saved

beforeDelete()

beforeDelete(\Cake\Event\Event  $event, \Cake\Datasource\EntityInterface  $entity) : void

Also deletes the nodes in the subtree of the entity to be delete

Parameters

\Cake\Event\Event $event

The beforeDelete event that was fired

\Cake\Datasource\EntityInterface $entity

The entity that is going to be saved

findPath()

findPath(\Cake\ORM\Query  $query, array  $options) : \Cake\ORM\Query

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.

Parameters

\Cake\ORM\Query $query

The constructed query to modify

array $options

the list of options for the query

Throws

\InvalidArgumentException

If the 'for' key is missing in options

Returns

\Cake\ORM\Query

childCount()

childCount(\Cake\Datasource\EntityInterface  $node, boolean  $direct = false) : integer

Get the number of children nodes.

Parameters

\Cake\Datasource\EntityInterface $node

The entity to count children for

boolean $direct

whether to count all nodes in the subtree or just direct children

Returns

integer —

Number of children nodes.

findChildren()

findChildren(\Cake\ORM\Query  $query, array  $options) : \Cake\ORM\Query

Get the children nodes of the current model

Available options are:

  • for: The id of the record to read.
  • direct: Boolean, whether to return only the direct (true), or all (false) children, defaults to false (all children).

If the direct option is set to true, only the direct children are returned (based upon the parent_id field)

Parameters

\Cake\ORM\Query $query

Query.

array $options

Array of options as described above

Throws

\InvalidArgumentException

When the 'for' key is not passed in $options

Returns

\Cake\ORM\Query

findTreeList()

findTreeList(\Cake\ORM\Query  $query, array  $options) : \Cake\ORM\Query

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.

Options

  • keyPath: A dot separated path to fetch the field to use for the array key, or a closure to return the key out of the provided row.
  • valuePath: A dot separated path to fetch the field to use for the array value, or a closure to return the value out of the provided row.
  • spacer: A string to be used as prefix for denoting the depth in the tree for each item

Parameters

\Cake\ORM\Query $query

Query.

array $options

Array of options as described above.

Returns

\Cake\ORM\Query

formatTreeList()

formatTreeList(\Cake\ORM\Query  $query, array  $options = array()) : \Cake\ORM\Query

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.

Options

  • keyPath: A dot separated path to the field that will be the result array key, or a closure to return the key from the provided row.
  • valuePath: A dot separated path to the field that is the array's value, or a closure to return the value from the provided row.
  • spacer: A string to be used as prefix for denoting the depth in the tree for each item.

Parameters

\Cake\ORM\Query $query

The query object to format.

array $options

Array of options as described above.

Returns

\Cake\ORM\Query

Augmented query.

removeFromTree()

removeFromTree(\Cake\Datasource\EntityInterface  $node) : \Cake\Datasource\EntityInterface|false

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.

Parameters

\Cake\Datasource\EntityInterface $node

The node to remove from the tree

Returns

\Cake\Datasource\EntityInterface|false —

the node after being removed from the tree or false on error

moveUp()

moveUp(\Cake\Datasource\EntityInterface  $node, integer|boolean  $number = 1) : \Cake\Datasource\EntityInterface|boolean

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

Parameters

\Cake\Datasource\EntityInterface $node

The node to move

integer|boolean $number

How many places to move the node, or true to move to first position

Throws

\Cake\Datasource\Exception\RecordNotFoundException

When node was not found

Returns

\Cake\Datasource\EntityInterface|boolean —

$node The node after being moved or false on failure

moveDown()

moveDown(\Cake\Datasource\EntityInterface  $node, integer|boolean  $number = 1) : \Cake\Datasource\EntityInterface|boolean

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

Parameters

\Cake\Datasource\EntityInterface $node

The node to move

integer|boolean $number

How many places to move the node or true to move to last position

Throws

\Cake\Datasource\Exception\RecordNotFoundException

When node was not found

Returns

\Cake\Datasource\EntityInterface|boolean —

the entity after being moved or false on failure

recover()

recover() : void

Recovers the lft and right column values out of the hierarchy defined by the parent column.

getLevel()

getLevel(integer|string|\Cake\Datasource\EntityInterface  $entity) : integer|boolean

Returns the depth level of a node in the tree.

Parameters

integer|string|\Cake\Datasource\EntityInterface $entity

The entity or primary key get the level of.

Returns

integer|boolean —

Integer of the level or false if the node does not exist.

_resolveMethodAliases()

_resolveMethodAliases(string  $key, array  $defaults, array  $config) : array

Removes aliased methods that would otherwise be duplicated by userland configuration.

Parameters

string $key

The key to filter.

array $defaults

The default method mappings.

array $config

The customized method mappings.

Returns

array —

A de-duped list of config data.

_reflectionCache()

_reflectionCache() : array

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

Throws

\ReflectionException

Returns

array

_configRead()

_configRead(string|null  $key) : mixed

Reads a config key.

Parameters

string|null $key

Key to read.

Returns

mixed

_configWrite()

_configWrite(string|array  $key, mixed  $value, boolean|string  $merge = false) : void

Writes a config key.

Parameters

string|array $key

Key to write to.

mixed $value

Value to write.

boolean|string $merge

True to merge recursively, 'shallow' for simple merge, false to overwrite, defaults to false.

Throws

\Cake\Core\Exception\Exception

if attempting to clobber existing config

_configDelete()

_configDelete(string  $key) : void

Deletes a single config key.

Parameters

string $key

Key to delete.

Throws

\Cake\Core\Exception\Exception

if attempting to clobber existing config

_setChildrenLevel()

_setChildrenLevel(\Cake\Datasource\EntityInterface  $entity) : void

Set level for descendants.

Parameters

\Cake\Datasource\EntityInterface $entity

The entity whose descendants need to be updated.

_setParent()

_setParent(\Cake\Datasource\EntityInterface  $entity, mixed  $parent) : void

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.

Parameters

\Cake\Datasource\EntityInterface $entity

The entity to re-parent

mixed $parent

the id of the parent to set

Throws

\RuntimeException

if the parent to set to the entity is not valid

_setAsRoot()

_setAsRoot(\Cake\Datasource\EntityInterface  $entity) : void

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

Parameters

\Cake\Datasource\EntityInterface $entity

The entity to set as a new root

_unmarkInternalTree()

_unmarkInternalTree() : void

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.

_removeFromTree()

_removeFromTree(\Cake\Datasource\EntityInterface  $node) : \Cake\Datasource\EntityInterface|false

Helper function containing the actual code for removeFromTree

Parameters

\Cake\Datasource\EntityInterface $node

The node to remove from the tree

Returns

\Cake\Datasource\EntityInterface|false —

the node after being removed from the tree or false on error

_moveUp()

_moveUp(\Cake\Datasource\EntityInterface  $node, integer|boolean  $number) : \Cake\Datasource\EntityInterface|boolean

Helper function used with the actual code for moveUp

Parameters

\Cake\Datasource\EntityInterface $node

The node to move

integer|boolean $number

How many places to move the node, or true to move to first position

Throws

\Cake\Datasource\Exception\RecordNotFoundException

When node was not found

Returns

\Cake\Datasource\EntityInterface|boolean —

$node The node after being moved or false on failure

_moveDown()

_moveDown(\Cake\Datasource\EntityInterface  $node, integer|boolean  $number) : \Cake\Datasource\EntityInterface|boolean

Helper function used with the actual code for moveDown

Parameters

\Cake\Datasource\EntityInterface $node

The node to move

integer|boolean $number

How many places to move the node, or true to move to last position

Throws

\Cake\Datasource\Exception\RecordNotFoundException

When node was not found

Returns

\Cake\Datasource\EntityInterface|boolean —

$node The node after being moved or false on failure

_getNode()

_getNode(mixed  $id) : \Cake\Datasource\EntityInterface

Returns a single node from the tree from its primary key

Parameters

mixed $id

Record id.

Throws

\Cake\Datasource\Exception\RecordNotFoundException

When node was not found

Returns

\Cake\Datasource\EntityInterface

_recoverTree()

_recoverTree(integer  $counter, mixed  $parentId = null, integer  $level = -1) : integer

Recursive method used to recover a single level of the tree

Parameters

integer $counter

The Last left column value that was assigned

mixed $parentId

the parent id of the level to be recovered

integer $level

Node level

Returns

integer —

The next value to use for the left column

_getMax()

_getMax() : integer

Returns the maximum index value in the table.

Returns

integer

_sync()

_sync(integer  $shift, string  $dir, string  $conditions, boolean  $mark = false) : void

Auxiliary function used to automatically alter the value of both the left and right columns by a certain amount that match the passed conditions

Parameters

integer $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.

boolean $mark

whether to mark the updated values so that they can not be modified by future calls to this function.

_scope()

_scope(\Cake\ORM\Query  $query) : \Cake\ORM\Query

Alters the passed query so that it only returns scoped records as defined in the tree configuration.

Parameters

\Cake\ORM\Query $query

the Query to modify

Returns

\Cake\ORM\Query

_ensureFields()

_ensureFields(\Cake\Datasource\EntityInterface  $entity) : void

Ensures that the provided entity contains non-empty values for the left and right fields

Parameters

\Cake\Datasource\EntityInterface $entity

The entity to ensure fields for

_getPrimaryKey()

_getPrimaryKey() : string

Returns a single string value representing the primary key of the attached table

Returns

string