setLabelPosition($labelPosition); } elseif ($this->labelPosition === null) { $this->setLabelPosition(self::LABEL_PREPEND); } if ($renderErrors !== null) { $this->setRenderErrors($renderErrors); } if ($partial !== null) { $this->setPartial($partial); } return $this->render($element); } /** * Utility form helper that renders a label (if it exists), an element and errors * * @param ElementInterface $element * @throws \Zend\Form\Exception\DomainException * @return string */ public function render(ElementInterface $element) { $escapeHtmlHelper = $this->getEscapeHtmlHelper(); $labelHelper = $this->getLabelHelper(); $elementHelper = $this->getElementHelper(); $elementErrorsHelper = $this->getElementErrorsHelper(); $label = $element->getLabel(); $inputErrorClass = $this->getInputErrorClass(); if (isset($label) && '' !== $label) { // Translate the label if (null !== ($translator = $this->getTranslator())) { $label = $translator->translate( $label, $this->getTranslatorTextDomain() ); } } // Does this element have errors ? if (count($element->getMessages()) > 0 && !empty($inputErrorClass)) { $classAttributes = ($element->hasAttribute('class') ? $element->getAttribute('class') . ' ' : ''); $classAttributes = $classAttributes . $inputErrorClass; $element->setAttribute('class', $classAttributes); } if ($this->partial) { $vars = array( 'element' => $element, 'label' => $label, 'labelAttributes' => $this->labelAttributes, 'labelPosition' => $this->labelPosition, 'renderErrors' => $this->renderErrors, ); return $this->view->render($this->partial, $vars); } if ($this->renderErrors) { $elementErrors = $elementErrorsHelper->render($element); } $elementString = $elementHelper->render($element); if (isset($label) && '' !== $label) { $label = $escapeHtmlHelper($label); $labelAttributes = $element->getLabelAttributes(); if (empty($labelAttributes)) { $labelAttributes = $this->labelAttributes; } // Multicheckbox elements have to be handled differently as the HTML standard does not allow nested // labels. The semantic way is to group them inside a fieldset $type = $element->getAttribute('type'); if ($type === 'multi_checkbox' || $type === 'radio') { $markup = sprintf( '
', $label, $elementString); } else { if ($element->hasAttribute('id')) { $labelOpen = ''; $labelClose = ''; $label = $labelHelper($element); } else { $labelOpen = $labelHelper->openTag($labelAttributes); $labelClose = $labelHelper->closeTag(); } if ($label !== '' && !$element->hasAttribute('id')) { $label = '' . $label . ''; } // Button element is a special case, because label is always rendered inside it if ($element instanceof Button) { $labelOpen = $labelClose = $label = ''; } switch ($this->labelPosition) { case self::LABEL_PREPEND: $markup = $labelOpen . $label . $elementString . $labelClose; break; case self::LABEL_APPEND: default: $markup = $labelOpen . $elementString . $label . $labelClose; break; } } if ($this->renderErrors) { $markup .= $elementErrors; } } else { if ($this->renderErrors) { $markup = $elementString . $elementErrors; } else { $markup = $elementString; } } return $markup; } /** * Set the class that is added to element that have errors * * @param string $inputErrorClass * @return FormRow */ public function setInputErrorClass($inputErrorClass) { $this->inputErrorClass = $inputErrorClass; return $this; } /** * Get the class that is added to element that have errors * * @return string */ public function getInputErrorClass() { return $this->inputErrorClass; } /** * Set the attributes for the row label * * @param array $labelAttributes * @return FormRow */ public function setLabelAttributes($labelAttributes) { $this->labelAttributes = $labelAttributes; return $this; } /** * Get the attributes for the row label * * @return array */ public function getLabelAttributes() { return $this->labelAttributes; } /** * Set the label position * * @param string $labelPosition * @throws \Zend\Form\Exception\InvalidArgumentException * @return FormRow */ public function setLabelPosition($labelPosition) { $labelPosition = strtolower($labelPosition); if (!in_array($labelPosition, array(self::LABEL_APPEND, self::LABEL_PREPEND))) { throw new Exception\InvalidArgumentException(sprintf( '%s expects either %s::LABEL_APPEND or %s::LABEL_PREPEND; received "%s"', __METHOD__, __CLASS__, __CLASS__, (string) $labelPosition )); } $this->labelPosition = $labelPosition; return $this; } /** * Get the label position * * @return string */ public function getLabelPosition() { return $this->labelPosition; } /** * Set if the errors are rendered by this helper * * @param bool $renderErrors * @return FormRow */ public function setRenderErrors($renderErrors) { $this->renderErrors = (bool) $renderErrors; return $this; } /** * Retrieve if the errors are rendered by this helper * * @return bool */ public function getRenderErrors() { return $this->renderErrors; } /** * Set a partial view script to use for rendering the row * * @param null|string $partial * @return FormRow */ public function setPartial($partial) { $this->partial = $partial; return $this; } /** * Retrieve current partial * * @return null|string */ public function getPartial() { return $this->partial; } /** * Retrieve the FormLabel helper * * @return FormLabel */ protected function getLabelHelper() { if ($this->labelHelper) { return $this->labelHelper; } if (method_exists($this->view, 'plugin')) { $this->labelHelper = $this->view->plugin('form_label'); } if (!$this->labelHelper instanceof FormLabel) { $this->labelHelper = new FormLabel(); } if ($this->hasTranslator()) { $this->labelHelper->setTranslator( $this->getTranslator(), $this->getTranslatorTextDomain() ); } return $this->labelHelper; } /** * Retrieve the FormElement helper * * @return FormElement */ protected function getElementHelper() { if ($this->elementHelper) { return $this->elementHelper; } if (method_exists($this->view, 'plugin')) { $this->elementHelper = $this->view->plugin('form_element'); } if (!$this->elementHelper instanceof FormElement) { $this->elementHelper = new FormElement(); } return $this->elementHelper; } /** * Retrieve the FormElementErrors helper * * @return FormElementErrors */ protected function getElementErrorsHelper() { if ($this->elementErrorsHelper) { return $this->elementErrorsHelper; } if (method_exists($this->view, 'plugin')) { $this->elementErrorsHelper = $this->view->plugin('form_element_errors'); } if (!$this->elementErrorsHelper instanceof FormElementErrors) { $this->elementErrorsHelper = new FormElementErrors(); } return $this->elementErrorsHelper; } }