summaryrefslogtreecommitdiff
path: root/platform/www/lib/plugins/bureaucracy/helper/fielduser.php
diff options
context:
space:
mode:
Diffstat (limited to 'platform/www/lib/plugins/bureaucracy/helper/fielduser.php')
-rw-r--r--platform/www/lib/plugins/bureaucracy/helper/fielduser.php99
1 files changed, 99 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/bureaucracy/helper/fielduser.php b/platform/www/lib/plugins/bureaucracy/helper/fielduser.php
new file mode 100644
index 0000000..49608e1
--- /dev/null
+++ b/platform/www/lib/plugins/bureaucracy/helper/fielduser.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Class helper_plugin_bureaucracy_fielduser
+ *
+ * Create single user input, with autocompletion
+ */
+class helper_plugin_bureaucracy_fielduser 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'] .= ' userpicker';
+ }
+
+ /**
+ * 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, '/') .
+ '(?:\.(.*?))?' . //match attribute after "."
+ '(?:\((.*?)\))?' . //match parameter enclosed in "()". Used for grps separator
+ '\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'];
+ //attr doesn't exists
+ if (!isset($matches[2])) {
+ return is_null($value) || $value === false ? '' : $value;
+ }
+ $attr = $matches[2];
+
+ $udata = $auth->getUserData($value);
+ //no such user
+ if ($udata === false) {
+ return $matches[0];
+ }
+
+ switch($attr) {
+ case 'name':
+ case 'mail':
+ return $udata[$attr];
+ case 'grps':
+ $delitmiter = ', ';
+ if (isset($matches[3])) {
+ $delitmiter = $matches[3];
+ }
+ return implode($delitmiter, $udata['grps']);
+ 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;
+ $value = $this->getParam('value');
+ if (!is_null($value) && $auth->getUserData($value) === false) {
+ throw new Exception(sprintf($this->getLang('e_user'),hsc($this->getParam('display'))));
+ }
+ }
+}