我在Symfony 2.8中有一个使用name
选项的表单类型。此值是一个函数,它对参数应用一些格式,目的是返回字段FormType
与任何前导""字符串移到最后(所以"公司公司"成为"公司公司,"。
如果choice_label
不是实体字段,我如何订购// \Form\Type\AdvertiserType.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')
我无法在查询构建器中使用// Entity\Advertiser.php
...
public function getFormattedName() {
if (substr($this->name, 0, 4) == 'The ') {
return substr($this->name, 4) . ', The';
} else {
return $this->name;
}
}
...
,因为这是一个函数名而不是实体字段。
广告客户实体具有以下附加功能:
from os import path
def _get_upload_to(instance, filename):
return path.join(instance._meta.app_label, 'subdir', filename)
class MyModel(models.Model):
....
datoteka = models.FileField(upload_to=_get_upload_to, ...)
感谢您的帮助或指示。
答案 0 :(得分:2)
在存储库中实现排序功能
public function getSortedList()
{
$entities = $this->findAll();
usort($entities, function($a, $b) {
return strcmp($a->getFormattedName(), $b->getFormattedName());
});
return $entities;
}
将其传递给控制器中的FormType
$form = $this->createForm(AdvertiserType::class, $advertiser, array('repository' => $this->getDoctrine()->getRepository('AppBundle:Advertiser')));
然后将query_builder更改为选项
// \Form\Type\AdvertiserType.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' => 'AppBundle\Entity\Advertiser',
'validation_groups' => array(),
'repository' => null
));