2014-02-07 44 views
3

我有一個學說實體,一個表單和2個字段集。 當我用值填充實體時,數值會按照預期水合到窗體中。 當我嘗試從表單數據創建一個實體時,它仍然是空的..表單不綁定後值到實體

我必須忘記一些東西,但不能找到它,我有幾個其他形式沒有fieldset,他們按預期工作。

有什麼想法?

貼出我的代碼如下

實體:

class User 
{ 
    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(type="string", length=255, unique=true, nullable=true) 
    */ 
    protected $username; 

    .. 
} 

形式:

class CreateUserForm extends Form 
{ 
    public function __construct(ObjectManager $objectManager) 
    { 
     parent::__construct('create-user'); 

     $this->setAttribute('method', 'post'); 

     // The form will hydrate an object 
     $this->setHydrator(new DoctrineHydrator($objectManager)); 

     $userFieldset = new UserFieldset($objectManager); 
     $this->add($userFieldset); 

     // … add CSRF and submit elements … 
     $baseFieldset = new BaseFieldset($objectManager); 
     $baseFieldset->setUseAsBaseFieldset(true); 
     $this->add($baseFieldset); 

    } 
} 

UserFIeldset:

class UserFieldset extends Fieldset implements InputFilterProviderInterface 
{ 
    public function __construct($objectManager) 
    { 
     parent::__construct($name = 'user'); 

     $this->setHydrator(
      new DoctrineHydrator($objectManager, 'YrmUser\Entity\User') 
     )->setObject(new User());  



     $this->add(
      array(
       'name' => 'username', 
       'attributes' => array(
        'type' => 'text', 
        'placeholder' =>'Username', 
       ), 
       'options' => array(
        'label' => 'Username', 
       ), 
      ) 
     ); 
     ... 
    } 
} 

BaseFieldset:

class BaseFieldset extends Fieldset implements InputFilterProviderInterface 
{ 
    public function __construct($objectManager) 
    { 
     parent::__construct('base'); 
     $this->setHydrator(new DoctrineHydrator($objectManager)); 
     $this->add(
      array(
       'name' => 'security', 
       'type' => 'Zend\Form\Element\Csrf', 
       'options' => array(
        'csrf_options' => array(
         'timeout' => 600 
        ) 
       ) 
      ) 
     ); 

     $this->add(
      array(
       'name' => 'submit', 
       'attributes' => array(
        'type' => 'submit', 
        'value' => 'Save', 
        'class' => 'btn btn-success btn-lg confirm', 
       ), 
      ) 
     ); 

    } 
} 

控制器動作:

public function createAction() 
{ 

    $form = new CreateUserForm($this->getObjectManager()); 
    $entity = new User(); 
    $form->bind($entity); 

    $request = $this->getRequest(); 
    if ($request->isPost()) { 
     $form->setData($request->getPost()); 
     if ($form->isValid()) { 
      $this->getObjectManager()->persist($entity); 
      $this->getObjectManager()->flush(); 
      return $this->redirect()->toRoute($this->redirect); 
     } 
    } 

    return array(
     'form' => $form 
    ); 
} 

回答

1

你能的var_dump $form->isValid()$form->getData()

或者,您可以嘗試$form->isValid($request->getPost())而不是setData()

+0

嗨,$ form-getData()的var_dump顯示一個「空」用戶實體(空的我的意思是這些值全都爲空)沒有區別,如果我使用setData或沒有.. – YRM

+0

$ form-> isValid($ request-> getPost())不起作用,因爲它只是說我的表單對於setData無效,但它確實有效,但用戶實體值爲空 – YRM

+0

imho,$ form-> isValid($ request-> getPost())有效,但有驗證有問題。你可以嘗試var_dump $ request-> getPost()。你是否在窗體上調用了'prepare()'來正確地啓動結構? – jmleroux