diff --git a/src/Common/UiElement.php b/src/Common/UiElement.php index a869fdc..07bfb8b 100644 --- a/src/Common/UiElement.php +++ b/src/Common/UiElement.php @@ -178,7 +178,7 @@ class UiElement implements \ArrayAccess, \Iterator, \JsonSerializable { } else if ( !is_numeric($key) ) { # will output something like - $attributesList[] = "$key=\"$value\""; + $attributesList[] = strpos($value, '"') !== false ? "$key='$value'" : "$key=\"$value\""; } else { # will output something like @@ -186,7 +186,7 @@ class UiElement implements \ArrayAccess, \Iterator, \JsonSerializable { } } - + $content = ""; foreach ( $this->childs as $item ) { @@ -198,14 +198,14 @@ class UiElement implements \ArrayAccess, \Iterator, \JsonSerializable { } } - if ( in_array('no-tag', $this->options) ) { + if ( in_array('no-tag', $this->options, true) ) { return $this->content . $content; } else { - $compiledAttributes = (count($attributesList) && ! in_array('no-attr', $this->options) ? " " . implode(" ", $attributesList) : ""); + $compiledAttributes = (count($attributesList) && ! in_array('no-attr', $this->options, true) ? " " . implode(" ", $attributesList) : ""); # Force the node to contain a certain opening tag (php is a good example) - if ( in_array('force-tag-open', $this->options) ) { + if ( in_array('force-tag-open', $this->options, true) ) { $opentag = $this->options['force-tag-open'] . $compiledAttributes; } else { @@ -217,7 +217,7 @@ class UiElement implements \ArrayAccess, \Iterator, \JsonSerializable { $closetag = ""; } } - elseif ( in_array('force-tag-close', $this->options) ) { + elseif ( in_array('force-tag-close', $this->options, true) ) { $closetag = $this->options['force-tag-close']; } else { diff --git a/src/Form/UiCheckbox.php b/src/Form/UiCheckbox.php index 59bd1fb..7a9fcd8 100644 --- a/src/Form/UiCheckbox.php +++ b/src/Form/UiCheckbox.php @@ -2,12 +2,12 @@ namespace Picea\Ui\Form; -class UiCheckbox extends UiInput { +class UiCheckbox extends UiRadio { - public string $token = "ui.checkbox"; - - public array $attributes = [ - 'class' => "ui-checkbox", - 'type' => "checkbox", - ]; + public string $token = "ui.checkbox"; + + public array $attributes = [ + 'class' => "ui-checkbox", + 'type' => "checkbox", + ]; } diff --git a/src/Form/UiInput.php b/src/Form/UiInput.php index 2abeeda..fb8a63d 100644 --- a/src/Form/UiInput.php +++ b/src/Form/UiInput.php @@ -21,15 +21,29 @@ class UiInput extends UiElement implements Extension { 'tag-type' => "single", ]; + protected ? string $value; + + protected string $name; + public function parse(/*\Picae\Compiler\Context*/ &$context, ?string $arguments, string $token) : string { return "buildHtml($arguments) ?>"; } - public function buildHtml(string $name, ? string $value = null, array $attributes = []) : string + public function buildHtml(string $name, ? string $value = null, array $attributes = [], array $options = []) : string { - $this->setValue($value); - $this->attributes([ 'name' => $name ] + $attributes + $this->attributes); + $this->name = $name; + + if (null !== $this->value = $value) { + $this->setValue($value); + } + + if ($options) { + $this->options += $options; + } + + $this->attributes([ 'name' => $name ] + $attributes + $this->attributes + $this->objectAttribute()); + return $this->render(); } @@ -37,5 +51,9 @@ class UiInput extends UiElement implements Extension { { $this->attributes['value'] = $value; } - + + protected function objectAttribute() : array + { + return []; + } } diff --git a/src/Form/UiRadio.php b/src/Form/UiRadio.php index be8d1d7..b51b523 100644 --- a/src/Form/UiRadio.php +++ b/src/Form/UiRadio.php @@ -4,10 +4,21 @@ namespace Picea\Ui\Form; class UiRadio extends UiInput { - public string $token = "ui.radio"; + public string $token = "ui.radio"; - public array $attributes = [ - 'class' => "ui-radio", - 'type' => "radio", - ]; + public array $attributes = [ + 'class' => "ui-radio", + 'type' => "radio", + ]; + + protected function objectAttribute() : array + { + if ( $this->options['value'] ?? false && ( $this->options['value'] === $this->value ) ) { + return [ + 'checked' => "checked" + ]; + } + + return []; + } }