Major overhaul of caching system (work in progress)
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / data / page / menu / item / PageMenuItemEditor.class.php
index be525aa98bce702072c4e322e9ba953277075072..3dbfc01ae910573f69258f02ad4378c2d59c5ca2 100644 (file)
@@ -2,14 +2,14 @@
 namespace wcf\data\page\menu\item;
 use wcf\data\DatabaseObjectEditor;
 use wcf\data\IEditableCachedObject;
-use wcf\system\cache\CacheHandler;
+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
@@ -28,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);
        }
@@ -39,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);
        }
        
@@ -64,6 +61,32 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
                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.
         * 
@@ -76,7 +99,7 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
                $sql = "UPDATE  wcf".WCF_N."_page_menu_item
                        SET     showOrder = ?,
                                menuPosition = ?
-                       WHERE   menuItemID = ?";
+                       WHERE   menuItemID = ?";
                $statement = WCF::getDB()->prepareStatement($sql);
                $statement->execute(array(
                        $showOrder,
@@ -85,66 +108,6 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
                ));
        }
        
-       /**
-        * 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) {
-                               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(array(
-                                               $showOrder,
-                                               $this->showOrder,
-                                               $menuPosition
-                                       ));
-                               }
-                               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(array(
-                                               $showOrder,
-                                               $this->showOrder,
-                                               $menuPosition
-                                       ));
-                               }
-                       }
-               }
-               else {
-                       $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                               SET     showOrder = showOrder - 1
-                               WHERE   showOrder >= ?
-                                       AND menuPosition = ?";
-                       $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute(array(
-                               $this->showOrder,
-                               $this->menuPosition
-                       ));
-                               
-                       $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                               SET     showOrder = showOrder + 1
-                               WHERE   showOrder >= ?
-                                       AND menuPosition = ?";
-                       $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute(array(
-                               $showOrder,
-                               $menuPosition
-                       ));
-               }
-       }
-       
        /**
         * Returns show order for a new menu item.
         * 
@@ -152,27 +115,33 @@ 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) {
                        // get next number in row
                        $sql = "SELECT  MAX(showOrder) AS showOrder
                                FROM    wcf".WCF_N."_page_menu_item
-                               WHERE   menuPosition = ?";
+                               WHERE   parentMenuItem = ?
+                                       AND menuPosition = ?";
                        $statement = WCF::getDB()->prepareStatement($sql);
-                       $statement->execute(array($menuPosition));
+                       $statement->execute(array(
+                               $parentMenuItem,
+                               $menuPosition
+                       ));
                        $row = $statement->fetchArray();
                        if (!empty($row)) $showOrder = intval($row['showOrder']) + 1;
                        else $showOrder = 1;
                }
                else {
                        $sql = "UPDATE  wcf".WCF_N."_page_menu_item
-                               SET     showOrder = showOrder + 1
-                               WHERE   showOrder >= ?
-                                       AND menuPosition = ?";
+                               SET     showOrder = showOrder + 1
+                               WHERE   parentMenuItem = ?
+                                       AND menuPosition = ?
+                                       AND showOrder >= ?";
                        $statement = WCF::getDB()->prepareStatement($sql);
                        $statement->execute(array(
-                               $showOrder,
-                               $menuPosition
+                               $parentMenuItem,
+                               $menuPosition,
+                               $showOrder
                        ));
                }
                
@@ -180,9 +149,9 @@ class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCached
        }
        
        /**
-        * @see wcf\data\IEditableCachedObject::resetCache()
+        * @see wcf\data\IEditableCachedObject::resetCache()
         */
        public static function resetCache() {
-               CacheHandler::getInstance()->clear(WCF_DIR.'cache', 'cache.pageMenu-*.php');
+               PageMenuCacheBuilder::getInstance()->reset();
        }
 }