/** * Helper function to recurse into form elements when rendering summary. * * @param ElementInterface $element * @return string */ protected function renderSummaryElement(ElementInterface $element) { if ($element instanceof Hidden || false === $element->getOption('render_summary')) { return ''; } if ($element instanceof ViewPartialProviderInterface) { $partial = $element->getViewPartial(); $summaryPartial = $partial . '.summary'; $partialParams = array('element' => $element); if (!$this->getView()->resolver($summaryPartial)) { $summaryPartial = $partial; $partialParams['renderSummary'] = true; } return $this->getView()->partial($summaryPartial, $partialParams); } if ($element instanceof EmptySummaryAwareInterface && $element->isSummaryEmpty()) { $emptySummaryNotice = $this->getTranslator()->translate($element->getEmptySummaryNotice(), $this->getTranslatorTextDomain()); $markup = sprintf('<div id="%s-empty-alert" class="empty-summary-notice alert alert-info"><p>%s</p></div>', $element->getAttribute('id'), $emptySummaryNotice); return $markup; } $label = $element->getLabel(); $markup = ''; if ($element instanceof FieldsetInterface) { if (!$element instanceof FormInterface && $label) { $markup .= '<h4>' . $label . '</h4>'; } foreach ($element as $el) { $markup .= $this->renderSummaryElement($el); } return $markup; } $elementValue = $element instanceof \Zend\Form\Element\Textarea ? nl2br($element->getValue()) : $element->getValue(); $markup .= '<div class="row">'; $col = 12; if ($label) { $markup .= '<div class="col-md-3"><strong>' . $label . '</strong></div>'; $col = 9; } $markup .= '<div class="col-md-' . $col . '">' . $elementValue . '</div>' . '</div>'; return $markup; }
/** * Utility form helper that renders a label (if it exists), an element and errors * * @param ElementInterface $element * @return string * @throws \Zend\Form\Exception\DomainException */ public function render(ElementInterface $element, $ignoreViewPartial = false) { $labelAttributes = $element->getLabelAttributes(); $labelWidth = $element->getOption('labelWidth'); if (!$labelWidth) { $labelWidth = $this->labelSpanWidth; } if ($element instanceof ViewPartialProviderInterface && !$ignoreViewPartial) { return $this->getView()->partial($element->getViewPartial(), array('element' => $element, 'labelWitdh' => $labelWidth, 'label_attributes' => $labelAttributes)); } $escapeHtmlHelper = $this->getEscapeHtmlHelper(); $labelHelper = $this->getLabelHelper(); $elementHelper = $this->getElementHelper(); $elementErrorsHelper = $this->getElementErrorsHelper(); $inputErrorClass = $this->getInputErrorClass(); $elementErrors = $elementErrorsHelper->render($element); // general Class $form_row_class = 'row'; if ($this->layout == Form::LAYOUT_HORIZONTAL) { $form_row_class = 'form-group'; } // Does this element have errors ? if (!empty($elementErrors) && !empty($inputErrorClass) && $this->layout != Form::LAYOUT_BARE) { $classAttributes = $element->hasAttribute('class') ? $element->getAttribute('class') . ' ' : ''; $classAttributes = $classAttributes . $inputErrorClass; $element->setAttribute('class', $classAttributes); } if (!$element->hasAttribute('id')) { $elementId = preg_replace(array('~[^A-Za-z0-9_-]~', '~--+~', '~^-|-$~'), array('-', '-', ''), $element->getName()); $element->setAttribute('id', $elementId); } else { $elementId = $element->getAttribute('id'); } /* * add form-control class to all form elements, but "submit" or "reset" and Buttons! */ if ($element->getAttribute('type') != 'submit' && $element->getAttribute('type') != 'reset' && $element->getAttribute('type') != 'checkbox' && !$element instanceof Button) { $element->setAttribute('class', $element->getAttribute('class') . ' form-control '); } $elementString = $elementHelper->render($element); $desc = $element->getOption('description', false); if ($desc && $this->layout != Form::LAYOUT_BARE) { if (null !== ($translator = $this->getTranslator())) { $desc = $translator->translate($desc, $this->getTranslatorTextDomain()); } $elementString .= sprintf('<div id="%s-desc" class="cam-description alert alert-info">%s</div>', $elementId, $desc); } if (!$element instanceof \Zend\Form\Element\Hidden && !$element instanceof \Zend\Form\Element\Button && $this->layout != Form::LAYOUT_BARE) { $elementString .= sprintf('<div id="%s-errors" class="errors">%s</div>', $elementId, $elementErrors); } // moved label here so we can change it in the ElementViewHelper $label = $element->getLabel(); if (isset($label) && '' !== $label && !$element instanceof \Zend\Form\Element\Button) { // Translate the label if (null !== ($translator = $this->getTranslator())) { $label = $translator->translate($label, $this->getTranslatorTextDomain()); } $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('<fieldset><legend>%s</legend>%s</fieldset>', $label, $elementString); } else { if ($this->layout == Form::LAYOUT_BARE) { $markup = $elementString; } else { if (!isset($labelAttributes['for'])) { $labelAttributes['for'] = $elementId; } if (Form::LAYOUT_HORIZONTAL == $this->layout) { if (!isset($labelAttributes['class'])) { $labelAttributes['class'] = ''; } $labelAttributes['class'] .= ' control-label'; } $element->setLabelAttributes($labelAttributes); $label = $labelHelper($element); if ($this->shouldWrap) { $spanWidth = 12 - $labelWidth; $elementString = sprintf('<div class="col-md-%d%s" id="' . $elementId . '-span">%s</div>', $spanWidth, $elementErrors ? " {$inputErrorClass}" : '', $elementString); $label = sprintf('<div class="col-md-%d yk-label">%s</div>', $labelWidth, $label); } $markup = $label . $elementString; } } } else { if ($this->shouldWrap && !$element instanceof \Zend\Form\Element\Hidden && !$element instanceof \Zend\Form\Element\Button && $this->layout != Form::LAYOUT_BARE) { $elementString = sprintf('<div class="col-md-12">%s</div>', $elementString); } $markup = $elementString; } if ($this->shouldWrap && !$element instanceof \Zend\Form\Element\Hidden && !$element instanceof \Zend\Form\Element\Button && $this->layout != Form::LAYOUT_BARE) { $markup = sprintf('<div class="controls controls-row ' . $form_row_class . '">%s</div>', $markup); } return $markup; }
/** * Helper function to recurse into form elements when rendering summary. * * @param ElementInterface $element * @return string */ protected function renderSummaryElement(ElementInterface $element) { if ($element instanceof Hidden || false === $element->getOption('render_summary')) { return ''; } if ($element instanceof ViewPartialProviderInterface) { $renderer = $this->getView(); /* @var $renderer \Zend\View\Renderer\PhpRenderer */ $origPartial = $element->getViewPartial(); $partial = "{$origPartial}.view"; $partialParams = array('element' => $element); if (!$renderer->resolver($partial)) { $partial = $origPartial; $partialParams['renderSummary'] = true; } return $renderer->partial($partial, $partialParams); } if ($element instanceof EmptySummaryAwareInterface && $element->isSummaryEmpty()) { /* @var $element EmptySummaryAwareInterface|ElementInterface */ $emptySummaryNotice = $this->getTranslator()->translate($element->getEmptySummaryNotice(), $this->getTranslatorTextDomain()); $markup = sprintf('<div id="%s-empty-alert" class="empty-summary-notice alert alert-info"><p>%s</p></div>', $element->getAttribute('id'), $emptySummaryNotice); return $markup; } $label = $this->getTranslator()->translate($element->getLabel()); $markup = ''; if ($element instanceof FieldsetInterface) { if (!$element instanceof FormInterface && $label) { $markup .= '<h4>' . $label . '</h4>'; } foreach ($element as $el) { $markup .= $this->renderSummaryElement($el); } return $markup; } $elementValue = $element instanceof \Zend\Form\Element\Textarea ? nl2br($element->getValue()) : $element->getValue(); if ('' != $elementValue && $element instanceof \Zend\Form\Element\Select) { $options = $element->getValueOptions(); $translator = $this->getTranslator(); if (true == $element->getAttribute('multiple')) { $multiOptions = []; foreach ($elementValue as $optionKey) { if (isset($options[$optionKey])) { $multiOptions['__general__'][] = $translator->translate($options[$optionKey]); continue; } foreach ($options as $optKey => $optVal) { if (!is_array($optVal) || !array_key_exists($optionKey, $optVal['options'])) { continue; } $optGroupLabel = isset($optVal['label']) ? $translator->translate($optVal['label']) : $optKey; $multiOptions[$optGroupLabel][] = $translator->translate($optVal['options'][$optionKey]); } } $elementValue = []; foreach ($multiOptions as $optGroupLabel => $vals) { $elementValue[] = "<b>{$optGroupLabel}</b><br>" . join(', ', $vals); } $elementValue = join('<br>', $elementValue) . '<br>'; } else { $elementValue = $translator->translate($options[$elementValue]); } } if ('' != $elementValue && $element instanceof \Zend\Form\Element\File) { return ''; } $markup .= '<div class="row">'; $col = 12; if ($label) { $markup .= '<div class="col-md-3 yk-label"><label>' . $label . '</label></div>'; $col = 9; } $markup .= '<div class="col-md-' . $col . '">' . $elementValue . '</div>' . '</div>'; return $markup; }