如何在ZF2中的一个位置配置提交元素

时间:2015-12-27 01:58:08

标签: php forms zend-framework2

我使用类似于skeleton application tutorial的数组符号为我的ZF2表单创建提交按钮:

     $this->add(array(
         'name' => 'submit',
         'type' => 'Submit',
         'attributes' => array(
             'value' => 'Go',
             'id' => 'submitbutton',
         ),
     ));

如果我将我的项目从相册列表扩展到书籍列表,DVD列表,宠物列表,YuGiOhCards列表等;每个新模块都需要自己的形式。很容易重写相同的代码,为每个表单添加一个提交按钮;但为了确保一致性,在一个位置编写一次提交按钮并从每个表单类中调用它是有意义的。

如果我想重复使用" global"提交按钮,我在哪里编码,我该怎么称呼它?

2 个答案:

答案 0 :(得分:1)

您可以使用表单元素管理器;这是一个专门的表单元素服务管理器,提供所有常用的可重用服务和使用工厂的DI。

例如,您可以将按钮作为服务提供。

'form_elements' => [
    'factories' => [
        'MySubmitButton' => 'MyModule\Form\Element\MySubmitButtonFactory',
    ],
],

然后创建工厂。

namespace MyModule\Form\Element;

use Zend\Form\Element\Submit; 

class MySubmitButtonFactory
{
    public function __invoke($formElementManager, $name, $requestedName)
    {
        $element = new Submit('submit');
        $element->setAttributes([
            'value' => 'Go',
            'id' => 'submitbutton'
        ]);
        return $element;
    }
}

当您需要将其添加到表单时,您应首先从FormElementManager服务中获取该元素。

$formElementManager = $serviceManager->get('FormElementManager');
$button = $formElementManager->get('MySubmitButton');

或者当您需要在表单中添加配置时,表单工厂将使用type键并从FormElementManager拉出来。

 $this->add([
     'name' => 'submit',
     'type' => 'MySubmitButton',
 ]);

答案 1 :(得分:0)

您可以使用traits

只需创建包含addSubmit()方法

的特征
protected function addSubmit()
{
    $this->add([
        'name' => 'submit',
        'type' => 'Submit',
        'attributes' => [
            'value' => 'Go',
            'id' => 'submitbutton',
        ],
    ]);
}

并在表单中使用它。

class MyForm extends Form
{
    use SubmitButtonFormTrait;

    // ...

    public function __construct($name = null)
    {
        parent::__construct('customName');

        // ...

        $this->addSubmit();
    }
}