API16

JTableNested/store

From Joomla! Documentation

< API16:JTableNested
Revision as of 02:12, 25 March 2017 by JoomlaWikiBot (talk | contribs) (preparing for archive only)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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 store a node in the database table.



Syntax[edit]

store($updateNulls=false)
Parameter Name Default Value Description
$updateNulls false True to update null values as well.

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 store($updateNulls = false)
{
        // Initialise variables.
        $k = $this->_tbl_key;

        if ($this->_debug) {
                echo "\n".get_class($this)."::store\n";
                $this->_logtable(true, false);
        }
        /*
         * If the primary key is empty, then we assume we are inserting a new node into the
         * tree.  From this point we would need to determine where in the tree to insert it.
         */
        if (empty($this->$k)) {
                /*
                 * We are inserting a node somewhere in the tree with a known reference
                 * node.  We have to make room for the new node and set the left and right
                 * values before we insert the row.
                 */
                if ($this->_location_id >= 0) {
                        // Lock the table for writing.
                        if (!$this->_lock()) {
                                // Error message set in lock method.
                                return false;
                        }

                        // We are inserting a node relative to the last root node.
                        if ($this->_location_id == 0) {
                                // Get the last root node as the reference node.
                                $this->_db->setQuery(
                                        'SELECT `'.$this->_tbl_key.'`, `parent_id`, `level`, `lft`, `rgt`' .
                                        ' FROM `'.$this->_tbl.'`' .
                                        ' WHERE `parent_id` = 0' .
                                        ' ORDER BY `lft` DESC',
                                        0, 1
                                );
                                $reference = $this->_db->loadObject();

                                // Check for a database error.
                                if ($this->_db->getErrorNum()) {
                                        $this->setError($this->_db->getErrorMsg());
                                        $this->_unlock();
                                        return false;
                                }
                                if ($this->_debug) {
                                        $this->_logtable(false);
                                }
                        }

                        // We have a real node set as a location reference.
                        else {
                                // Get the reference node by primary key.
                                if (!$reference = $this->_getNode($this->_location_id)) {
                                        // Error message set in getNode method.
                                        $this->_unlock();
                                        return false;
                                }
                        }

                        // Get the reposition data for shifting the tree and re-inserting the node.
                        if (!($repositionData = $this->_getTreeRepositionData($reference, 2, $this->_location))) {
                                // Error message set in getNode method.
                                $this->_unlock();
                                return false;
                        }

                        // Create space in the tree at the new location for the new node in left ids.
                        $this->_db->setQuery(
                                'UPDATE `'.$this->_tbl.'`' .
                                ' SET `lft` = `lft` + 2' .
                                ' WHERE '.$repositionData->left_where
                        );
                        $this->_db->query();

                        // Check for a database error.
                        if ($this->_db->getErrorNum()) {
                                $this->setError($this->_db->getErrorMsg());
                                $this->_unlock();
                                return false;
                        }
                        if ($this->_debug) {
                                $this->_logtable();
                        }

                        // Create space in the tree at the new location for the new node in right ids.
                        $this->_db->setQuery(
                                'UPDATE `'.$this->_tbl.'`' .
                                ' SET `rgt` = `rgt` + 2' .
                                ' WHERE '.$repositionData->right_where
                        );
                        $this->_db->query();

                        // Check for a database error.
                        if ($this->_db->getErrorNum()) {
                                $this->setError($this->_db->getErrorMsg());
                                $this->_unlock();
                                return false;
                        }
                        if ($this->_debug) {
                                $this->_logtable();
                        }

                        // Set the object values.
                        $this->parent_id        = $repositionData->new_parent_id;
                        $this->level            = $repositionData->new_level;
                        $this->lft                      = $repositionData->new_lft;
                        $this->rgt                      = $repositionData->new_rgt;
                } else {
                        // Negative parent ids are invalid
                        $this->setError(JText::_('Invalid_Parent'));
                        return false;
                }
        }

        /*
         * If we have a given primary key then we assume we are simply updating this
         * node in the tree.  We should assess whether or not we are moving the node
         * or just updating its data fields.
         */
        else {
                // If the location has been set, move the node to its new location.
                if ($this->_location_id > 0)
                {
                        if (!$this->move($this->_location_id, $this->_location, $this->$k)) {
                                // Error message set in move method.
                                return false;
                        }
                }

                // Lock the table for writing.
                if (!$this->_lock()) {
                        // Error message set in lock method.
                        return false;
                }
        }

        // Store the row to the database.
        if (!parent::store()) {
                $this->_unlock();
                return false;
        }
        if ($this->_debug) {
                $this->_logtable();
        }

        // Unlock the table for writing.
        $this->_unlock();

        return true;
}



Examples[edit]

Code Examples[edit]