我是zenframework的新手2.我已经正确设置了zendframework 2,doctrine和zfcUser.All正常工作。
我现在的问题是如果成员已经登录,如何预先准备好表格。
这是我扩展zfcUser以获取loggged in member的ID:
public function setid( $id)
{
$this->id = $id;
}
public function getId()
{
if (!$this->id) {
$this->setid($this->zfcUserAuthentication()->getAuthService()->getIdentity()->getId());
}
return $this->id;
}
我知道想要使用该Id从数据库中获取值,然后使用这些值填充表单。
这是我的表格:
public function aboutYouAction()
{
$id = $this->getId() ;
$form = new CreateAboutYouForm($this->getEntityManager());
$aboutYou = new AboutYou();
$form->setInputFilter($aboutYou->getInputFilter());
$form->bind($aboutYou);
if ($this->request->isPost())
{
$form->setData($this->request->getPost());
if ($form->isValid())
{
$post = $this->request->getPost();
$this->getEntityManager()->persist($aboutYou);
$this->getEntityManager()->flush();
return $this->redirect()->toRoute('worker', array('action' => 'aboutYou'));
}
}
$messages='';
// return array('form' => $form);
return new ViewModel(array('form' => $form, 'messages' => $messages));
}
答案 0 :(得分:0)
要在表单上设置值,您只需要$form->bind($aboutYou)
bind()
方法旨在获取传递的实体实例并将其映射到表单元素;此过程称为 hydration 形式。
取决于附加到表单或字段集的水化器(使用doctrine,这通常是DoctrineModule\Stdlib\Hydrator\DoctrineObject
),这应该能够评估AboutYou
字段,包括任何实体引用/关联,并设置相应的表单元素值。我假设其中一个字段是user
。
在特定情况下,您似乎绑定了一个新实体(因此不会设置任何属性,例如您的用户)
$aboutYou = new AboutYou(); // Brand new entity
$form->bind($aboutYou); // Binding to the form without any data
这意味着表单正在尝试设置元素的值,但提供的AboutYou
类没有要设置的数据(因为它是新的并且未通过doctrine加载)和/或属性AboutYou
类无法正确映射到表单的元素。
如果您希望绑定用户,则需要获取已填充的实例。这可以使用doctrine($objectManager->find('AboutYou', $aboutYouId)
)完成,或者如果您需要在控制器内设置当前登录用户调用控制器插件ZfcUser\Controller\Plugin\ZfcUserAuthentication
,而不是其他地方。< / p>
您的工作流程应与此类似(仅供参考)
// Controller
public function aboutYouAction()
{
// Get the id via posted/query/route params
$aboutYouId = $this->params('id', false);
// get the object manager
$objectManager = $this->getServiceLocator()->get('ObjectManager');
// Fetch the populated instance
$aboutYou = $objectManager->find('AboutYou', $aboutYouId);
// here the about you entity should be populated with a user object
// so that if you were to call $aboutYou->getUser() it would return an user object
// Get the form from the service manager (rather than creating it in the controller)
// meaning you should create a factory service for this
$form = $this->getServiceLocator()->get('MyForm');
// Bind the populated object to the form
$form->bind($aboutYou);
//... rest of the action such as handle edits etc
}