示例#1
0
 /**
  * Move page to another parent node
  *
  * @access public
  * @param Ibrams_CmsExtended_Model_Page $page
  * @param Ibrams_CmsExtended_Model_Page $newParent
  * @param null|int $afterPageId
  * @return Ibrams_CmsExtended_Model_Resource_Page
  * @author Ultimate Module Creator
  */
 public function changeParent(Ibrams_CmsExtended_Model_Page $page, Ibrams_CmsExtended_Model_Page $newParent, $afterPageId = null)
 {
     $childrenCount = $this->getChildrenCount($page->getId()) + 1;
     $table = $this->getMainTable();
     $adapter = $this->_getWriteAdapter();
     $levelFiled = $adapter->quoteIdentifier('level');
     $pathField = $adapter->quoteIdentifier('path');
     /**
      * Decrease children count for all old page parent pages
      */
     $adapter->update($table, array('children_count' => new Zend_Db_Expr('children_count - ' . $childrenCount)), array('entity_id IN(?)' => $page->getParentIds()));
     /**
      * Increase children count for new page parents
      */
     $adapter->update($table, array('children_count' => new Zend_Db_Expr('children_count + ' . $childrenCount)), array('entity_id IN(?)' => $newParent->getPathIds()));
     $position = $this->_processPositions($page, $newParent, $afterPageId);
     $newPath = sprintf('%s/%s', $newParent->getPath(), $page->getId());
     $newLevel = $newParent->getLevel() + 1;
     $levelDisposition = $newLevel - $page->getLevel();
     /**
      * Update children nodes path
      */
     $adapter->update($table, array('path' => new Zend_Db_Expr('REPLACE(' . $pathField . ',' . $adapter->quote($page->getPath() . '/') . ', ' . $adapter->quote($newPath . '/') . ')'), 'level' => new Zend_Db_Expr($levelFiled . ' + ' . $levelDisposition)), array($pathField . ' LIKE ?' => $page->getPath() . '/%'));
     /**
      * Update moved page data
      */
     $data = array('path' => $newPath, 'level' => $newLevel, 'position' => $position, 'parent_id' => $newParent->getId());
     $adapter->update($table, $data, array('entity_id = ?' => $page->getId()));
     // Update page object to new data
     $page->addData($data);
     return $this;
 }