true,
'accept' => true,
'alt' => true,
'autocomplete' => true,
'autofocus' => true,
'checked' => true,
'dirname' => true,
'disabled' => true,
'form' => true,
'formaction' => true,
'formenctype' => true,
'formmethod' => true,
'formnovalidate' => true,
'formtarget' => true,
'height' => true,
'list' => true,
'max' => true,
'maxlength' => true,
'min' => true,
'multiple' => true,
'pattern' => true,
'placeholder' => true,
'readonly' => true,
'required' => true,
'size' => true,
'src' => true,
'step' => true,
'type' => true,
'value' => true,
'width' => true,
];
/**
* Valid values for the input type
*
* @var array
*/
protected $validTypes = [
'text' => true,
'button' => true,
'checkbox' => true,
'file' => true,
'hidden' => true,
'image' => true,
'password' => true,
'radio' => true,
'reset' => true,
'select' => true,
'submit' => true,
'color' => true,
'date' => true,
'datetime' => true,
'datetime-local' => true,
'email' => true,
'month' => true,
'number' => true,
'range' => true,
'search' => true,
'tel' => true,
'time' => true,
'url' => true,
'week' => true,
];
/**
* Invoke helper as functor
*
* Proxies to {@link render()}.
*
* @template T as null|ElementInterface
* @psalm-param T $element
* @psalm-return (T is null ? self : string)
* @return string|FormInput
*/
public function __invoke(?ElementInterface $element = null)
{
if (! $element) {
return $this;
}
return $this->render($element);
}
/**
* Render a form element from the provided $element
*
* @throws Exception\DomainException
*/
public function render(ElementInterface $element): string
{
$name = $element->getName();
if ($name === null || $name === '') {
throw new Exception\DomainException(sprintf(
'%s requires that the element has an assigned name; none discovered',
__METHOD__
));
}
$attributes = $element->getAttributes();
$attributes['name'] = $name;
$type = $this->getType($element);
$attributes['type'] = $type;
$attributes['value'] = $element->getValue();
if ('password' === $type) {
$attributes['value'] = '';
}
return sprintf(
'createAttributesString($attributes),
$this->getInlineClosingBracket()
);
}
/**
* Determine input type to use
*/
protected function getType(ElementInterface $element): string
{
$type = $element->getAttribute('type');
if (empty($type)) {
return 'text';
}
$type = strtolower($type);
if (! isset($this->validTypes[$type])) {
return 'text';
}
return $type;
}
}