Forms Symfony2:对已翻译实体表单字段进行排序/排序?
我正在尝试订购一个实体表单字段,该字段已翻译 我使用的是symfony翻译工具,所以我不能用SQL语句对值进行排序。 有没有办法在加载和转换后对值进行排序 也许使用表单事件Forms Symfony2:对已翻译实体表单字段进行排序/排序?,forms,symfony,translation,Forms,Symfony,Translation,我正在尝试订购一个实体表单字段,该字段已翻译 我使用的是symfony翻译工具,所以我不能用SQL语句对值进行排序。 有没有办法在加载和转换后对值进行排序 也许使用表单事件 $builder ->添加('国家','实体', 排列( 'class'=>'MyBundle:Country', “翻译领域”=>“国家”, '属性'=>'名称', '空\u值'=>'--', ) ) 我认为这是不可能的。您需要使用PHP排序,但如果您使用Symfony表单类型,我建议在页面加载后使用JavaScript对
$builder
->添加('国家','实体',
排列(
'class'=>'MyBundle:Country',
“翻译领域”=>“国家”,
'属性'=>'名称',
'空\u值'=>'--',
)
)
我认为这是不可能的。您需要使用PHP
排序,但如果您使用Symfony表单类型,我建议在页面加载后使用JavaScript
对其进行排序。如果您的国家/地区位于一个数组中,只需使用sort()
函数,并使用sort\u字符串
标志即可。在我看来,你会做一些体操来达到目的。
检查此文档:我找到了在我的表单类型中对字段值进行排序的解决方案 我们必须使用finishView()方法,该方法在创建表单视图时调用:
<?php
namespace My\Namespace\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Bundle\FrameworkBundle\Translation\Translator;
class MyFormType extends AbstractType
{
protected $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function finishView(FormView $view, FormInterface $form, array $options)
{
// Order translated countries
$collator = new \Collator($this->translator->getLocale());
usort(
$view->children['country']->vars['choices'],
function ($a, $b) use ($collator) {
return $collator->compare(
$this->translator->trans($a->label, array(), 'countries'),
$this->translator->trans($b->label, array(), 'countries')
);
}
);
}
// ...
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('country', 'entity',
array(
'class' => 'MyBundle:Country',
'translation_domain' => 'countries',
'property' => 'name',
'empty_value' => '---',
)
)
;
}
}
也许我可以用更好的方式?
最初,我希望直接在表单生成器中执行此操作,而不是在使用此表单的控制器中添加额外代码
$fview = $form->createView();
usort(
$fview->children['country']->vars['choices'],
function($a, $b) use ($translator){
return strcoll($translator->trans($a->label, array(), 'countries'), $translator->trans($b->label, array(), 'countries'));
}
);