Resolve language item-related PIP GUI todos
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / system / package / plugin / UserMenuPackageInstallationPlugin.class.php
1 <?php
2 namespace wcf\system\package\plugin;
3 use wcf\data\user\menu\item\UserMenuItemEditor;
4 use wcf\system\devtools\pip\IGuiPackageInstallationPlugin;
5 use wcf\system\form\builder\container\IFormContainer;
6 use wcf\system\form\builder\field\ClassNameFormField;
7 use wcf\system\form\builder\field\dependency\ValueFormFieldDependency;
8 use wcf\system\form\builder\field\IconFormField;
9 use wcf\system\form\builder\field\SingleSelectionFormField;
10 use wcf\system\form\builder\field\TextFormField;
11 use wcf\system\form\builder\field\validation\FormFieldValidatorUtil;
12 use wcf\system\form\builder\IFormDocument;
13 use wcf\system\menu\user\IUserMenuItemProvider;
14
15 /**
16 * Installs, updates and deletes user menu items.
17 *
18 * @author Alexander Ebert, Matthias Schmidt
19 * @copyright 2001-2018 WoltLab GmbH
20 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
21 * @package WoltLabSuite\Core\System\Package\Plugin
22 */
23 class UserMenuPackageInstallationPlugin extends AbstractMenuPackageInstallationPlugin implements IGuiPackageInstallationPlugin {
24 /**
25 * @inheritDoc
26 */
27 public $className = UserMenuItemEditor::class;
28
29 /**
30 * @inheritDoc
31 */
32 public $tableName = 'user_menu_item';
33
34 /**
35 * @inheritDoc
36 */
37 public $tagName = 'usermenuitem';
38
39 /**
40 * @inheritDoc
41 */
42 protected function prepareImport(array $data) {
43 $result = parent::prepareImport($data);
44
45 // class name
46 if (!empty($data['elements']['classname'])) {
47 $result['className'] = $data['elements']['classname'];
48 }
49
50 // FontAwesome icon name
51 if (!empty($data['elements']['iconclassname']) && preg_match('~^fa\-[a-z\-]+$~', $data['elements']['iconclassname'])) {
52 $result['iconClassName'] = $data['elements']['iconclassname'];
53 }
54
55 return $result;
56 }
57
58 /**
59 * @inheritDoc
60 * @since 3.2
61 */
62 protected function addFormFields(IFormDocument $form) {
63 parent::addFormFields($form);
64
65 /** @var IFormContainer $dataContainer */
66 $dataContainer = $form->getNodeById('data');
67
68 // add menu item className form field
69
70 $classNameFormField = ClassNameFormField::create()
71 ->implementedInterface(IUserMenuItemProvider::class);
72 $dataContainer->insertBefore($classNameFormField, 'menuItemController');
73
74 // add menu item icon form field
75
76 /** @var SingleSelectionFormField $parentMenuItemFormField */
77 $parentMenuItemFormField = $form->getNodeById('parentMenuItem');
78
79 $dataContainer->appendChild(IconFormField::create('iconClassName')
80 ->objectProperty('iconclassname')
81 ->label('wcf.acp.pip.userMenu.iconClassName')
82 ->description('wcf.acp.pip.userMenu.iconClassName.description')
83 ->required()
84 ->addDependency(
85 // only first level menu items support icons
86 ValueFormFieldDependency::create('parentMenuItem')
87 ->field($parentMenuItemFormField)
88 ->values([''])
89 ));
90
91 // add additional data to default fields
92
93 /** @var TextFormField $menuItemFormField */
94 $menuItemFormField = $form->getNodeById('menuItem');
95 $menuItemFormField
96 ->description('wcf.acp.pip.userMenu.menuItem.description')
97 ->addValidator(FormFieldValidatorUtil::getRegularExpressionValidator(
98 '[a-z]+\.user.menu(\.[A-z0-9])+',
99 'wcf.acp.pip.userMenu.menuItem'
100 ));
101
102 // add dependencies to default fields
103
104 $menuItemLevels = ['' => 0] + $this->getMenuStructureData()['levels'];
105
106 // menu items on the first and second level do not support links,
107 // thus the parent menu item must be at least on the second level
108 // for the menu item to support links
109 $menuItemsSupportingLinks = array_keys(array_filter($menuItemLevels, function($menuItemLevel) {
110 return $menuItemLevel >= 2;
111 }));
112
113 foreach (['menuItemController', 'menuItemLink'] as $nodeId) {
114 /** @var TextFormField $formField */
115 $formField = $form->getNodeById($nodeId);
116 $formField->addDependency(
117 ValueFormFieldDependency::create('parentMenuItem')
118 ->field($parentMenuItemFormField)
119 ->values($menuItemsSupportingLinks)
120 );
121 }
122 }
123
124 /**
125 * @inheritDoc
126 * @since 3.2
127 */
128 protected function doGetElementData(\DOMElement $element, $saveData) {
129 $data = parent::doGetElementData($element);
130
131 $className = $element->getElementsByTagName('classname')->item(0);
132 if ($className !== null) {
133 $data['className'] = $className->nodeValue;
134 }
135
136 $icon = $element->getElementsByTagName('iconclassname')->item(0);
137 if ($icon !== null) {
138 $data['iconClassName'] = $icon->nodeValue;
139 }
140
141 return $data;
142 }
143
144 /**
145 * @inheritDoc
146 * @since 3.2
147 */
148 protected function doCreateXmlElement(\DOMDocument $document, IFormDocument $form) {
149 $menuItem = parent::doCreateXmlElement($document, $form);
150
151 $this->appendElementChildren(
152 $menuItem,
153 [
154 'classname' => '',
155 'iconclassname' => ''
156 ],
157 $form
158 );
159
160 return $menuItem;
161 }
162 }