我想在创建表单后计算选项的项目。该字段是一个简单的Symfony选择字段,带有query_builder来创建项目。我怎样才能做到这一点?
<?php
class MyController
{
public function indexAction()
{
$form = $this->createForm(new MyFormWithChoiceFieldType());
// suppose that the field is named by "countries"
$items = count(???);
}
}
提前致谢。
答案 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
。