formElement = $formElement;
$classes = [static::INPUT_ELEMENT_CLASS];
if ($formElement instanceof FormSubmitElement) {
$classes[] = static::SUBMIT_ELEMENT_CLASS;
}
$decorator->getAttributes()->add('class', $classes);
$formElement->prependWrapper($decorator);
}
protected function assembleDescription()
{
$description = $this->formElement->getDescription();
if ($description !== null) {
$descriptionId = null;
if ($this->formElement->getAttributes()->has('id')) {
$descriptionId = 'desc_' . $this->formElement->getAttributes()->get('id')->getValue();
$this->formElement->getAttributes()->set('aria-describedby', $descriptionId);
}
return Html::tag('p', ['id' => $descriptionId, 'class' => static::DESCRIPTION_CLASS], $description);
}
return null;
}
protected function assembleElement()
{
if ($this->formElement->isRequired()) {
$this->formElement->getAttributes()->set('aria-required', 'true');
}
return $this->formElement;
}
protected function assembleErrors()
{
$errors = new HtmlElement('ul', Attributes::create(['class' => static::ERROR_CLASS]));
foreach ($this->formElement->getMessages() as $message) {
$errors->addHtml(
new HtmlElement('li', Attributes::create(['class' => static::ERROR_CLASS]), Text::create($message))
);
}
if (! $errors->isEmpty()) {
return $errors;
}
return null;
}
protected function assembleLabel()
{
$label = $this->formElement->getLabel();
if ($label !== null) {
$attributes = null;
if ($this->formElement->getAttributes()->has('id')) {
$attributes = new Attributes(['for' => $this->formElement->getAttributes()->get('id')->getValue()]);
}
return Html::tag('label', $attributes, $label);
}
return null;
}
protected function assemble()
{
if ($this->formElement->hasBeenValidated() && ! $this->formElement->isValid()) {
$this->getAttributes()->add('class', static::ERROR_HINT_CLASS);
}
$this->addHtml(...Html::wantHtmlList([
$this->assembleLabel(),
$this->assembleElement(),
$this->assembleDescription(),
$this->assembleErrors()
]));
}
}