簡體   English   中英

如何在Zend Framework 2中創建自定義表單元素?

[英]How to create custom form element in Zend Framework 2?

我如何在ZF2中使用自定義驗證器創建自定義表單元素? 我想創建使用jQuery的自定義類別選擇器,並且應該從phtml腳本呈現此元素的內容。 在ZF1中它很容易但在ZF2中我不知道從哪里開始。

表單元素必須實現Zend\\Form\\ElementInterface 默認類是Zend\\Form\\Element ,您可以將其用作基本形式:

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;

class Foo extends Element
{
}

CUSTOM VALIDATOR

您可以讓元素直接指定自定義驗證器。 然后你必須實現Zend\\InputFilter\\InputProviderInterface

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;
use Zend\InputFilter\InputProviderInterface;
use MyModule\InputFilter\Bar as BarValidator;

class Foo extends Element implements InputProviderInterface
{
    protected $validator;

    public function getValidator()
    {
        if (null === $this->validator) {
            $this->validator = new BarValidator;
        }
        return $this->validator;
    }

    public function getInputSpecification()
    {
        return array(
            'name'       => $this->getName(),
            'required'   => true,
            'validators' => array(
                $this->getValidator(),
            ),
        );
    }
}

定制渲染

目前,Zend Framework處理自定義表單元素類型的呈現方式有點復雜。 通常,它只返回普通的<input type="text">元素。

有一個選項,那么你必須覆蓋Zend\\Form\\View\\Helper\\FormElement助手。 它已注冊為formelement ,您必須在自定義模塊中覆蓋此視圖助手:

namespace MyModule;

class Module
{
    public function getViewHelperConfig()
    {
        return array(
            'invokables' => array(
                'formelement' => 'MyModule\Form\View\Helper\FormElement',
                'formfoo'     => 'MyModule\Form\View\Helper\FormFoo',
            ),
        );
    }
}

此外,Zend Framework 2中的每個表單元素都由一個視圖助手呈現。 因此,您為自己的元素創建一個視圖助手,它將呈現元素的內容。

然后你必須創建自己的表單元素助手( MyModule\\Form\\View\\Helper\\FormElement ):

namespace MyModule\Form\View\Helper;

use MyModule\Form\Element;
use Zend\Form\View\Helper\FormElement as BaseFormElement;
use Zend\Form\ElementInterface;

class FormElement extends BaseFormElement
{
    public function render(ElementInterface $element)
    {
        $renderer = $this->getView();
        if (!method_exists($renderer, 'plugin')) {
            // Bail early if renderer is not pluggable
            return '';
        }

        if ($element instanceof Element\Foo) {
            $helper = $renderer->plugin('form_foo');
            return $helper($element);
        }

        return parent::render($element);
    }
}

最后一步,創建視圖助手以呈現此特定表單元素:

namespace MyModule\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;

class Foo extends AbstractHelper
{
    public function __invoke(ElementInterface $element)
    {
        // Render your element here
    }
}

如果要為此表單元素呈現.phtml文件,請將其加載到此幫助程序中:

namespace MyModule\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;

class Foo extends AbstractHelper
{
    protected $script = 'my-module/form-element/foo';

    public function render(ElementInterface $element)
    {
        return $this->getView()->render($this->script, array(
            'element' => $element
        ));
    }
}

它將呈現my-module/form-element/foo.phtml ,在此腳本中,您將擁有一個包含特定表單元素的變量$element element。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM