API16

JTableNested/rebuild

From Joomla! Documentation

< API16:JTableNested

The "API16" namespace is an archived namespace. This page contains information for a Joomla! version which is no longer supported. It exists only as a historical reference, it will not be improved and its content may be incomplete and/or contain broken links.

Description[edit]

Method to recursively rebuild the whole nested set tree.



Syntax[edit]

rebuild($parentId=null, $leftId=0, $level=0, $path= '')
Parameter Name Default Value Description
$parentId null The root of the tree to rebuild.
$leftId 0 The left id to start with in building the tree.
$level 0 The level to assign to the current nodes.
$path The path to the current nodes.

Returns[edit]

boolean True on success

Defined in[edit]

libraries/joomla/database/tablenested.php

Importing[edit]

jimport( 'joomla.database.tablenested' );

Source Body[edit]

public function rebuild($parentId = null, $leftId = 0, $level = 0, $path = '')
{
        // If no parent is provided, try to find it.
        if ($parentId === null) {
                // Get the root item.
                $parentId = $this->getRootId();
                if ($parentId === false) {
                        return false;
                }
        }

        // Build the structure of the recursive query.
        if (!isset($this->_cache['rebuild.sql'])) {
                $query  = $this->_db->getQuery(true);
                $query->select('id, alias');
                $query->from($this->_tbl);
                $query->where('parent_id = %d');

                // If the table has an `ordering` field, use that for ordering.
                if (property_exists($this, 'ordering')) {
                        $query->order('parent_id, ordering, lft');
                } else {
                        $query->order('parent_id, lft');
                }
                $this->_cache['rebuild.sql'] = (string) $query;
        }

        // Make a shortcut to database object.
        $db = &$this->_db;

        // Assemble the query to find all children of this node.
        $db->setQuery(sprintf($this->_cache['rebuild.sql'], (int) $parentId));
        $children = $db->loadObjectList();

        // The right value of this node is the left value + 1
        $rightId = $leftId + 1;

        // execute this function recursively over all children
        for ($i = 0, $n = count($children); $i < $n; $i++) {
                // $rightId is the current right value, which is incremented on recursion return.
                // Increment the level for the children.
                // Add this item's alias to the path (but avoid a leading /)
                $rightId = $this->rebuild($children[$i]->id, $rightId, $level + 1, $path.(empty($path) ? '' : '/').$children[$i]->alias);

                // If there is an update failure, return false to break out of the recursion.
                if ($rightId === false) {
                        return false;
                }
        }

        // We've got the left value, and now that we've processed
        // the children of this node we also know the right value.
        $db->setQuery(
                'UPDATE '. $this->_tbl .
                ' SET lft = '. (int) $leftId .', rgt = '. (int) $rightId .
                ' , level = '.(int) $level .
                ' , path = '.$db->quote($path) .
                ' WHERE id = '. (int)$parentId
        );

        // If there is an update failure, return false to break out of the recursion.
        if (!$db->query()) {
                $this->setError($db->getErrorMsg());
                return false;
        }

        // Return the right value of this node + 1.
        return $rightId + 1;
}



Examples[edit]

Code Examples[edit]