1

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

<?php

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

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

提前致谢。

4

2 回答 2

0

这是我使用类别执行此操作的方法。

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

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

这使我可以访问控制器中的 count 方法,并确保计算与我用来查找类别的查询生成器一致。

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

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

于 2013-07-17T20:02:35.930 回答
0

如果您需要签入树枝:

form.countries.vars.choices|length

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

于 2020-02-12T10:20:51.613 回答