2 namespace wcf\acp\form
;
3 use wcf\data\menu\item\MenuItem
;
4 use wcf\data\menu\item\MenuItemAction
;
5 use wcf\data\menu\item\MenuItemEditor
;
6 use wcf\data\menu\item\MenuItemNodeTree
;
7 use wcf\data\menu\Menu
;
8 use wcf\data\page\Page
;
9 use wcf\data\page\PageNodeTree
;
10 use wcf\form\AbstractForm
;
11 use wcf\system\exception\IllegalLinkException
;
12 use wcf\system\exception\UserInputException
;
13 use wcf\system\language\I18nHandler
;
14 use wcf\system\page\handler\ILookupPageHandler
;
15 use wcf\system\request\LinkHandler
;
17 use wcf\util\StringUtil
;
20 * Shows the menu item add form.
23 * @copyright 2001-2019 WoltLab GmbH
24 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
25 * @package WoltLabSuite\Core\Acp\Form
28 class MenuItemAddForm
extends AbstractForm
{
32 public $activeMenuItem = 'wcf.acp.menu.link.cms.menu.list';
37 public $neededPermissions = ['admin.content.cms.canManageMenu'];
55 public $isDisabled = false;
61 public $isInternalLink = true;
64 * list of page handlers by page id
65 * @var \wcf\system\page\handler\IMenuPageHandler[]
67 public $pageHandlers = [];
73 public $pageID = null;
79 public $pageObjectID = null;
91 public $externalURL = '';
94 * id of the parent menu item
97 public $parentItemID = null;
103 public $showOrder = 0;
106 * menu item node tree
107 * @var MenuItemNodeTree
109 public $menuItems = null;
112 * nested list of page nodes
113 * @var \RecursiveIteratorIterator
115 public $pageNodeList;
120 public function readParameters() {
121 parent
::readParameters();
123 if (isset($_REQUEST['menuID'])) $this->menuID
= intval($_REQUEST['menuID']);
124 $this->menu
= new Menu($this->menuID
);
125 if (!$this->menu
->menuID
) {
126 throw new IllegalLinkException();
129 I18nHandler
::getInstance()->register('title');
130 I18nHandler
::getInstance()->register('externalURL');
132 $this->pageNodeList
= (new PageNodeTree())->getNodeList();
134 // fetch page handlers
135 foreach ($this->pageNodeList
as $pageNode) {
136 $handler = $pageNode->getHandler();
137 if ($handler !== null) {
138 if ($handler instanceof ILookupPageHandler
) {
139 $this->pageHandlers
[$pageNode->pageID
] = $pageNode->requireObjectID
;
148 public function readFormParameters() {
149 parent
::readFormParameters();
151 I18nHandler
::getInstance()->readValues();
152 if (I18nHandler
::getInstance()->isPlainValue('title')) $this->title
= I18nHandler
::getInstance()->getValue('title');
153 if (I18nHandler
::getInstance()->isPlainValue('externalURL')) $this->externalURL
= I18nHandler
::getInstance()->getValue('externalURL');
155 if (isset($_POST['isDisabled'])) $this->isDisabled
= true;
156 $this->isInternalLink
= false;
157 if (isset($_POST['isInternalLink'])) $this->isInternalLink
= (bool) $_POST['isInternalLink'];
158 if (!empty($_POST['pageID'])) $this->pageID
= intval($_POST['pageID']);
159 if (!empty($_POST['pageObjectID'])) $this->pageObjectID
= intval($_POST['pageObjectID']);
160 if (!empty($_POST['parentItemID'])) $this->parentItemID
= intval($_POST['parentItemID']);
161 if (isset($_POST['showOrder'])) $this->showOrder
= intval($_POST['showOrder']);
167 public function validate() {
170 // validate parent menu item
171 if ($this->parentItemID
) {
172 $parentMenuItem = new MenuItem($this->parentItemID
);
173 if (!$parentMenuItem->itemID ||
$parentMenuItem->menuID
!= $this->menuID
) {
174 throw new UserInputException('parentItemID', 'invalid');
178 // validate page menu item name
179 if (!I18nHandler
::getInstance()->validateValue('title')) {
180 if (I18nHandler
::getInstance()->isPlainValue('title')) {
181 throw new UserInputException('title');
184 throw new UserInputException('title', 'multilingual');
188 // validate menu item controller
189 if ($this->isInternalLink
) {
190 $this->externalURL
= '';
192 if (!$this->pageID
) {
193 throw new UserInputException('pageID');
195 $page = new Page($this->pageID
);
196 if (!$page->pageID
) {
197 throw new UserInputException('pageID', 'invalid');
200 // validate page object id
201 if ($page->requireObjectID
) {
202 if (isset($this->pageHandlers
[$page->pageID
])) {
203 if ($this->pageHandlers
[$page->pageID
] && !$this->pageObjectID
) {
204 throw new UserInputException('pageObjectID');
207 /** @var ILookupPageHandler $handler */
208 $handler = $page->getHandler();
209 if ($this->pageObjectID
&& !$handler->isValid($this->pageObjectID
)) {
210 throw new UserInputException('pageObjectID', 'invalid');
214 // page requires an object id, but no handler is registered
215 throw new UserInputException('pageID', 'invalid');
220 $this->pageID
= $this->pageObjectID
= null;
222 // validate external url
223 if (!I18nHandler
::getInstance()->validateValue('externalURL')) {
224 throw new UserInputException('externalURL');
232 public function save() {
235 $this->objectAction
= new MenuItemAction([], 'create', ['data' => array_merge($this->additionalFields
, [
236 'isDisabled' => $this->isDisabled ?
1 : 0,
237 'title' => $this->title
,
238 'pageID' => $this->pageID
,
239 'pageObjectID' => $this->pageObjectID ?
: 0,
240 'externalURL' => $this->externalURL
,
241 'menuID' => $this->menuID
,
242 'parentItemID' => $this->parentItemID
,
243 'showOrder' => $this->showOrder
,
244 'identifier' => StringUtil
::getRandomID(),
247 $this->objectAction
->executeAction();
249 $returnValues = $this->objectAction
->getReturnValues();
250 $menuItem = $returnValues['returnValues'];
252 // set generic identifier
254 'identifier' => 'com.woltlab.wcf.generic'.$menuItem->itemID
256 if (!I18nHandler
::getInstance()->isPlainValue('title')) {
257 I18nHandler
::getInstance()->save('title', 'wcf.menu.item.'.$data['identifier'], 'wcf.menu');
258 $data['title'] = 'wcf.menu.item.'.$data['identifier'];
260 if (!I18nHandler
::getInstance()->isPlainValue('externalURL')) {
261 I18nHandler
::getInstance()->save('externalURL', 'wcf.menu.item.externalURL'.$menuItem->itemID
, 'wcf.menu');
262 $data['externalURL'] = 'wcf.menu.item.externalURL'.$menuItem->itemID
;
266 $menuItemEditor = new MenuItemEditor($menuItem);
267 $menuItemEditor->update($data);
272 // show success message
273 WCF
::getTPL()->assign([
275 'objectEditLink' => LinkHandler
::getInstance()->getControllerLink(MenuItemEditForm
::class, ['id' => $menuItem->itemID
]),
279 $this->isInternalLink
= true;
280 $this->isDisabled
= false;
281 $this->pageID
= $this->pageObjectID
= $this->parentItemID
= null;
282 $this->externalURL
= $this->title
= '';
283 $this->showOrder
= 0;
285 I18nHandler
::getInstance()->reset();
291 public function readData() {
294 $this->menuItems
= new MenuItemNodeTree($this->menuID
, null, false);
300 public function assignVariables() {
301 parent
::assignVariables();
303 I18nHandler
::getInstance()->assignVariables();
305 WCF
::getTPL()->assign([
307 'menuID' => $this->menuID
,
308 'menu' => $this->menu
,
309 'isDisabled' => $this->isDisabled
,
310 'isInternalLink' => $this->isInternalLink
,
311 'pageID' => $this->pageID
,
312 'pageObjectID' => $this->pageObjectID
,
313 'title' => $this->title
,
314 'externalURL' => $this->externalURL
,
315 'parentItemID' => $this->parentItemID
,
316 'showOrder' => $this->showOrder
,
317 'menuItemNodeList' => $this->menuItems
->getNodeList(),
318 'pageNodeList' => $this->pageNodeList
,
319 'pageHandlers' => $this->pageHandlers