====== Acts as tree ======
The information below is copied from the API documentation\\
http://api.akelos.org/ActiveRecord/Behaviours/AkActsAsTree.html
Makes your model acts as a tree (surprise!). Consider the following example:
class Category extends ActiveRecord {
var $acts_as = 'tree';
}
$Category = new Category;
$CategoryA = $Category->create();
$CategoryAa = $Category->create();
$CategoryAa1 = $Category->create();
$CategoryAa2 = $Category->create();
$CategoryAb = $Category->create();
$CategoryB = $Category->create();
$CategoryA->tree->addChild($CategoryAa);
$CategoryA->tree->addChild($CategoryAb);
$CategoryAa->tree->addChild($CategoryAa1);
$CategoryAa->tree->addChild($CategoryAa2);
This will effectively give you:
Category A
\_ Category Aa
\_ Category Aa1
\_ Category Aa2
\_ Category Ab
Category B
OK. Admittedly you won't get a graph in real life. But at least the following functions:
$CategoryA->tree->hasChildren(); # ==> true
$CategoryA->tree->childrenCount(); # ==> 2
$CategoryA->tree->getChildren(); # ==> array($CategoryAa, $CategoryAb)
// fairly expensive operation follows
/* (yes, array(parent, array_of_children) is not nice
but unfortunately PHP doesn't allow for objects as keys) */
$CategoryA->tree->getDescendants(); # ==> array(array($CategoryAa,array($CategoryAa1,$CategoryAa2)),$CategoryAb)
$CategoryAa->tree->getChildren(); # ==> array($CategoryAa1, $CategoryAa2)
$CategoryAa->tree->getSiblings(); # ==> array($CategoryAb)
$CategoryAa->tree->hasParent(); # ==> true
$CategoryAa->tree->getParent(); # ==> $CategoryA
$CatagoryAa1->tree->hasChildren(); # ==> false
$CategoryAa1->tree->getParent(); # ==> $CategoryAa
// fairly expensive operation follows
$CategoryAa1->tree->getAncestors(); # ==> array($CategoryAa, $CategoryA)
// fairly expensive operation follows
$CategoryAa1->tree->getAncestors(1); # ==> array($CategoryAa)
To make this work your model needs a parent_id column (whose name can be overriden with **parent_column**).
Furthermore you can set the **dependent** option to automatically delete all children if their parent gets deleted. Otherwise they will become orphants (i.e. have parent_id = NULL)
(Note that on adding a child it will be saved. If the parent has been unsaved until now it will also be saved.)
==== Configuration options ====
* **parent_column** - specifies the column name to use for keeping the position integer (default: parent_id)
* **dependent** - set to true to automatically delete all children when its parent is deleted
* **scope** - restricts what is to be considered a list. Given a symbol, it'll attach "_id" (if that hasn't been already) and use that as the foreign key restriction. It's also possible to give it an entire string that is interpolated if you need a tighter scope than just a foreign key.
Example:
actsAsTree(array('scope' => array('todo_list_id = ? AND completed = 0',$todo_list_id)));
===== More information =====
* [[display-acts-as-tree-recursively|Display ActsAsTree recursively using a helper]]
* [[Acts as]]