summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/bureaucracy/helper/fieldusers.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/bureaucracy/helper/fieldusers.php')
-rw-r--r--platform/www/lib/plugins/bureaucracy/helper/fieldusers.php96
1 files changed, 96 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/bureaucracy/helper/fieldusers.php b/platform/www/lib/plugins/bureaucracy/helper/fieldusers.php
new file mode 100644
index 0000000..bd5dce7
--- /dev/null
+++ b/platform/www/lib/plugins/bureaucracy/helper/fieldusers.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Class helper_plugin_bureaucracy_fieldusers
+ *
+ * Create multi-user input, with autocompletion
+ */
+class helper_plugin_bureaucracy_fieldusers extends helper_plugin_bureaucracy_fieldtextbox {
+
+ /**
+ * Arguments:
+ * - cmd
+ * - label
+ * - ^ (optional)
+ *
+ * @param array $args The tokenized definition, only split at spaces
+ */
+ public function initialize($args) {
+ parent::initialize($args);
+ $this->tpl['class'] .= ' userspicker';
+ }
+
+ /**
+ * Allow receiving user attributes by ".". Ex. user.name
+ * You can pass an optional argument to user.grps enclosed in brackets, used as an groups delimiter Ex. user.grps(, )
+ *
+ * @return string
+ */
+ public function getReplacementPattern() {
+ $label = $this->opt['label'];
+ return '/(@@|##)' . preg_quote($label, '/') .
+ '(?:\((?P<delimiter>.*?)\))?' .//delimiter
+ '(?:\.(?P<attribute>.*?))?' . //match attribute after "."
+ '\1/si';
+ }
+
+ /**
+ * Used as an callback for preg_replace_callback
+ *
+ * @param $matches
+ * @return string
+ */
+ public function replacementValueCallback($matches) {
+ /** @var DokuWiki_Auth_Plugin $auth */
+ global $auth;
+
+ $value = $this->opt['value'];
+ //copy the value by default
+ if (isset($matches[2]) && is_array($matches[2]) && count($matches[2]) == 2) {
+ return is_null($value) || $value === false ? $matches[0] : $value;
+ }
+
+ $attribute = isset($matches['attribute']) ? $matches['attribute'] : '';
+ //check if matched string containts a pair of brackets
+ $delimiter = preg_match('/\(.*\)/s', $matches[0]) ? $matches['delimiter'] : ', ';
+ $users = array_map('trim', explode(',', $value));
+
+ switch($attribute) {
+ case '':
+ return implode($delimiter, $users);
+ case 'name':
+ case 'mail':
+ return implode($delimiter, array_map(function ($user) use ($auth, $attribute) {
+ return $auth->getUserData($user)[$attribute];
+ }, $users));
+ default:
+ return $matches[0];
+ }
+ }
+
+ /**
+ * Return the callback for user replacement
+ *
+ * @return array
+ */
+ public function getReplacementValue() {
+ return array($this, 'replacementValueCallback');
+ }
+
+ /**
+ * Validate value of field
+ *
+ * @throws Exception when user not exists
+ */
+ protected function _validate() {
+ parent::_validate();
+
+ /** @var DokuWiki_Auth_Plugin $auth */
+ global $auth;
+ $users = array_filter(preg_split('/\s*,\s*/', $this->getParam('value')));
+ foreach ($users as $user) {
+ if ($auth->getUserData($user) === false) {
+ throw new Exception(sprintf($this->getLang('e_users'), hsc($this->getParam('display'))));
+ }
+ }
+ }
+}