Symfony&原则:按选择标签订购表单类型

时间:2016-05-31 13:48:14

标签: php symfony doctrine-orm

我在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, ...)

感谢您的帮助或指示。

1 个答案:

答案 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
));