prependWrapper($decorator); $decorator->formElement = $formElement; $classes = [static::INPUT_ELEMENT_CLASS]; if ($formElement instanceof FormSubmitElement) { $classes[] = static::SUBMIT_ELEMENT_CLASS; } $decorator->getAttributes()->add('class', $classes); } 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->ensureAssembled(); } 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) { if ($this->formElement instanceof FieldsetElement) { return new HtmlElement('legend', null, Text::create($label)); } else { $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); } if ($this->formElement instanceof FieldsetElement) { $element = $this->assembleElement(); $element->prependHtml(...Html::wantHtmlList([ $this->assembleLabel(), $this->assembleDescription() ])); $this->addHtml(...Html::wantHtmlList([ $element, $this->assembleErrors() ])); } else { $this->addHtml(...Html::wantHtmlList([ $this->assembleLabel(), $this->assembleElement(), $this->assembleDescription(), $this->assembleErrors() ])); } } }