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


How to configure submit elements in one place in ZF2

我使用类似于骨架应用程序教程的数组表示法为ZF2表单创建提交按钮:

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

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

如果我想重用"全局"提交按钮,我在哪里对它进行编码,如何调用它?

您可以使用表单元素管理器;它是一个专门的服务管理器,用于提供所有常见的可重用服务和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');

或者,当您需要在表单中通过config添加时,表单工厂将使用type键并从FormElementManager中为您提取。

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

您可以使用特征。

只需创建包含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();
    }
}