2013-07-17 44 views
1

我想在創建表單後對選項進行計數。該字段是一個簡單的Symfony的選擇字段,其中包含一個用於創建項目的query_builder。我怎樣才能做到這一點?如何知道控制器內有多少個選項字段 - Symfony2

<?php 

class MyController 
{ 
    public function indexAction() 
    { 
     $form = $this->createForm(new MyFormWithChoiceFieldType()); 

     // suppose that the field is named by "countries" 
     $items = count(???); 
    } 
} 

在此先感謝。

回答

0

以下是我如何使用類別做到這一點。

請注意,我有一個CategoryRepository。您可以使用FormType類中的query_builder選項內以及您的控制器中的此存儲庫中的方法。我的findAllCategories()方法返回一個查詢生成器對象,因此我可以在存儲庫中有另一個名爲countCategories()的方法,它返回同一查詢生成器對象的標量計數。

這使我可以訪問我的控制器中的count方法,並確保couting將與我用來查找類別的查詢構建器一致。

這是一個非常簡單的例子,但如果你有更復雜的查找方法和連接以及where子句,它會變得更有用。

在我的控制器:

<?php 

use Site\FrontendBundle\Form\Type\CategoryType; 

public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $repo = $em->getRepository('SiteFrontendBundle:Category'); 

    $form = $this->createForm(new CategoryType()); 

    $count = $repo->countAllCategories(); 

    return $this->render('SiteFrontendBundle:Category:count.html.twig', array(
     'form' => $form->createView(), 
     'count' => $count 
    )); 
} 

在我的表單類型:

<?php 

namespace Site\FrontendBundle\Form\Type; 

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

use Site\FrontendBundle\Repository\CategoryRepository; 

class CategoryType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('category', 'entity', array(
       'class' => 'SiteFrontendBundle:Category', 
       'property' => 'title', 
       'query_builder' => function(CategoryRepository $cr) { 
        return $cr->findAllCategories(); 
       } 
      )) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Site\FrontendBundle\Entity\Category' 
     )); 
    } 

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

,並在我的類別庫:

<?php 

namespace Site\FrontendBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

class CategoryRepository extends EntityRepository 
{ 
    public function findAllCategories() 
    { 
     return $this->createQueryBuilder('c') 
      ->orderBy('c.lft', 'ASC') 
     ; 
    } 

    public function countAllCategories() 
    { 
     return $this 
      ->findAllCategories() 
      ->select('COUNT(c.id)') 
      ->getQuery() 
      ->getSingleScalarResult() 
     ; 
    } 
} 

如果您有任何問題,讓我知道。

+0

嗨威廉姆斯,感謝您的回覆。我找到了一個直接訪問該字段的** choice_list **選項的解決方案。 ($) - > get(「field_name」) - > getConfig() - > getOption('choice_list') - > getChoices()',但這會導致第二次訪問數據庫。您的解決方案還向數據庫發出兩個請求,但僅用於計算可用的類別數量。我會一直跟着你的解決方案,直到有人建議更好的方法來做到這一點。我仍然認爲有一個很好的方法來實現這一點。謝謝 –

相關問題