2013-07-17 3 views
1

양식을 만든 후에 선택 항목을 계산하고 싶습니다. 필드는 항목을 생성하기위한 query_builder를 가진 간단한 Symfony의 선택 필드입니다. 이것을 어떻게 할 수 있습니까?컨트롤러 내에 선택 필드의 개수를 알 수있는 방법 - 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()라는 저장소에 다른 메서드를 포함 할 수 있습니다.

이렇게하면 내 컨트롤러의 카운트 메소드에 액세스 할 수 있으며, 해당 카테 고리가 카테고리를 찾기 위해 사용하는 쿼리 작성기와 일관성이 있는지 확인합니다.

이것은 매우 간단한 예이지만 joins 및 where 절을 사용하는 더 복잡한 finder 메소드가있는 경우보다 유용합니다. 내 컨트롤러에서

:

<?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 ** 옵션에 직접 액세스하는 솔루션을 찾았습니다. '$ form-> get ("field_name") -> getConfig() -> getOption ('choice_list') -> getChoices()'하지만 데이터베이스에 대한 두 번째 액세스가 발생합니다. 솔루션은 또한 데이터베이스에 대한 두 가지 요청을하지만 사용 가능한 범주의 수를 계산하는 데만 사용됩니다. 누군가가 더 나은 방법을 제안 할 때까지 귀하의 솔루션을 계속 사용하겠습니다. 나는 아직도 이것을 달성하는 우아한 방법이 있다고 생각한다. 고마워 –