2014-11-04 202 views
0

我試圖訪問數據庫中的類別列表,並將它們放入Symfony2中的窗體中。從symfony2中的對象創建數組

public function productAddAction() 
    { 
     $product = new Product(); 
     $categories = $this->getDoctrine() 
      ->getRepository('AudsurShopBundle:Category') 
      ->findAll(); 

     $form = $this->createFormBuilder($product) 
      ->add('category', 'choice', array(
       'choices' => $categories, /* this is wrong */ 
       'multiple' => false, 
      )) 
      ->add('name', 'text') 
      ->add('save', 'submit', array('label' => 'Create Task')) 
      ->getForm(); 

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

如何從$類別轉到可以放入以下部分的對象,並且它符合函數的期望?

->add('category', 'choice', array(
        'choices' => $categories, /* this is wrong */ 
        'multiple' => false, 
       )) 

我知道這是基本的,但我似乎無法找到合適的關鍵字來查找答案(我應該已經看過了?)

回答

2

首先,「這是錯誤的」不是一個特定的錯誤信息,我們非常感謝您的幫助。這就像說「我的代碼不起作用」,而不是告訴我們爲什麼。轉到實際問題。

您沒有使用正確的表單類型來處理實體類型並正確顯示它。正如@Talus提到的那樣,您需要的字段類型是entity。有你錯過,如class參數和property參數的幾件事情(假設你沒有寫在實體類__toString()功能。)

$categories = $this->getDoctrine() 
     ->getRepository('AudsurShopBundle:Category') 
     ->findAll(); 

    $form = $this->createFormBuilder($product) 
     ->add('category', 'entity', array(
      'class' => 'AudsurShopBundle:Category', 
      'choices' => $categories, 
      'multiple' => false, 
      'property' => 'name', // This needs to be an actual property, I just assumed name 
     )) 
     ->add('name', 'text') 
     ->add('save', 'submit', array('label' => 'Create Task')) 
     ->getForm(); 

由於您使用的所有Category實體存在,findAll()查詢實際上沒有必要。你可以代替去的basic usage

$form = $this->createFormBuilder($product) 
     ->add('category', 'entity', array(
      'class' => 'AudsurShopBundle:Category', 
      'multiple' => false, 
      'property' => 'name', // This needs to be an actual property, I just assumed name 
     )) 
     ->add('name', 'text') 
     ->add('save', 'submit', array('label' => 'Create Task')) 
     ->getForm(); 

如果你正在尋找的類別的特定子集,您可以使用choices財產像以前一樣或pass a query_builder

2

IRC,我認爲是有類型那:http://symfony.com/fr/doc/current/reference/forms/types/entity.html

這應該有助於任何你想要做的,如果我明白你的意思。 :)

+0

不知道這是我的意思。我知道有列表的形式函數。但是,一旦我從數據庫中檢索了我的類別,我是否會將該對象更改爲可以放入該表單函數的內容? – dubbelj 2014-11-04 14:39:39

0

那麼你可以分析從數據庫陣列:)

在庫中創建一個方法findAllArray(:

public function findAllArray() { 

    return $this->getEntityManager() 
     ->createQuery(
      'SELECT Category '. 
      'FROM AudsurShopBundle:Category AS Category' 
     ) 
     ->getArrayResult(); 
} 

然後把它在你的控制器,並得到所有類別:

$categories = $this->getDoctrine() 
    ->getRepository('AudsurShopBundle:Category') 
    ->findAllArray();  

當您有陣列時,使其適合於choice(創建新陣列$choices):

$choices = array(); 
foreach ($categories as $category) { 
    $choices[$value['id']] = $value['title']; 
} 

然後把這個新的數組形式:

->add('category', 'entity', array(
     'choices' => $choices, 

希望它幫助。祝你今天愉快。