Merge branch 'master' of github.com:WoltLab/WCF
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / data / page / menu / item / PageMenuItemEditor.class.php
1 <?php
2 namespace wcf\data\page\menu\item;
3 use wcf\data\DatabaseObjectEditor;
4 use wcf\data\IEditableCachedObject;
5 use wcf\system\cache\CacheHandler;
6 use wcf\system\WCF;
7
8 /**
9 * Provides functions to edit page menu items.
10 *
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
17 */
18 class PageMenuItemEditor extends DatabaseObjectEditor implements IEditableCachedObject {
19 /**
20 * @see wcf\data\DatabaseObjectDecorator::$baseClass
21 */
22 protected static $baseClass = 'wcf\data\page\menu\item\PageMenuItem';
23
24 /**
25 * @see wcf\data\IEditableObject::create()
26 *
27 * @todo Handle language id and create related language item
28 */
29 public static function create(array $parameters = array()) {
30 // calculate show order
31 $parameters['showOrder'] = self::getShowOrder($parameters['showOrder'], $parameters['menuPosition']);
32
33 return parent::create($parameters);
34 }
35
36 /**
37 * @see wcf\data\IEditableObject::update()
38 *
39 * @todo Handle language id and update related language item
40 */
41 public function update(array $parameters = array()) {
42 if (isset($parameters['menuPosition']) && isset($parameters['showOrder'])) {
43 $this->updateShowOrder($parameters['showOrder'], $parameters['menuPosition']);
44 }
45
46 parent::update($parameters);
47 }
48
49 /**
50 * @see wcf\data\IEditableObject::delete()
51 */
52 public function delete() {
53 // update show order
54 $sql = "UPDATE wcf".WCF_N."_page_menu_item
55 SET showOrder = showOrder - 1
56 WHERE showOrder >= ?
57 AND menuPosition = ?";
58 $statement = WCF::getDB()->prepareStatement($sql);
59 $statement->execute(array(
60 $this->showOrder,
61 $this->menuPosition
62 ));
63
64 parent::delete();
65 }
66
67 /**
68 * Sets current page menu item as landing page.
69 */
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();
75
76 $this->update(array('isLandingPage' => 1));
77 }
78
79 /**
80 * Updates the positions of a page menu item directly.
81 *
82 * @param integer $menuItemID
83 * @param string $menuPosition
84 * @param integer $showOrder
85 */
86 public static function setShowOrder($menuItemID, $menuPosition = 'header', $showOrder = 1) {
87 // Update
88 $sql = "UPDATE wcf".WCF_N."_page_menu_item
89 SET showOrder = ?,
90 menuPosition = ?
91 WHERE menuItemID = ?";
92 $statement = WCF::getDB()->prepareStatement($sql);
93 $statement->execute(array(
94 $showOrder,
95 $menuPosition,
96 $menuItemID
97 ));
98 }
99
100 /**
101 * Updates show order for current menu item.
102 *
103 * @param integer $showOrder
104 * @param string $menuPosition
105 */
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
112 WHERE showOrder >= ?
113 AND showOrder < ?
114 AND menuPosition = ?";
115 $statement = WCF::getDB()->prepareStatement($sql);
116 $statement->execute(array(
117 $showOrder,
118 $this->showOrder,
119 $menuPosition
120 ));
121 }
122 else if ($showOrder > $this->showOrder) {
123 $sql = "UPDATE wcf".WCF_N."_page_menu_item
124 SET showOrder = showOrder - 1
125 WHERE showOrder <= ?
126 AND showOrder > ?
127 AND menuPosition = ?";
128 $statement = WCF::getDB()->prepareStatement($sql);
129 $statement->execute(array(
130 $showOrder,
131 $this->showOrder,
132 $menuPosition
133 ));
134 }
135 }
136 }
137 else {
138 $sql = "UPDATE wcf".WCF_N."_page_menu_item
139 SET showOrder = showOrder - 1
140 WHERE showOrder >= ?
141 AND menuPosition = ?";
142 $statement = WCF::getDB()->prepareStatement($sql);
143 $statement->execute(array(
144 $this->showOrder,
145 $this->menuPosition
146 ));
147
148 $sql = "UPDATE wcf".WCF_N."_page_menu_item
149 SET showOrder = showOrder + 1
150 WHERE showOrder >= ?
151 AND menuPosition = ?";
152 $statement = WCF::getDB()->prepareStatement($sql);
153 $statement->execute(array(
154 $showOrder,
155 $menuPosition
156 ));
157 }
158 }
159
160 /**
161 * Returns show order for a new menu item.
162 *
163 * @param integer $showOrder
164 * @param string $menuPosition
165 * @return integer
166 */
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;
177 else $showOrder = 1;
178 }
179 else {
180 $sql = "UPDATE wcf".WCF_N."_page_menu_item
181 SET showOrder = showOrder + 1
182 WHERE showOrder >= ?
183 AND menuPosition = ?";
184 $statement = WCF::getDB()->prepareStatement($sql);
185 $statement->execute(array(
186 $showOrder,
187 $menuPosition
188 ));
189 }
190
191 return $showOrder;
192 }
193
194 /**
195 * @see wcf\data\IEditableCachedObject::resetCache()
196 */
197 public static function resetCache() {
198 CacheHandler::getInstance()->clear(WCF_DIR.'cache', 'cache.pageMenu.php');
199 }
200 }