由其他对象过滤的Symfony Custom ChoiceType

时间:2017-08-09 01:01:57

标签: php symfony symfony-forms

class User 
{
    public $id;
    public $username;

    public function getCompanies()
    {
        //stuff
    }
}

class Company 
{
    public $id;
    public $name;

    public static function getForUser(User $user) 
    {
        //stuff
    }
}

我有上述两个模型,并希望创建一个可重复使用的自定义ChoiceType字段,该字段将是基于User对象的筛选Company ID(或对象)的选择框。如果未提供User,则拥有所有公司对象的ChoiceType(选择框)。

我该如何解决这个问题?我一直在阅读Symfony文档,并且似乎找不到任何类似于我需要的例子。

我可以使用公司类中的getForUser()或来自User类的getCompanies()(他们几乎都做同样的事情)。

公司与用户之间没有直接关系。它们通过其他对象/表格(经理/客户/联系人)“加入”。

class CompanyType extends AbstractType 
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('company', ChoiceType::class, array(
            "choices" => ??????
        ));
    }

    public function getParent()
    {
        return ChoiceType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Company::class,
        ));
    }

}

所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我建议你试试这个链接:

https://symfony.com/doc/current/reference/forms/types/entity.html#using-a-custom-query-for-the-entities

use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
// ...

$builder->add('users', EntityType::class, array(
    'class' => 'AppBundle:Company',
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('u')
            ->orderBy('u.name', 'ASC');   //or DESC
    },
    'choice_label' => 'username',
));