diff options
| author | Marcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de> | 2024-06-18 13:18:06 +0000 |
|---|---|---|
| committer | Marcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de> | 2024-06-18 13:18:06 +0000 |
| commit | 33fd1358507b4a5abb3dcebe78d407d0567717c1 (patch) | |
| tree | 6bd8f6959da4c3fc1b8907c0bbc28eb9e10d4a5a /lib/classes/Interactable.php | |
| parent | 42d46671c0309bddb71a91bbfdc5f2fa2e44384e (diff) | |
Deprecate `StudipAutoloader` and use composer's `autoload`
Closes #4282
Merge request studip/studip!3099
Diffstat (limited to 'lib/classes/Interactable.php')
| -rw-r--r-- | lib/classes/Interactable.php | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/lib/classes/Interactable.php b/lib/classes/Interactable.php new file mode 100644 index 0000000..9796f91 --- /dev/null +++ b/lib/classes/Interactable.php @@ -0,0 +1,204 @@ +<?php +/* + * Copyright (c) 2011 mlunzena@uos.de, aklassen@uos.de + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + */ + +namespace Studip; + +/** + * Represents an abstract interactable element. + */ +abstract class Interactable +{ + public $label, $attributes; + + /** + * Constructs a new element to interact e.g. button or link + * + * @param string $label the label of the button + * @param array $attributes the attributes of the button element + */ + final public function __construct($label, $attributes) + { + $this->label = $label; + $this->attributes = $attributes; + } + + /** + * Magic method (triggered when invoking inaccessible methods in a static + * context) used to dynamically create an interactable element with an + * additional CSSclass. This works for every static method call matching: + * /^create(.+)/ The matched group is used as CSS class for the + * interactable element. + * + * @code + * echo Button::createSubmit(); + * + * # => <button ... class="submit">... + * @endcode + * + * @param string $name name of the method being called + * @param array $args enumerated array containing the parameters + * passed to the $name'ed method + * + * @return Interactable returns a Button, if $name =~ /^create/ + * @throws throws a BadMethodCallException if $name does not + * match + */ + public static function __callStatic($name, $args) + { + # only trigger, if $name =~ /^create/ and at least using $label + if (0 === strncasecmp($name, 'create', 6)) { + + # instantiate button from arguments + $interactable = call_user_func_array([get_called_class(), 'create'], $args); + # but customize with class from $name: + $class = self::hyphenate(mb_substr($name, 6)); + + # a.) set name unless set + if (empty($args[1]) || !is_string($args[1])) { + $interactable->attributes['name'] = $class; + } + + # b.) set/append CSS class + if (array_key_exists('class', $interactable->attributes)) { + $interactable->attributes['class'] .= " $class"; + } else { + $interactable->attributes['class'] = $class; + } + + return $interactable; + } + + # otherwise bail out + throw new \BadMethodCallException(); + } + + /** + * Easy factory method to create an Interactable instance. + * All parameters are optional. + * + * @code + * // example using subclass Button + * + * echo Button::create(); + * # => <button type="submit" name="ok">ok</button> + * + * echo Button::create('Yes') + * # => <button type="submit" name="yes">yes</button> + * + * echo Button::create('Yes', 'aName') + * # => <button type="submit" name="aName">yes</button> + * + * echo Button::create('Yes', array('a' => 1, 'b' => 2)) + * # => <button type="submit" a="1" b="2" name="yes">yes</button> + * + * echo Button::create('Yes', 'aName', array('a' => 1, 'b' => 2)), + * # => <button type="submit" a="1" b="2" name="aName">yes</button> + * @endcode + * + * @param string $label the label of the current element + * @param string $trait the specific trait of the current element + * @param array $attributes the attributes of the button element + * + * @return Interactable element + */ + public static function create($label = NULL, $trait = NULL, $attributes = []) + { + $argc = func_num_args(); + + // if label is empty, use default + $label = $label ?: _('ok'); + + // if there are two parameters, there are two cases: + // 1.) label and trait OR + // 2.) label and attributes + // + // in the latter case, use parameter $trait as attributes + // and use the default for name + if ($argc === 2 && is_array($trait)) { + list($attributes, $trait) = [$trait, NULL]; + } + + $interactable = new static($label, $attributes); + $interactable->initialize($label, $trait, $attributes); + + return $interactable; + } + + /** + * Initialize an interactable element. + * The parameters to create are handed over to enable subclass + * specific customization. + * + * @param string $label the label of the current element + * @param string $trait the specific trait of the current element + * @param array $attributes the attributes of the button element + */ + abstract protected function initialize($label, $trait, $attributes); + + /** + * Convenience method used for autocompletion hints by your + * editor. + * + * Without this method #__callStatic would do the same. + * + * @param string $label the label of the current element + * @param string $trait the specific trait of the current element + * @param array $attributes the attributes of the button element + */ + public static function createAccept($label = NULL, $trait = NULL, $attributes = []) + { + $args = func_num_args() ? func_get_args() : [_('Übernehmen')]; + return self::__callStatic(__FUNCTION__, $args); + } + + /** + * Convenience method used for autocompletion hints by your + * editor. + * + * Without this method #__callStatic would do the same. + * + * @param string $label the label of the current element + * @param string $trait the specific trait of the current element + * @param array $attributes the attributes of the button element + */ + public static function createEdit($label = NULL, $trait = NULL, $attributes = []) + { + $args = func_num_args() ? func_get_args() : [_('Bearbeiten')]; + return self::__callStatic(__FUNCTION__, $args); + } + + /** + * Convenience method used for autocompletion hints by your + * editor. + * + * Without this method #__callStatic would do the same. + * + * @param string $label the label of the current element + * @param string $trait the specific trait of the current element + * @param array $attributes the attributes of the button element + */ + public static function createCancel($label = NULL, $trait = NULL, $attributes = []) + { + $args = func_num_args() ? func_get_args() : [_('Abbrechen')]; + return self::__callStatic(__FUNCTION__, $args); + } + + /** + * Hyphenates the passed word. + * + * @param string $word word to be hyphenated + * + * @return string hyphenated word + */ + private static function hyphenate($word) + { + return mb_strtolower(preg_replace('/(?<=\w)([A-Z])/', '-\\1', $word)); + } +} |
