如何知道控制器内选择字段有多少项 - Symfony2

时间:2013-07-17 13:50:33

标签: php symfony symfony-forms choicefield

我想在创建表单后计算选项的项目。该字段是一个简单的Symfony选择字段,带有query_builder来创建项目。我怎样才能做到这一点?

<?php

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

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

以下是我如何使用Categories进行此操作。

请注意,我有一个CategoryRepository。您可以在FormType类的query_builder选项中以及控制器中使用此存储库中的方法。

我的findAllCategories()方法返回一个查询构建器对象,因此我可以在存储库中使用另一个名为countCategories()的方法,该方法返回同一查询构建器对象的标量计数。

这允许我访问控制器中的count方法,并确保couting与我用来查找类别的查询构建器一致。

这是一个非常简单的例子,但是如果你有更复杂的带有连接和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()
        ;
    }
}

如果您有任何问题,请告诉我。

答案 1 :(得分:0)

如果您需要签到树枝:

form.countries.vars.choices|length

用正确的表单字段名称替换countries