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 * Updates the positions of a page menu item directly.
69 *
70 * @param integer $menuItemID
71 * @param string $menuPosition
72 * @param integer $showOrder
73 */
74 public static function setShowOrder($menuItemID, $menuPosition = 'header', $showOrder = 1) {
75 // Update
76 $sql = "UPDATE wcf".WCF_N."_page_menu_item
77 SET showOrder = ?,
78 menuPosition = ?
79 WHERE menuItemID = ?";
80 $statement = WCF::getDB()->prepareStatement($sql);
81 $statement->execute(array(
82 $showOrder,
83 $menuPosition,
84 $menuItemID
85 ));
86 }
87
88 /**
89 * Updates show order for current menu item.
90 *
91 * @param integer $showOrder
92 * @param string $menuPosition
93 */
94 protected function updateShowOrder($showOrder, $menuPosition) {
95 if ($menuPosition == $this->menuPosition) {
96 if ($this->showOrder != $showOrder) {
97 if ($showOrder < $this->showOrder) {
98 $sql = "UPDATE wcf".WCF_N."_page_menu_item
99 SET showOrder = showOrder + 1
100 WHERE showOrder >= ?
101 AND showOrder < ?
102 AND menuPosition = ?";
103 $statement = WCF::getDB()->prepareStatement($sql);
104 $statement->execute(array(
105 $showOrder,
106 $this->showOrder,
107 $menuPosition
108 ));
109 }
110 else if ($showOrder > $this->showOrder) {
111 $sql = "UPDATE wcf".WCF_N."_page_menu_item
112 SET showOrder = showOrder - 1
113 WHERE showOrder <= ?
114 AND showOrder > ?
115 AND menuPosition = ?";
116 $statement = WCF::getDB()->prepareStatement($sql);
117 $statement->execute(array(
118 $showOrder,
119 $this->showOrder,
120 $menuPosition
121 ));
122 }
123 }
124 }
125 else {
126 $sql = "UPDATE wcf".WCF_N."_page_menu_item
127 SET showOrder = showOrder - 1
128 WHERE showOrder >= ?
129 AND menuPosition = ?";
130 $statement = WCF::getDB()->prepareStatement($sql);
131 $statement->execute(array(
132 $this->showOrder,
133 $this->menuPosition
134 ));
135
136 $sql = "UPDATE wcf".WCF_N."_page_menu_item
137 SET showOrder = showOrder + 1
138 WHERE showOrder >= ?
139 AND menuPosition = ?";
140 $statement = WCF::getDB()->prepareStatement($sql);
141 $statement->execute(array(
142 $showOrder,
143 $menuPosition
144 ));
145 }
146 }
147
148 /**
149 * Returns show order for a new menu item.
150 *
151 * @param integer $showOrder
152 * @param string $menuPosition
153 * @return integer
154 */
155 protected static function getShowOrder($showOrder, $menuPosition) {
156 if ($showOrder == 0) {
157 // get next number in row
158 $sql = "SELECT MAX(showOrder) AS showOrder
159 FROM wcf".WCF_N."_page_menu_item
160 WHERE menuPosition = ?";
161 $statement = WCF::getDB()->prepareStatement($sql);
162 $statement->execute(array($menuPosition));
163 $row = $statement->fetchArray();
164 if (!empty($row)) $showOrder = intval($row['showOrder']) + 1;
165 else $showOrder = 1;
166 }
167 else {
168 $sql = "UPDATE wcf".WCF_N."_page_menu_item
169 SET showOrder = showOrder + 1
170 WHERE showOrder >= ?
171 AND menuPosition = ?";
172 $statement = WCF::getDB()->prepareStatement($sql);
173 $statement->execute(array(
174 $showOrder,
175 $menuPosition
176 ));
177 }
178
179 return $showOrder;
180 }
181
182 /**
183 * @see wcf\data\IEditableCachedObject::resetCache()
184 */
185 public static function resetCache() {
186 CacheHandler::getInstance()->clear(WCF_DIR.'cache', 'cache.pageMenu-*.php');
187 }
188 }