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

Другие вопросы по тегам