2015-09-30 132 views
0

我試圖用數據庫中的數據填充表單域以編輯它們。我已經在谷歌搜索。Symfony 2預填充表單與來自數據庫的數據

這裏是我的控制器,它返回空場

public function userViewAction($id,Request $request){ 

    $em = $this->getDoctrine()->getManager()->getRepository('BFVMailingBundle:MailingList'); 
    $user = $em->findById($id); 

    $form = $this->get('form.factory')->createBuilder('form',$user) 
     ->add('unsubscribed','checkbox') 
     ->add('name','text') 
     ->add('givenName','text') 
     ->add('additionalName','text',array('required'=>false)) 
     ->add('familyName','text',array('required'=>false)) 
     ->add('emailValue','text') 
     ->add('language','choice',array(
      'choices' => array('en_GB' => 'en_GB', 'es_ES' => 'es_ES', 'fr_FR' => 'fr_FR'), 
      'required' => true, 
     )) 
     ->add('commentary','textarea',array('required'=>false)) 
     ->add('save','submit') 
     ->getForm(); 


    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     if ($form->isValid()) { 
      // perform some action, such as save the object to the database 
      $em->flush(); 
      return $this->redirect($this->generateUrl('user_view',array('id'=>$id))); 
     } 
    } 

,這是我的模板

<div class="cell"> 
    {{ form_start(form, {'attr': {'class': 'form-horizontal'}}) }} 
    {{ form_end(form) }} 
</div> 

我錯過了什麼?

EDIT - 讀這爲解決

正如約翰·諾爾引伸我建立外部化形式與命令

php app/console doctrine:generate:form BFVMailingBundle:MailingList 

我的實體是不是用戶

郵件列表MailingListType是在BFV \ MailingBundle \ Form中生成的表單模板。我自己添加了數據類型。

<?php 
namespace BFV\MailingBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class MailingListType extends AbstractType 
{ 
/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $str = date("U"); 
    $codeValue = sha1($str); 

    $builder 
     ->add('secretCode','hidden',array('data' => $codeValue)) 
     ->add('name','text') 
     ->add('givenName','text') 
     ->add('additionalName','text',array('required'=>false)) 
     ->add('familyName','text',array('required'=>false)) 
     ->add('emailValue','text') 
     ->add('language','choice',array(
      'choices' => array('en_GB' => 'en_GB', 'es_ES' => 'es_ES', 'fr_FR' => 'fr_FR'), 
      'required' => true, 
     )) 
     ->add('unsubscribed','checkbox') 
     ->add('commentary','textarea',array('required'=>false)) 
     ->add('save','submit') 
    ; 
} 

/** 
* @param OptionsResolverInterface $resolver 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'BFV\MailingBundle\Entity\MailingList' 
    )); 
} 

/** 
* @return string 
*/ 
public function getName() 
{ 
    return 'bfv_mailingbundle_mailinglist'; 
} 
} 

在重新格式化的控制器中,我添加了添加表單生成器MailingList $ user [0]而不是$ user的實例。我在許多平時你直接把$變量的表單生成器的網站閱讀,但生成以下錯誤:在控制器

The form's view data is expected to be an instance of class 
BFV\MailingBundle\Entity\MailingList, but is a(n) array. You can avoid 
this error by setting the "data_class" option to null or by adding a 
view transformer that transforms a(n) array to an instance of 
BFV\MailingBundle\Entity\MailingList 

這樣:

public function userViewAction($id,Request $request){ 
    if (!$id) { 
     throw $this->createNotFoundException('No id !!'); 
    } 

    $em = $this->getDoctrine()->getManager()->getRepository('BFVMailingBundle:MailingList'); 
    $user = $em->findById($id); 
    if (!$user){ 
     throw $this->createNotFoundException('No user with the id selected'); 
    } 

    $form = $this->createForm(new MailingListType(), $user[0]); 

    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     if ($form->isValid()) { 
      $em->flush(); 
      return $this->redirect($this->generateUrl('user_view',array('id'=>$id))); 
     } 
    } 

    return $this->render('BFVMailingBundle:Default:user_view.html.twig',array(
     'user'=>$user, 
     'form'=>$form->createView() 
      )); 
} 

結論:我認爲形式呈現來自數據庫的填充數據。

+0

http://symfony.com/doc/current/book/forms.html#book-forms-data-class – pbenard

+0

你在google上發現了什麼? – Bas

+0

當你做'轉儲($用戶)'你看到任何記錄被拉對用戶? – Baig

回答

1

要做到這一點,你會想看看form classes那麼這將作爲一個視圖(也將填充),您所提供的數據。所以,在你的榜樣,你需要創建一個表單類UserType

class UserType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('unsubscribed','checkbox') 
      ->add('name','text') 
      ->add('givenName','text') 
      ->add('additionalName','text',array('required'=>false)) 
      ->add('familyName','text',array('required'=>false)) 
      ->add('emailValue','text') 
      ->add('language','choice',array(
       'choices' => array('en_GB' => 'en_GB', 'es_ES' => 'es_ES', 'fr_FR' => 'fr_FR'), 
       'required' => true, 
      )) 
      ->add('commentary','textarea',array('required'=>false)) 
      ->add('save','submit') 
     ; 
    } 

    public function getName() 
    { 
     return 'user'; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Your\Entity\Class', 
     )); 
    } 
} 

那麼你的控制器中你會做線沿線的東西:

$form = $this->createForm(new UserType(), $user); 

然後控制器的其餘部分,你有。當然,你可以在表單類上閱讀,因爲這是Symfony forms許多高級功能的起點。

+0

我試過這個,它在你創建一個電子郵件用戶時運行良好,但是當試圖從現有數據創建表單時返回這個錯誤「表單的視圖數據應該是BFV類的一個實例\ MailingBundle \ Entity \ MailingList,但是是一個(n)數組,您可以通過將「data_class」選項設置爲null或者添加一個將(n)數組轉換爲BFV \ MailingBundle \ Entity \ MailingList「 –

+0

最後它工作我用$ user [0]替換$用戶返回對象,因爲錯誤說 –

0

我不知道這是什麼使區別,但你有嘗試:

$form = $this->createFormBuilder($user) 
      ->add(...) 
      ->getForm() 

你也可以檢查你的用戶是正確地從數據庫讀取。

例如:

if (!is_object($user)) { 
    $this->createNotFoundException('The user does not exist'); 
} 
+0

感謝您的答案。數據用戶從數據庫中回想起來沒有問題。和你嘗試的小試驗provoqued一個錯誤 –