3dbfc01ae910573f69258f02ad4378c2d59c5ca2
[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\builder\PageMenuCacheBuilder;
6 use wcf\system\WCF;
7
8 /**
9 * Provides functions to edit page menu items.
10 *
11 * @author Alexander Ebert
12 * @copyright 2001-2013 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'], $parameters['parentMenuItem']);
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 1 == 0; // TODO: fix me (avoid sniffing error)
43 parent::update($parameters);
44 }
45
46 /**
47 * @see wcf\data\IEditableObject::delete()
48 */
49 public function delete() {
50 // update show order
51 $sql = "UPDATE wcf".WCF_N."_page_menu_item
52 SET showOrder = showOrder - 1
53 WHERE showOrder >= ?
54 AND menuPosition = ?";
55 $statement = WCF::getDB()->prepareStatement($sql);
56 $statement->execute(array(
57 $this->showOrder,
58 $this->menuPosition
59 ));
60
61 parent::delete();
62 }
63
64 /**
65 * Sets first top header menu item as landing page.
66 */
67 public static function updateLandingPage() {
68 $sql = "UPDATE wcf".WCF_N."_page_menu_item
69 SET isLandingPage = 0";
70 $statement = WCF::getDB()->prepareStatement($sql);
71 $statement->execute();
72
73 $sql = "UPDATE wcf".WCF_N."_page_menu_item
74 SET isLandingPage = ?
75 WHERE menuPosition = ?
76 AND parentMenuItem = ?
77 AND menuItemController <> ?
78 ORDER BY showOrder ASC";
79 $statement = WCF::getDB()->prepareStatement($sql, 1);
80 $statement->execute(array(
81 1,
82 'header',
83 '',
84 ''
85 ));
86
87 self::resetCache();
88 }
89
90 /**
91 * Updates the positions of a page menu item directly.
92 *
93 * @param integer $menuItemID
94 * @param string $menuPosition
95 * @param integer $showOrder
96 */
97 public static function setShowOrder($menuItemID, $menuPosition = 'header', $showOrder = 1) {
98 // Update
99 $sql = "UPDATE wcf".WCF_N."_page_menu_item
100 SET showOrder = ?,
101 menuPosition = ?
102 WHERE menuItemID = ?";
103 $statement = WCF::getDB()->prepareStatement($sql);
104 $statement->execute(array(
105 $showOrder,
106 $menuPosition,
107 $menuItemID
108 ));
109 }
110
111 /**
112 * Returns show order for a new menu item.
113 *
114 * @param integer $showOrder
115 * @param string $menuPosition
116 * @return integer
117 */
118 protected static function getShowOrder($showOrder, $menuPosition, $parentMenuItem = '') {
119 if ($showOrder == 0) {
120 // get next number in row
121 $sql = "SELECT MAX(showOrder) AS showOrder
122 FROM wcf".WCF_N."_page_menu_item
123 WHERE parentMenuItem = ?
124 AND menuPosition = ?";
125 $statement = WCF::getDB()->prepareStatement($sql);
126 $statement->execute(array(
127 $parentMenuItem,
128 $menuPosition
129 ));
130 $row = $statement->fetchArray();
131 if (!empty($row)) $showOrder = intval($row['showOrder']) + 1;
132 else $showOrder = 1;
133 }
134 else {
135 $sql = "UPDATE wcf".WCF_N."_page_menu_item
136 SET showOrder = showOrder + 1
137 WHERE parentMenuItem = ?
138 AND menuPosition = ?
139 AND showOrder >= ?";
140 $statement = WCF::getDB()->prepareStatement($sql);
141 $statement->execute(array(
142 $parentMenuItem,
143 $menuPosition,
144 $showOrder
145 ));
146 }
147
148 return $showOrder;
149 }
150
151 /**
152 * @see wcf\data\IEditableCachedObject::resetCache()
153 */
154 public static function resetCache() {
155 PageMenuCacheBuilder::getInstance()->reset();
156 }
157 }