我想为用户创建一个独特的下拉列表,并找到了一种方法来实现这一点,但对客户来说还不行。
这就是我所做的:
public function __construct($name = null, EntityManager $em = null, $userId = null)
{
parent::__construct($name);
$this->setAttribute('method', 'post');
[...]
$this->add(array(
'name' => 'religionId',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'object_manager' => $this->getEntityManager(),
'target_class' => 'Religions\Entity\Religions',
'property' => 'name',
'disable_inarray_validator' => true,
'by_reference' => false,
'is_method' => true,
'find_method' => array(
'name' => 'findBy',
'params' => array(
'criteria' => array('reUserId' => $userId),
'orderBy' => array('name' => 'ASC'),
),
),
),
'attributes' => array(
'multiple' => false,
'required' => false,
)
));
}
这很有用,因为我在初始化表单时发送变量reuserId,使用$this->identity()
客户想要注入用户实体并从那里选择....
搜索了stackoverflow和google,但无法找到任何内容......有什么帮助吗?谢谢!
答案 0 :(得分:2)
注射'在ZF2中你需要使用ServiceManager并创建服务工厂。
因此,务必确保始终通过ServiceManager创建表单。
例如在控制器中:
$form = $this->getServiceLocator()->get('MyModule\Form\FooForm');
然后你需要注射'用户购买创建工厂类或关闭。
<强> Module.php 强>
public function getFormElementConfig() {
return array(
'factories' => array(
'MyModule\Form\FooForm' => function($fem) {
$serviceManager = $fem->getServiceLocator();
$entityManager = $serviceManager->get('objectmanager'); // Doctrine object manager
// Load the user
// Example is the zfcUser authentication service, however replace
// this with whatever you use to maintain the users id
$user = $serviceManager->get('zfcuser_auth_service')->getIdentity();
// Inject the user entity into the form constructor
$form = new FooForm($user);
return $form;
},
),
);
}
据说我认为您可能需要考虑表单依赖性。在我看来,你不是依赖在用户实体上 - 而是用户的id应该用在数据库查询中,以减少宗教信息列表。
您可以执行此查询,然后将结果(宗教集合)传递给表单,就像我的示例显示如何为用户实体一样 - 这意味着您可以使用&#39;正常&#39; Zend\Form\Element\Select
而不是ObjectSelect
- 意味着无需注入ObjectManager
等。