2 namespace wcf\data\page\menu\item
;
3 use wcf\data\DatabaseObjectEditor
;
4 use wcf\data\IEditableCachedObject
;
5 use wcf\system\cache\CacheHandler
;
9 * Provides functions to edit page menu items.
11 * @author Alexander Ebert
12 * @copyright 2001-2012 WoltLab GmbH
13 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14 * @package com.woltlab.wcf
15 * @subpackage data.page.menu.item
16 * @category Community Framework
18 class PageMenuItemEditor
extends DatabaseObjectEditor
implements IEditableCachedObject
{
20 * @see wcf\data\DatabaseObjectDecorator::$baseClass
22 protected static $baseClass = 'wcf\data\page\menu\item\PageMenuItem';
25 * @see wcf\data\IEditableObject::create()
27 * @todo Handle language id and create related language item
29 public static function create(array $parameters = array()) {
30 // calculate show order
31 $parameters['showOrder'] = self
::getShowOrder($parameters['showOrder'], $parameters['menuPosition']);
33 return parent
::create($parameters);
37 * @see wcf\data\IEditableObject::update()
39 * @todo Handle language id and update related language item
41 public function update(array $parameters = array()) {
42 if (isset($parameters['menuPosition']) && isset($parameters['showOrder'])) {
43 $this->updateShowOrder($parameters['showOrder'], $parameters['menuPosition']);
46 parent
::update($parameters);
50 * @see wcf\data\IEditableObject::delete()
52 public function delete() {
54 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
55 SET showOrder = showOrder - 1
57 AND menuPosition = ?";
58 $statement = WCF
::getDB()->prepareStatement($sql);
59 $statement->execute(array(
68 * Sets current page menu item as landing page.
70 public function setAsLandingPage() {
71 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
72 SET isLandingPage = 0";
73 $statement = WCF
::getDB()->prepareStatement($sql);
74 $statement->execute();
76 $this->update(array('isLandingPage' => 1));
80 * Updates the positions of a page menu item directly.
82 * @param integer $menuItemID
83 * @param string $menuPosition
84 * @param integer $showOrder
86 public static function setShowOrder($menuItemID, $menuPosition = 'header', $showOrder = 1) {
88 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
91 WHERE menuItemID = ?";
92 $statement = WCF
::getDB()->prepareStatement($sql);
93 $statement->execute(array(
101 * Updates show order for current menu item.
103 * @param integer $showOrder
104 * @param string $menuPosition
106 protected function updateShowOrder($showOrder, $menuPosition) {
107 if ($menuPosition == $this->menuPosition
) {
108 if ($this->showOrder
!= $showOrder) {
109 if ($showOrder < $this->showOrder
) {
110 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
111 SET showOrder = showOrder + 1
114 AND menuPosition = ?";
115 $statement = WCF
::getDB()->prepareStatement($sql);
116 $statement->execute(array(
122 else if ($showOrder > $this->showOrder
) {
123 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
124 SET showOrder = showOrder - 1
127 AND menuPosition = ?";
128 $statement = WCF
::getDB()->prepareStatement($sql);
129 $statement->execute(array(
138 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
139 SET showOrder = showOrder - 1
141 AND menuPosition = ?";
142 $statement = WCF
::getDB()->prepareStatement($sql);
143 $statement->execute(array(
148 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
149 SET showOrder = showOrder + 1
151 AND menuPosition = ?";
152 $statement = WCF
::getDB()->prepareStatement($sql);
153 $statement->execute(array(
161 * Returns show order for a new menu item.
163 * @param integer $showOrder
164 * @param string $menuPosition
167 protected static function getShowOrder($showOrder, $menuPosition) {
168 if ($showOrder == 0) {
169 // get next number in row
170 $sql = "SELECT MAX(showOrder) AS showOrder
171 FROM wcf".WCF_N
."_page_menu_item
172 WHERE menuPosition = ?";
173 $statement = WCF
::getDB()->prepareStatement($sql);
174 $statement->execute(array($menuPosition));
175 $row = $statement->fetchArray();
176 if (!empty($row)) $showOrder = intval($row['showOrder']) +
1;
180 $sql = "UPDATE wcf".WCF_N
."_page_menu_item
181 SET showOrder = showOrder + 1
183 AND menuPosition = ?";
184 $statement = WCF
::getDB()->prepareStatement($sql);
185 $statement->execute(array(
195 * @see wcf\data\IEditableCachedObject::resetCache()
197 public static function resetCache() {
198 CacheHandler
::getInstance()->clear(WCF_DIR
.'cache', 'cache.pageMenu.php');