src/SpotOnLive/LaravelZf2Form/View/Helper/FormCollection.php
<?php
namespace SpotOnLive\LaravelZf2Form\View\Helper;
use Form;
use RuntimeException;
use Zend\Form\Element;
use Zend\Form\ElementInterface;
use Zend\Form\Element\Collection as CollectionElement;
use Zend\Form\FieldsetInterface;
use Zend\Form\LabelAwareInterface;
use Zend\View\Helper\HelperInterface;
class FormCollection extends \Zend\Form\View\Helper\FormCollection
{
/**
* Render a collection by iterating through all fieldsets and elements
*
* @param ElementInterface $element
* @return string
*/
public function render(ElementInterface $element)
{
$markup = '';
$templateMarkup = '';
$fieldsetHelper = $this->getFieldsetHelper();
if ($element instanceof CollectionElement && $element->shouldCreateTemplate()) {
$templateMarkup = $this->renderTemplate($element);
}
foreach ($element->getIterator() as $elementOrFieldset) {
if ($elementOrFieldset instanceof FieldsetInterface) {
$markup .= $fieldsetHelper($elementOrFieldset, $this->shouldWrap());
} elseif ($elementOrFieldset instanceof ElementInterface) {
$markup .= Form::row($elementOrFieldset);
}
}
// Every collection is wrapped by a fieldset if needed
if ($this->shouldWrap) {
$attributes = $element->getAttributes();
unset($attributes['name']);
$attributesString = count($attributes) ? ' ' . $this->createAttributesString($attributes) : '';
$label = $element->getLabel();
$legend = '';
if (!empty($label)) {
if (null !== ($translator = $this->getTranslator())) {
$label = $translator->translate(
$label,
$this->getTranslatorTextDomain()
);
}
if (! $element instanceof LabelAwareInterface || ! $element->getLabelOption('disable_html_escape')) {
$escapeHtmlHelper = $this->getEscapeHtmlHelper();
$label = $escapeHtmlHelper($label);
}
$legend = sprintf(
$this->labelWrapper,
$label
);
}
$markup = sprintf(
$this->wrapper,
$markup,
$legend,
$templateMarkup,
$attributesString
);
} else {
$markup .= $templateMarkup;
}
return $markup;
}
/**
* Only render a template
*
* @param CollectionElement $collection
* @return string
*/
public function renderTemplate(CollectionElement $collection)
{
$escapeHtmlAttribHelper = $this->getEscapeHtmlAttrHelper();
$fieldsetHelper = $this->getFieldsetHelper();
$templateMarkup = '';
$elementOrFieldset = $collection->getTemplateElement();
if ($elementOrFieldset instanceof FieldsetInterface) {
$templateMarkup .= $fieldsetHelper($elementOrFieldset, $this->shouldWrap());
} elseif ($elementOrFieldset instanceof ElementInterface) {
$templateMarkup .= Form::row($elementOrFieldset);
}
return sprintf(
$this->getTemplateWrapper(),
$escapeHtmlAttribHelper($templateMarkup)
);
}
/**
* If set to true, collections are automatically wrapped around a fieldset
*
* @param bool $wrap
* @return FormCollection
*/
public function setShouldWrap($wrap)
{
$this->shouldWrap = (bool) $wrap;
return $this;
}
/**
* Get wrapped
*
* @return bool
*/
public function shouldWrap()
{
return $this->shouldWrap;
}
/**
* Sets the name of the view helper that should be used to render sub elements.
*
* @param string $defaultSubHelper The name of the view helper to set.
* @return FormCollection
*/
public function setDefaultElementHelper($defaultSubHelper)
{
$this->defaultElementHelper = $defaultSubHelper;
return $this;
}
/**
* Gets the name of the view helper that should be used to render sub elements.
*
* @return string
*/
public function getDefaultElementHelper()
{
return $this->defaultElementHelper;
}
/**
* Sets the element helper that should be used by this collection.
*
* @param HelperInterface $elementHelper The element helper to use.
* @return FormCollection
*/
public function setElementHelper(HelperInterface $elementHelper)
{
$this->elementHelper = $elementHelper;
return $this;
}
/**
* Retrieve the element helper.
*
* @return HelperInterface
* @throws RuntimeException
*/
protected function getElementHelper()
{
if (!$this->elementHelper) {
$this->elementHelper = Form::row();
}
return $this->elementHelper;
}
/**
* Sets the fieldset helper that should be used by this collection.
*
* @param HelperInterface $fieldsetHelper The fieldset helper to use.
* @return FormCollection
*/
public function setFieldsetHelper(HelperInterface $fieldsetHelper)
{
$this->fieldsetHelper = $fieldsetHelper;
return $this;
}
/**
* Retrieve the fieldset helper.
*
* @return FormCollection
*/
protected function getFieldsetHelper()
{
if ($this->fieldsetHelper) {
return $this->fieldsetHelper;
}
return $this;
}
/**
* Get the wrapper for the collection
*
* @return string
*/
public function getWrapper()
{
return $this->wrapper;
}
/**
* Set the wrapper for this collection
*
* The string given will be passed through sprintf with the following three
* replacements:
*
* 1. The content of the collection
* 2. The label of the collection. If no label is given this will be an empty
* string
* 3. The template span-tag. This might also be an empty string
*
* The preset default is <pre><fieldset>%2$s%1$s%3$s</fieldset></pre>
*
* @param string $wrapper
*
* @return self
*/
public function setWrapper($wrapper)
{
$this->wrapper = $wrapper;
return $this;
}
/**
* Set the label-wrapper
* The string will be passed through sprintf with the label as single
* parameter
* This defaults to '<legend>%s</legend>'
*
* @param string $labelWrapper
*
* @return self
*/
public function setLabelWrapper($labelWrapper)
{
$this->labelWrapper = $labelWrapper;
return $this;
}
/**
* Get the wrapper for the label
*
* @return string
*/
public function getLabelWrapper()
{
return $this->labelWrapper;
}
/**
* Ge the wrapper for the template
*
* @return string
*/
public function getTemplateWrapper()
{
return $this->templateWrapper;
}
/**
* Set the string where the template will be inserted into
*
* This string will be passed through sprintf and has the template as single
* parameter
*
* THis defaults to '<span data-template="%s"></span>'
*
* @param string $templateWrapper
*
* @return self
*/
public function setTemplateWrapper($templateWrapper)
{
$this->templateWrapper = $templateWrapper;
return $this;
}
}