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() ])); } }