zf2 Zend 2 formCollection / FormElement Helper класс
Всем доброе утро,
У меня возникли некоторые проблемы с ZF2, я новичок в этой платформе, так что помилуйте... XDD хорошо, я хотел использовать функцию formCollection() для генерации формы, я настроил класс коллекции форм, чтобы добавить обертку ul и все в порядке, теперь моя проблема в том, что если я настрою formelement, сообщая ему обернуть элемент внутри li, то теперь проблема в том, что метка остается вне тега li, есть ли способ ее решить? без использования formRow() или непосредственно писать HTML?
FormCollection.php
namespace Users\View\Helper;
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormCollection as BaseFormCollection;
class FormCollection extends BaseFormCollection {
public function render(ElementInterface $element) {
return '<ul>'. parent::render($element).'</ul>;
}
}
FormElement.php
namespace Users\View\Helper;
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormElement as BaseFormElement;
class FormElement extends BaseFormElement {
public function render(ElementInterface $element) {
return '<li>'. parent::render($element).'</li>';
}
}
Приведенный HTML
<form name="Register" method="post" action="/">
<ul>
<label for="name">Full Name</label>
<li>
<input type="text" value="" name="name">
</li>
<label for="password">Password</label>
<li>
<input type="password" value="" required="required" name="password">
</li>
</ul>
это буквально сводит меня с ума и, вероятно, легко исправить T_T
Благодарю.
2 ответа
За <li><label></label><input></li>
Вы должны создать новый помощник FormLabel.php:
namespace Users\View\Helper;
use Zend\Form\View\Helper\FormLabel as BaseFormLabel;
class FormLabel extends BaseFormLabel{
public function openTag($attributesOrElement = null){
return '<li>'.parent::openTag($attributesOrElement);
}
}
и обновите FormElement.php для корректного переноса:
namespace Users\View\Helper;
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormElement as BaseFormElement;
class FormElement extends BaseFormElement{
public function render(ElementInterface $element){
if($element->getAttribute('type') == 'submit'){
return '<li>'.parent::render($element).'</li>';
}else{
return parent::render($element).'</li>';
}
}
}
За <li><label></label></li><li><input></li>
вам нужно просто создать FormLabel.php:
namespace Users\View\Helper;
use Zend\Form\View\Helper\FormLabel as BaseFormLabel;
class FormLabel extends BaseFormLabel{
public function openTag($attributesOrElement = null){
return '<li>'.parent::openTag($attributesOrElement);
}
public function closeTag(){
return '</label></li>';
}
}
без каких-либо обновлений в вашем FormElement.php
что-то вроде этого... =) Надеюсь, это поможет.
Для тех, кто застрял как я, я настроил вспомогательную форму FormCollection (не знаю, есть ли лучший способ сделать X/)
поставить этот класс под
<имя модуля> / src / <имя модуля>/View/Helper/FormCollection.php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @CustomizedBy Fabio Tagliabue
* @UpdaterWS http://www.polarfoxlab.com
*/
namespace Users\View\Helper;
use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\FormCollection as BaseFormCollection;
class FormCollection extends BaseFormCollection {
public function __invoke(ElementInterface $element = null, $wrap = true,$ExternalWrapper = '',$RowWrapper = 'div')
{
if (!$element) {
return $this;
}
$this->setShouldWrap($wrap);
return $this->render($element,$ExternalWrapper,$RowWrapper);
}
public function render(ElementInterface $element,$ExternalWrapper,$RowWrapper)
{
$renderer = $this->getView();
if (!method_exists($renderer, 'plugin')) {
// Bail early if renderer is not pluggable
return '';
}
$markup = '';
$templateMarkup = '';
$escapeHtmlHelper = $this->getEscapeHtmlHelper();
$elementHelper = $this->getElementHelper();
$fieldsetHelper = $this->getFieldsetHelper();
if ($element instanceof CollectionElement && $element->shouldCreateTemplate()) {
$templateMarkup = $this->renderTemplate($element);
}
$markup .= $this->PrintWrapper($ExternalWrapper,true);
foreach ($element->getIterator() as $elementOrFieldset) {
$markup .= $this->PrintWrapper($RowWrapper,true);
if ($elementOrFieldset instanceof FieldsetInterface) {
$markup .= $fieldsetHelper($elementOrFieldset);
} elseif ($elementOrFieldset instanceof ElementInterface) {
$markup .= $elementHelper($elementOrFieldset);
}
$markup .= $this->PrintWrapper($RowWrapper,false);
}
$markup .= $this->PrintWrapper($ExternalWrapper,false);
// If $templateMarkup is not empty, use it for simplify adding new element in JavaScript
if (!empty($templateMarkup)) {
$markup .= $templateMarkup;
}
// Every collection is wrapped by a fieldset if needed
if ($this->shouldWrap) {
$label = $element->getLabel();
if (!empty($label)) {
if (null !== ($translator = $this->getTranslator())) {
$label = $translator->translate(
$label, $this->getTranslatorTextDomain()
);
}
$label = $escapeHtmlHelper($label);
$markup = sprintf(
'<fieldset><legend>%s</legend>%s</fieldset>',
$label,
$markup
);
}
}
return $markup;
}
/*
* @param array wrapper keys are attribute + type is html tag
* @param bool open if need to open or close tag
*/
private function PrintWrapper($wrapper,$open=true)
{
$tag='';
if(!empty($wrapper))
{
if($open) $tag='<';
else $tag="</";
foreach($wrapper as $attribute => $value)
{
if(strtolower($attribute)=="type")
$tag.="{$value}";
else
$tag.=" {$attribute}='{$value}'";
}
$tag.='>';
}
return $tag;
}
}
затем перейдите в <имя модуля> /Module.php
и добавь это
public function getViewHelperConfig() {
return array(
'invokables' => array(
'FormCollection' => '< module name >\View\Helper\FormCollection',
)
);
}
Теперь для использования его в форме вызова страницы
echo $this->formCollection($form,true,'',array('type'=>'div','class'=>'form-group'));
третий параметр - ExternalWrapper, а четвертый - RowWrapper, просто задайте тип тега, который вы хотите использовать, а затем другое свойство, которое хотите назначить:D
надеюсь, что это может кому-то помочь:D