如何在添加表单元素的Zend Framework 2中设置数据库的值

时间:2014-01-23 11:06:25

标签: zend-framework2 zend-form

我是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));
    } 

1 个答案:

答案 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

}