From 1eaa9d03f6f32e75edc90c0232b666bd3a0e5cde Mon Sep 17 00:00:00 2001 From: Matthias Schmidt Date: Tue, 8 May 2018 07:13:17 +0200 Subject: [PATCH] Add and use user group option form field See #2545 --- .../builder/field/OptionFormField.class.php | 8 +- .../field/UserGroupOptionFormField.class.php | 106 ++++++++++++++++++ ...ectTypePackageInstallationPlugin.class.php | 42 ++----- ...onEventPackageInstallationPlugin.class.php | 31 +---- ...ileMenuPackageInstallationPlugin.class.php | 31 +---- wcfsetup/install/lang/de.xml | 8 +- wcfsetup/install/lang/en.xml | 24 ++-- 7 files changed, 149 insertions(+), 101 deletions(-) create mode 100644 wcfsetup/install/files/lib/system/form/builder/field/UserGroupOptionFormField.class.php diff --git a/wcfsetup/install/files/lib/system/form/builder/field/OptionFormField.class.php b/wcfsetup/install/files/lib/system/form/builder/field/OptionFormField.class.php index b41c727b4e..91f63321e7 100644 --- a/wcfsetup/install/files/lib/system/form/builder/field/OptionFormField.class.php +++ b/wcfsetup/install/files/lib/system/form/builder/field/OptionFormField.class.php @@ -9,7 +9,7 @@ use wcf\system\WCF; /** * Implementation of a form field for options. * - * This field uses the `wcf.form.field.options` language item as the default + * This field uses the `wcf.form.field.option` language item as the default * form field label and uses `options` as the default node id. * * @author Matthias Schmidt @@ -29,7 +29,7 @@ class OptionFormField extends ItemListFormField { * Creates a new instance of `OptionsFormField`. */ public function __construct() { - $this->label('wcf.form.field.options'); + $this->label('wcf.form.field.option'); } /** @@ -47,7 +47,7 @@ class OptionFormField extends ItemListFormField { * empty array is given, all packages will be considered. * * @param int[] $packageIDs - * @return OptionFormField + * @return static * * @throws \InvalidArgumentException if the given package ids are invalid */ @@ -89,7 +89,7 @@ class OptionFormField extends ItemListFormField { $this->addValidationError( new FormFieldValidationError( 'nonExistent', - 'wcf.form.field.options.error.nonExistent', + 'wcf.form.field.option.error.nonExistent', ['options' => $unknownOptions] ) ); diff --git a/wcfsetup/install/files/lib/system/form/builder/field/UserGroupOptionFormField.class.php b/wcfsetup/install/files/lib/system/form/builder/field/UserGroupOptionFormField.class.php new file mode 100644 index 0000000000..ad178d19e8 --- /dev/null +++ b/wcfsetup/install/files/lib/system/form/builder/field/UserGroupOptionFormField.class.php @@ -0,0 +1,106 @@ + + * @package WoltLabSuite\Core\System\Form\Builder\Field + * @since 3.2 + */ +class UserGroupOptionFormField extends ItemListFormField { + /** + * ids of the packages whose user group options will be considered + * @var int[] + */ + protected $__packageIDs = []; + + /** + * Creates a new instance of `OptionsFormField`. + */ + public function __construct() { + $this->label('wcf.form.field.userGroupOption'); + } + + /** + * Returns the ids of the packages whose user group options will be considered. + * An empty array is returned if all packages are considered. + * + * @return int[] + */ + public function getPackageIDs(): array { + return $this->__packageIDs; + } + + /** + * Sets the ids of the packages whose user group options will be considered. + * If an empty array is given, all packages will be considered. + * + * @param int[] $packageIDs + * @return static + * + * @throws \InvalidArgumentException if the given package ids are invalid + */ + public function packageIDs(array $packageIDs): UserGroupOptionFormField { + foreach ($packageIDs as $packageID) { + if (PackageCache::getInstance()->getPackage($packageID) === null) { + throw new \InvalidArgumentException("Unknown package with id '{$packageID}'."); + } + } + + $this->__packageIDs = $packageIDs; + + return $this; + } + + /** + * @inheritDoc + */ + public function validate() { + parent::validate(); + + if (empty($this->getValidationErrors()) && is_array($this->getValue()) && !empty($this->getValue())) { + $conditionBuilder = new PreparedStatementConditionBuilder(); + $conditionBuilder->add('optionName IN (?)', [$this->getValue()]); + if (!empty($this->getPackageIDs())) { + $conditionBuilder->add('packageID IN (?)', [$this->getPackageIDs()]); + } + + $sql = "SELECT optionName + FROM wcf" . WCF_N . "_user_group_option + " . $conditionBuilder; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute($conditionBuilder->getParameters()); + $availableOptions = $statement->fetchAll(\PDO::FETCH_COLUMN); + + $unknownOptions = array_diff($this->getValue(), $availableOptions); + + if (!empty($unknownOptions)) { + $this->addValidationError( + new FormFieldValidationError( + 'nonExistent', + 'wcf.form.field.userGroupOption.error.nonExistent', + ['options' => $unknownOptions] + ) + ); + } + } + } + + /** + * @inheritDoc + */ + public static function create(string $id = 'permissions'): IFormNode { + return parent::create($id); + } +} diff --git a/wcfsetup/install/files/lib/system/package/plugin/ObjectTypePackageInstallationPlugin.class.php b/wcfsetup/install/files/lib/system/package/plugin/ObjectTypePackageInstallationPlugin.class.php index cb7fd10015..eca1c662e7 100644 --- a/wcfsetup/install/files/lib/system/package/plugin/ObjectTypePackageInstallationPlugin.class.php +++ b/wcfsetup/install/files/lib/system/package/plugin/ObjectTypePackageInstallationPlugin.class.php @@ -4,7 +4,6 @@ namespace wcf\system\package\plugin; use wcf\data\object\type\definition\ObjectTypeDefinitionList; use wcf\data\object\type\ObjectTypeCache; use wcf\data\object\type\ObjectTypeEditor; -use wcf\data\user\group\option\UserGroupOptionList; use wcf\data\DatabaseObjectList; use wcf\system\application\ApplicationHandler; use wcf\system\condition\AbstractIntegerCondition; @@ -22,6 +21,7 @@ use wcf\system\form\builder\container\IFormContainer; use wcf\system\form\builder\field\data\GuiPackageInstallationPluginFormFieldDataProcessor; use wcf\system\form\builder\field\dependency\ValueFormFieldDependency; use wcf\system\form\builder\field\OptionFormField; +use wcf\system\form\builder\field\UserGroupOptionFormField; use wcf\system\form\builder\field\validation\FormFieldValidationError; use wcf\system\form\builder\field\validation\FormFieldValidator; use wcf\system\form\builder\field\BooleanFormField; @@ -293,30 +293,6 @@ class ObjectTypePackageInstallationPlugin extends AbstractXMLPackageInstallation // add object type-specific fields - // reusable validators - $permissionValidator = new FormFieldValidator('permissionsExist', function(ItemListFormField $formField) { - $permissions = $formField->getValue(); - if (is_array($permissions)) { - $userGroupOptionList = new UserGroupOptionList(); - $userGroupOptionList->getConditionBuilder()->add('optionName IN (?)', [$permissions]); - $userGroupOptionList->readObjects(); - - if (count($userGroupOptionList) !== count($permissions)) { - foreach ($userGroupOptionList as $userGroupOption) { - unset($permissions[array_search($userGroupOption->optionName, $permissions)]); - } - - $formField->addValidationError( - new FormFieldValidationError( - 'nonExistent', - 'wcf.acp.pip.general.permissions.error.nonExistent', - ['permissions' => $permissions] - ) - ); - } - } - }); - // com.woltlab.wcf.adLocation $this->getObjectTypeDefinitionDataContainer($form, 'com.woltlab.wcf.adLocation') ->appendChildren([ @@ -387,11 +363,13 @@ class ObjectTypePackageInstallationPlugin extends AbstractXMLPackageInstallation array_keys($this->installation->getPackage()->getAllRequiredPackages()) )), - ItemListFormField::create('bulkProcessingUserPermissions') + UserGroupOptionFormField::create('bulkProcessingUserPermissions') ->attribute('data-tag', 'permissions') - ->label('wcf.acp.pip.general.permissions') ->description('wcf.acp.pip.objectType.com.woltlab.wcf.bulkProcessing.user.action.permissions.description') - ->addValidator($permissionValidator) + ->packageIDs(array_merge( + [$this->installation->getPackage()->packageID], + array_keys($this->installation->getPackage()->getAllRequiredPackages()) + )) ]); // com.woltlab.wcf.bulkProcessing.user.condition @@ -554,11 +532,13 @@ class ObjectTypePackageInstallationPlugin extends AbstractXMLPackageInstallation array_keys($this->installation->getPackage()->getAllRequiredPackages()) )), - ItemListFormField::create('taggingTaggableObjectPermissions') + UserGroupOptionFormField::create('taggingTaggableObjectPermissions') ->attribute('data-tag', 'permissions') - ->label('wcf.acp.pip.general.permissions') ->description('wcf.acp.pip.objectType.com.woltlab.wcf.tagging.taggableObject.permissions.description') - ->addValidator($permissionValidator) + ->packageIDs(array_merge( + [$this->installation->getPackage()->packageID], + array_keys($this->installation->getPackage()->getAllRequiredPackages()) + )) ]); // com.woltlab.wcf.user.activityPointEvent diff --git a/wcfsetup/install/files/lib/system/package/plugin/UserNotificationEventPackageInstallationPlugin.class.php b/wcfsetup/install/files/lib/system/package/plugin/UserNotificationEventPackageInstallationPlugin.class.php index 9aa64cca14..70d7ea1e6e 100644 --- a/wcfsetup/install/files/lib/system/package/plugin/UserNotificationEventPackageInstallationPlugin.class.php +++ b/wcfsetup/install/files/lib/system/package/plugin/UserNotificationEventPackageInstallationPlugin.class.php @@ -2,7 +2,6 @@ declare(strict_types=1); namespace wcf\system\package\plugin; use wcf\data\object\type\ObjectTypeCache; -use wcf\data\user\group\option\UserGroupOptionList; use wcf\data\user\notification\event\UserNotificationEvent; use wcf\data\user\notification\event\UserNotificationEventEditor; use wcf\data\user\notification\event\UserNotificationEventList; @@ -12,6 +11,7 @@ use wcf\system\devtools\pip\IGuiPackageInstallationPlugin; use wcf\system\devtools\pip\TXmlGuiPackageInstallationPlugin; use wcf\system\exception\SystemException; use wcf\system\form\builder\field\OptionFormField; +use wcf\system\form\builder\field\UserGroupOptionFormField; use wcf\system\form\builder\field\validation\FormFieldValidationError; use wcf\system\form\builder\field\validation\FormFieldValidator; use wcf\system\form\builder\field\BooleanFormField; @@ -255,31 +255,12 @@ class UserNotificationEventPackageInstallationPlugin extends AbstractXMLPackageI array_keys($this->installation->getPackage()->getAllRequiredPackages()) )), - ItemListFormField::create('permissions') - ->label('wcf.acp.pip.general.permissions') + UserGroupOptionFormField::create() ->description('wcf.acp.pip.userNotificationEvent.permissions.description') - ->addValidator(new FormFieldValidator('permissionsExist', function(ItemListFormField $formField) { - $permissions = $formField->getValue(); - if (is_array($permissions)) { - $userGroupOptionList = new UserGroupOptionList(); - $userGroupOptionList->getConditionBuilder()->add('optionName IN (?)', [$permissions]); - $userGroupOptionList->readObjects(); - - if (count($userGroupOptionList) !== count($permissions)) { - foreach ($userGroupOptionList as $userGroupOption) { - unset($permissions[array_search($userGroupOption->optionName, $permissions)]); - } - - $formField->addValidationError( - new FormFieldValidationError( - 'nonExistent', - 'wcf.acp.pip.general.permissions.error.nonExistent', - ['permissions' => $permissions] - ) - ); - } - } - })), + ->packageIDs(array_merge( + [$this->installation->getPackage()->packageID], + array_keys($this->installation->getPackage()->getAllRequiredPackages()) + )), SingleSelectionFormField::create('presetMailNotificationType') ->attribute('data-tag', 'presetmailnotificationtype') diff --git a/wcfsetup/install/files/lib/system/package/plugin/UserProfileMenuPackageInstallationPlugin.class.php b/wcfsetup/install/files/lib/system/package/plugin/UserProfileMenuPackageInstallationPlugin.class.php index 286d6f9c56..ee67fe1446 100644 --- a/wcfsetup/install/files/lib/system/package/plugin/UserProfileMenuPackageInstallationPlugin.class.php +++ b/wcfsetup/install/files/lib/system/package/plugin/UserProfileMenuPackageInstallationPlugin.class.php @@ -1,7 +1,6 @@ installation->getPackage()->getAllRequiredPackages()) )), - ItemListFormField::create('permissions') - ->label('wcf.acp.pip.general.permissions') + UserGroupOptionFormField::create() ->description('wcf.acp.pip.userProfileMenu.permissions.description') - ->addValidator(new FormFieldValidator('permissionsExist', function(ItemListFormField $formField) { - $permissions = $formField->getValue(); - if (is_array($permissions)) { - $userGroupOptionList = new UserGroupOptionList(); - $userGroupOptionList->getConditionBuilder()->add('optionName IN (?)', [$permissions]); - $userGroupOptionList->readObjects(); - - if (count($userGroupOptionList) !== count($permissions)) { - foreach ($userGroupOptionList as $userGroupOption) { - unset($permissions[array_search($userGroupOption->optionName, $permissions)]); - } - - $formField->addValidationError( - new FormFieldValidationError( - 'nonExistent', - 'wcf.acp.pip.general.permissions.error.nonExistent', - ['permissions' => $permissions] - ) - ); - } - } - })) + ->packageIDs(array_merge( + [$this->installation->getPackage()->packageID], + array_keys($this->installation->getPackage()->getAllRequiredPackages()) + )) ]); } diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml index eb0c1c046f..d555b02452 100644 --- a/wcfsetup/install/lang/de.xml +++ b/wcfsetup/install/lang/de.xml @@ -1746,9 +1746,6 @@ Als Benachrichtigungs-URL in der Konfiguration der sofortigen Zahlungsbestätigu - - - {$option}{/implode}. {if LANGUAGE_USE_INFORMAL_VARIANT}Du kannst{else}Sie können{/if} hier eine neue Berechtigung erstellen.]]> {$interfaceName} implementieren.]]> @@ -3126,7 +3123,10 @@ E-Mail-Adresse: {@$emailAddress} {* this line ends with a space *} {$parentClass}.]]> - {$option}{/implode}.]]> + + {$option}{/implode}.]]> + + {$option}{/implode}.]]> diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml index e51def9716..6f25afe151 100644 --- a/wcfsetup/install/lang/en.xml +++ b/wcfsetup/install/lang/en.xml @@ -1686,8 +1686,6 @@ When prompted for the notification URL for the instant payment notifications, pl - - {$permission}{/implode}. You can create a new permission here.]]> {$interfaceName}.]]> @@ -1705,8 +1703,8 @@ When prompted for the notification URL for the instant payment notifications, pl - - + + @@ -1747,8 +1745,8 @@ When prompted for the notification URL for the instant payment notifications, pl - - + + @@ -1858,8 +1856,8 @@ When prompted for the notification URL for the instant payment notifications, pl wcf\system\menu\user\profile\content\IUserProfileMenuContent.]]> - - + + @@ -1870,8 +1868,8 @@ When prompted for the notification URL for the instant payment notifications, pl wcf\system\user\notification\event\IUserNotificationEvent.]]> - - + + @@ -3187,8 +3185,10 @@ Email: {@$emailAddress} {* this line ends with a space *} {$parentClass}.]]> - - {$option}{/implode}.]]> + + {$option}{/implode}.]]> + + {$option}{/implode}.]]> -- 2.20.1