Zend framework2 如何创建扩展实体选择元素的自定义表单元素

Zend framework2 如何创建扩展实体选择元素的自定义表单元素,zend-framework2,Zend Framework2,我试图创建一个自定义元素,在这里我可以预先设置一个实体名称空间,比如--Application\entity\User,并轻松地将该元素添加到任何表单中。我在表单元素中注入元素时遇到了一个问题——我找到了这篇关于form\u元素配置键的帖子,但它不起作用——所以我想可能只是设置元素并从表单中将其传递给objectmanager 我想做这样的事。 $this->add( array( 'name' => 'user_id', 'type' =&g

我试图创建一个自定义元素,在这里我可以预先设置一个实体名称空间,比如--
Application\entity\User
,并轻松地将该元素添加到任何表单中。我在表单元素中注入元素时遇到了一个问题——我找到了这篇关于
form\u元素
配置键的帖子,但它不起作用——所以我想可能只是设置元素并从表单中将其传递给objectmanager

我想做这样的事。

$this->add(
    array(
        'name' => 'user_id',
        'type' => 'Application\Form\Element\UserSelect',
        'options' => array(
            'label'          => 'User',
            'object_manager' => $this->getObjectManager(),
        ),
    ),
);
或者更好的办法就是这样

$this->add(
    array(
        'name'  => 'user_id',
        'type'  => 'Application\Form\Element\UserSelect',
        'label' => 'User',
    ),
);

module.config.php

AbstractForm.php

TestForm.php

将初始值设定项和可调用项添加到Module.php的getFormElementConfig方法中:

use DoctrineModule\Persistence\ObjectManagerAwareInterface;
...
public function getFormElementConfig()
{
    return array(
    'invokables' => array(
    'MyForm' => 'Application\Form\MyForm',
        ),
        'initializers' => array(
            'ObjectManagerInitializer' => function ($element, $formElements) {
                if ($element instanceof ObjectManagerAwareInterface) {
                    $services      = $formElements->getServiceLocator();
                    $entityManager = $services->get('Doctrine\ORM\EntityManager');

                    $element->setObjectManager($entityManager);
                }
            },
        ),
    );
}
然后使用FormElementManager获取te表单:

$forms = $this->getServiceLocator()->get('FormElementManager');
$myForm = $forms->get('MyForm');
最后,将您的元素添加到init方法中,而不是构造函数,因为他永远不会知道objectManager

public function init()
{
    $this->add(
        array(
            'name' => 'user_id',
            'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity',
            'options' => array(
                'label'          => 'User',
                'object_manager' => $this->getObjectManager(),
                'target_class'   => 'Application\Entity\User',
                'property'       => 'name',
                'find_method' => array(
                    'name'   => 'findBy',
                    'params' => array(
                        'criteria' => array('is_deleted' => 0),
                        'orderBy'  => array('name' => 'ASC'),
                    ),
                ),
            ),
        ),
    );
}

use DoctrineModule\Persistence\ObjectManagerAwareInterface;
...
public function getFormElementConfig()
{
    return array(
    'invokables' => array(
    'MyForm' => 'Application\Form\MyForm',
        ),
        'initializers' => array(
            'ObjectManagerInitializer' => function ($element, $formElements) {
                if ($element instanceof ObjectManagerAwareInterface) {
                    $services      = $formElements->getServiceLocator();
                    $entityManager = $services->get('Doctrine\ORM\EntityManager');

                    $element->setObjectManager($entityManager);
                }
            },
        ),
    );
}
$forms = $this->getServiceLocator()->get('FormElementManager');
$myForm = $forms->get('MyForm');
public function init()
{
    $this->add(
        array(
            'name' => 'user_id',
            'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity',
            'options' => array(
                'label'          => 'User',
                'object_manager' => $this->getObjectManager(),
                'target_class'   => 'Application\Entity\User',
                'property'       => 'name',
                'find_method' => array(
                    'name'   => 'findBy',
                    'params' => array(
                        'criteria' => array('is_deleted' => 0),
                        'orderBy'  => array('name' => 'ASC'),
                    ),
                ),
            ),
        ),
    );
}