Symfony & Doctrine: Order Form Type By Choice Label



我在Symfony 2.8中有一个使用choice_label选项的表单类型。此值是一个函数,它对参数应用一些格式,目的是返回带有任何前导"字符串移动到末尾的字段name(因此"公司公司"变为"公司公司,The"。

当这不是实体字段时,如何按choice_labelFormType进行排序?

// FormTypeAdvertiserType.php
...
->add(
    'advertiser',
    'entity',
    array(
        'class' => 'MyBundle:Advertiser',
        'label' => 'Advertiser Account',
        'choice_label' => 'formattedName',
        'query_builder' => function(EntityRepository $repo) {
            return $repo->createQueryBuilder('a')
                ->orderBy('a.name', 'ASC')
            ;
        }
    )
)
...

我不能在查询构建器中使用orderBy('a.formattedName', 'ASC'),因为这是一个函数名称而不是实体字段。

广告客户实体具有以下附加功能:

// EntityAdvertiser.php
...
public function getFormattedName() {
    if (substr($this->name, 0, 4) == 'The ') {
        return substr($this->name, 4) . ', The';
    } else {
        return $this->name;
    }
}
...

感谢您的帮助或指示。

仓库中实现排序功能

public function getSortedList()
{
    $entities = $this->findAll();
    usort($entities, function($a, $b) {
        return strcmp($a->getFormattedName(), $b->getFormattedName());
    });
    return $entities;
}

将其传递给控制器中的表单类型

$form = $this->createForm(AdvertiserType::class, $advertiser, array('repository' => $this->getDoctrine()->getRepository('AppBundle:Advertiser')));

,然后将query_builder更改为选项

// FormTypeAdvertiserType.php
// before $builder->add
$repo = $options['repository'];
...
->add(
    'advertiser',
    'entity',
    array(
        ...
        'choices' => $repo->getSortedList(),
        }
    )
)
...
// and in configureOptions(OptionsResolver $resolver) method
$resolver->setDefaults(array(
    'data_class' => 'AppBundleEntityAdvertiser',
    'validation_groups' => array(),
    'repository' => null
));

相关内容

  • 没有找到相关文章

最新更新