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(); * * # => * * echo Button::create('Yes') * # => * * echo Button::create('Yes', 'aName') * # => * * echo Button::create('Yes', array('a' => 1, 'b' => 2)) * # => * * echo Button::create('Yes', 'aName', array('a' => 1, 'b' => 2)), * # => * @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)); } }