Major overhaul of caching system (work in progress)
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / data / page / menu / item / PageMenuItemEditor.class.php
index 35bdcd909d590073c739d6ca9ef3d7507a49f335..3dbfc01ae910573f69258f02ad4378c2d59c5ca2 100644 (file)
@@ -2,16 +2,14 @@
 namespace wcf\data\page\menu\item;
 use wcf\data\DatabaseObjectEditor;
 use wcf\data\IEditableCachedObject;
-use wcf\system\cache\CacheHandler;
-use wcf\system\database\util\PreparedStatementConditionBuilder;
-use wcf\system\package\PackageDependencyHandler;
+use wcf\system\cache\builder\PageMenuCacheBuilder;
 use wcf\system\WCF;
 
 /**
  * Provides functions to edit page menu items.
  * 
  * @author     Alexander Ebert
- * @copyright  2001-2012 WoltLab GmbH
+ * @copyright  2001-2013 WoltLab GmbH
  * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
  * @package    com.woltlab.wcf
  * @subpackage data.page.menu.item
@@ -30,7 +28,7 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
         */
        public static function create(array $parameters = array()) {
                // calculate show order
-               $parameters['showOrder'] = self::getShowOrder($parameters['showOrder'], $parameters['menuPosition']);
+               $parameters['showOrder'] = self::getShowOrder($parameters['showOrder'], $parameters['menuPosition'], $parameters['parentMenuItem']);
                
                return parent::create($parameters);
        }
@@ -41,10 +39,7 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
         * @todo Handle language id and update related language item
         */
        public function update(array $parameters = array()) {
-               if (isset($parameters['menuPosition']) && isset($parameters['showOrder'])) {
-                       $this->updateShowOrder($parameters['showOrder'], $parameters['menuPosition']);
-               }
-               
+               1 == 0; // TODO: fix me (avoid sniffing error)
                parent::update($parameters);
        }
        
@@ -52,21 +47,46 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
         * @see wcf\data\IEditableObject::delete()
         */
        public function delete() {
-               $conditions = new PreparedStatementConditionBuilder();
-               $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-               $conditions->add("showOrder >= ?", array($this->showOrder));
-               $conditions->add("menuPosition = ?", array($this->menuPosition));
-               
                // update show order
                $sql = "UPDATE  wcf".WCF_N."_page_menu_item
                        SET     showOrder = showOrder - 1
-                       ".$conditions;
+                       WHERE   showOrder >= ?
+                               AND menuPosition = ?";
                $statement = WCF::getDB()->prepareStatement($sql);
-               $statement->execute($conditions->getParameters());
+               $statement->execute(array(
+                       $this->showOrder,
+                       $this->menuPosition
+               ));
                
                parent::delete();
        }
        
+       /**
+        * Sets first top header menu item as landing page.
+        */
+       public static function updateLandingPage() {
+               $sql = "UPDATE  wcf".WCF_N."_page_menu_item
+                       SET     isLandingPage = 0";
+               $statement = WCF::getDB()->prepareStatement($sql);
+               $statement->execute();
+               
+               $sql = "UPDATE          wcf".WCF_N."_page_menu_item
+                       SET             isLandingPage = ?
+                       WHERE           menuPosition = ?
+                                       AND parentMenuItem = ?
+                                       AND menuItemController <> ?
+                       ORDER BY        showOrder ASC";
+               $statement = WCF::getDB()->prepareStatement($sql, 1);
+               $statement->execute(array(
+                       1,
+                       'header',
+                       '',
+                       ''
+               ));
+               
+               self::resetCache();
+       }
+       
        /**
         * Updates the positions of a page menu item directly.
         * 
@@ -75,96 +95,17 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
         * @param       integer         $showOrder
         */
        public static function setShowOrder($menuItemID, $menuPosition = 'header', $showOrder = 1) {
-               $conditions = new PreparedStatementConditionBuilder();
-               $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-               $conditions->add("menuItemID = ?", array($menuItemID));
-               
-               // update show order
+               // Update
                $sql = "UPDATE  wcf".WCF_N."_page_menu_item
                        SET     showOrder = ?,
                                menuPosition = ?
-                       ".$conditions;
+                       WHERE   menuItemID = ?";
                $statement = WCF::getDB()->prepareStatement($sql);
-               
-               $parameters = array_merge(array(
+               $statement->execute(array(
                        $showOrder,
-                       $menuPosition
-               ), $conditions->getParameters());
-               $statement->execute($parameters);
-       }
-       
-       /**
-        * Sets current page menu item as landing page.
-        */
-       public function setAsLandingPage() {
-               $conditions = new PreparedStatementConditionBuilder();
-               $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-               
-               $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                       SET     isLandingPage = 0
-                       ".$conditions;
-               $statement = WCF::getDB()->prepareStatement($sql);
-               $statement->execute($conditions->getParameters());
-               
-               $this->update(array('isLandingPage' => 1));
-       }
-       
-       /**
-        * Updates show order for current menu item.
-        * 
-        * @param       integer         $showOrder
-        * @param       string          $menuPosition
-        */
-       protected function updateShowOrder($showOrder, $menuPosition) {
-               if ($menuPosition == $this->menuPosition) {
-                       if ($this->showOrder != $showOrder) {
-                               $conditions = new PreparedStatementConditionBuilder();
-                               $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-                               $conditions->add("showOrder <= ?", array($showOrder));
-                               $conditions->add("showOrder > ?", array($this->showOrder));
-                               $conditions->add("menuPosition = ?", array($menuPosition));
-                               
-                               if ($showOrder < $this->showOrder) {
-                                       $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                                               SET     showOrder = showOrder + 1
-                                               ".$conditions;
-                                       $statement = WCF::getDB()->prepareStatement($sql);
-                                       $statement->execute($conditions->getParameters());
-                               }
-                               else if ($showOrder > $this->showOrder) {
-                                       $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                                               SET     showOrder = showOrder - 1
-                                               WHERE   showOrder <= ?
-                                                       AND showOrder > ?
-                                                       AND menuPosition = ?";
-                                       $statement = WCF::getDB()->prepareStatement($sql);
-                                       $statement->execute($conditions->getParameters());
-                               }
-                       }
-               }
-               else {
-                       $conditions = new PreparedStatementConditionBuilder();
-                       $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-                       $conditions->add("showOrder >= ?", array($this->showOrder));
-                       $conditions->add("menuPosition = ?", array($this->menuPosition));
-                       
-                       $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                               SET     showOrder = showOrder - 1
-                               ".$conditions;
-                       $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute($conditions->getParameters());
-                       
-                       $conditions = new PreparedStatementConditionBuilder();
-                       $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-                       $conditions->add("showOrder >= ?", array($showOrder));
-                       $conditions->add("menuPosition = ?", array($menuPosition));
-                       
-                       $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                               SET     showOrder = showOrder + 1
-                               ".$conditions;
-                       $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute($conditions->getParameters());
-               }
+                       $menuPosition,
+                       $menuItemID
+               ));
        }
        
        /**
@@ -174,33 +115,34 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
         * @param       string          $menuPosition
         * @return      integer
         */
-       protected static function getShowOrder($showOrder, $menuPosition) {
+       protected static function getShowOrder($showOrder, $menuPosition, $parentMenuItem = '') {
                if ($showOrder == 0) {
-                       $conditions = new PreparedStatementConditionBuilder();
-                       $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-                       $conditions->add("menuPosition = ?", array($menuPosition));
-                       
                        // get next number in row
                        $sql = "SELECT  MAX(showOrder) AS showOrder
                                FROM    wcf".WCF_N."_page_menu_item
-                               ".$conditions;
+                               WHERE   parentMenuItem = ?
+                                       AND menuPosition = ?";
                        $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute($conditions->getParameters());
+                       $statement->execute(array(
+                               $parentMenuItem,
+                               $menuPosition
+                       ));
                        $row = $statement->fetchArray();
                        if (!empty($row)) $showOrder = intval($row['showOrder']) + 1;
                        else $showOrder = 1;
                }
                else {
-                       $conditions = new PreparedStatementConditionBuilder();
-                       $conditions->add("packageID IN (?)", array(PackageDependencyHandler::getInstance()->getDependencies()));
-                       $conditions->add("showOrder >= ?", array($showOrder));
-                       $conditions->add("menuPosition = ?", array($menuPosition));
-                       
                        $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                               SET     showOrder = showOrder + 1
-                               ".$conditions;
+                               SET     showOrder = showOrder + 1
+                               WHERE   parentMenuItem = ?
+                                       AND menuPosition = ?
+                                       AND showOrder >= ?";
                        $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute($conditions->getParameters());
+                       $statement->execute(array(
+                               $parentMenuItem,
+                               $menuPosition,
+                               $showOrder
+                       ));
                }
                
                return $showOrder;
@@ -210,6 +152,6 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
         * @see wcf\data\IEditableCachedObject::resetCache()
         */
        public static function resetCache() {
-               CacheHandler::getInstance()->clear(WCF_DIR.'cache', 'cache.pageMenu-*.php');
+               PageMenuCacheBuilder::getInstance()->reset();
        }
 }