2013-07-17 4 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. Вы можете использовать методы из этого репозитория внутри параметров query_builder в классах FormType, а также в вашем контроллере.

Метод findAllCategories() возвращает объект построителя запросов, поэтому я могу иметь другой метод в репозитории, называемый countCategories(), который возвращает скалярное число того же объекта построителя запросов.

Это позволяет мне получить доступ к методу count в моем контроллере и убедиться, что couting будет соответствовать построителю запросов, который я использую, чтобы найти категории.

Это очень простой пример, но он становится более полезным, если у вас более сложные методы поиска с объединениями и предложениями.

В моем контроллере:

<?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'; 
    } 
} 

и в моей категории Repository:

<?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

Привет, Уильямс, спасибо за ваш ответ. Я нашел решение, напрямую доступное для ** этого параметра. '$ form-> get (" field_name ") -> getConfig() -> getOption ('choice_list') -> getChoices()', но это приводит к второму доступу к базе данных. Ваше решение также выполняет два запроса в базу данных, но только для подсчета количества доступных категорий. Я сохраню ваше решение, пока кто-то не предложит лучший способ сделать это. Я все еще думаю, что есть элегантный способ добиться этого. Спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^