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
;
16 * Installs, updates and deletes user menu items.
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
23 class UserMenuPackageInstallationPlugin
extends AbstractMenuPackageInstallationPlugin
implements IGuiPackageInstallationPlugin
{
27 public $className = UserMenuItemEditor
::class;
32 public $tableName = 'user_menu_item';
37 public $tagName = 'usermenuitem';
42 protected function prepareImport(array $data) {
43 $result = parent
::prepareImport($data);
46 if (!empty($data['elements']['classname'])) {
47 $result['className'] = $data['elements']['classname'];
50 // FontAwesome icon name
51 if (!empty($data['elements']['iconclassname']) && preg_match('~^fa\-[a-z\-]+$~', $data['elements']['iconclassname'])) {
52 $result['iconClassName'] = $data['elements']['iconclassname'];
62 protected function addFormFields(IFormDocument
$form) {
63 parent
::addFormFields($form);
65 /** @var IFormContainer $dataContainer */
66 $dataContainer = $form->getNodeById('data');
68 // add menu item className form field
70 $classNameFormField = ClassNameFormField
::create()
71 ->implementedInterface(IUserMenuItemProvider
::class);
72 $dataContainer->insertBefore($classNameFormField, 'menuItemController');
74 // add menu item icon form field
76 /** @var SingleSelectionFormField $parentMenuItemFormField */
77 $parentMenuItemFormField = $form->getNodeById('parentMenuItem');
79 $dataContainer->appendChild(IconFormField
::create('iconClassName')
80 ->objectProperty('iconclassname')
81 ->label('wcf.acp.pip.userMenu.iconClassName')
82 ->description('wcf.acp.pip.userMenu.iconClassName.description')
85 // only first level menu items support icons
86 ValueFormFieldDependency
::create('parentMenuItem')
87 ->field($parentMenuItemFormField)
91 // add additional data to default fields
93 /** @var TextFormField $menuItemFormField */
94 $menuItemFormField = $form->getNodeById('menuItem');
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'
102 // add dependencies to default fields
104 $menuItemLevels = ['' => 0] +
$this->getMenuStructureData()['levels'];
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;
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)
128 protected function doGetElementData(\DOMElement
$element, $saveData) {
129 $data = parent
::doGetElementData($element);
131 $className = $element->getElementsByTagName('classname')->item(0);
132 if ($className !== null) {
133 $data['className'] = $className->nodeValue
;
136 $icon = $element->getElementsByTagName('iconclassname')->item(0);
137 if ($icon !== null) {
138 $data['iconClassName'] = $icon->nodeValue
;
148 protected function doCreateXmlElement(\DOMDocument
$document, IFormDocument
$form) {
149 $menuItem = parent
::doCreateXmlElement($document, $form);
151 $this->appendElementChildren(
155 'iconclassname' => ''