实体字段的首选 - Symfony2

时间:2013-06-24 13:44:43

标签: symfony

我已经将实体字段类型添加到我正在使用的表单中,但是当我尝试设置preferred_choices时,我收到以下错误消息

  

警告:spl_object_hash()期望参数1为object,在/srv/www/amber/public_html/Symfony/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php中给出字符串第98行

您可以看到以下代码

    $builder->add('candStatus', 'entity', array(
        'label' => 'Candidate Status', 
        'class' => 'AmberAtsBundle:SelCandStatus',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('sc')
            ->orderBy('sc.rank', 'ASC');
            },
         'property' => 'candStatus',
         'preferred_choices' => array('1'),
        ));

我是Symfony的新手,所以任何帮助都会受到赞赏

4 个答案:

答案 0 :(得分:10)

这适用于Symfony 2.7:

$builder->add('license', 'entity', [
    'class' => 'CmfcmfMediaModule:License\LicenseEntity',
    'preferred_choices' => function (LicenseEntity $license) {
        return !$license->isOutdated();
    },
    // ...
])

preferred_choices需要一个为每个实体调用的匿名函数,并且必须返回true或false,具体取决于它是否是首选。

答案 1 :(得分:2)

我认为您需要将EntityRepository(或类似内容)传递给您的表单,并实际向preferred_choices提供实体集合。从内存中,在Symfony的早期版本中,它将允许一组实体ID,但现在不允许。

可能preferred_choices也应该是回调,例如query_builder

实际确定来自preferred_choices的内容是否与特定选项匹配的代码如下所示。它只是一个简单的PHP array_search()

Symfony \ Component \ Form \ Extension \ Core \ ChoiceList \ ChoiceList #

protected function isPreferred($choice, array $preferredChoices)
{
    return false !== array_search($choice, $preferredChoices, true);
}

答案 2 :(得分:1)

从您的示例中,您希望将第一个结果作为首选结果,您必须返回具有第一个排名而不是其索引的实体。

为此,您可以在控制器中对其进行检索,然后将其作为$options中的参数传递:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //prevent error if $options['prefered_choices'] is not set
    $prefered_choices = isset($options['prefered_choices']) ? $options['prefered_choices'] : array();
    $builder->add('candStatus', 'entity', array(
        'label' => 'Candidate Status', 
        'class' => 'AmberAtsBundle:SelCandStatus',
        'query_builder' => function(EntityRepository $er) {
            return $er->createQueryBuilder('sc')
                ->orderBy('sc.rank', 'ASC')
            ;
        },
        'property' => 'candStatus',
        'preferred_choices' => $prefered_choices,
    ));
    //...
}

你也可以使用getReference,因为j_goldman注意到in their comment,但由于你的排名可以改变(我认为),我觉得它不适合你的用例:

$builder->add('candStatus', 'entity', array(
    'label' => 'Candidate Status', 
    'class' => 'AmberAtsBundle:SelCandStatus',
    'query_builder' => function(EntityRepository $er) {
        return $er->createQueryBuilder('sc')
            ->orderBy('sc.rank', 'ASC')
        ;
    },
    'property' => 'candStatus',
    'prefered_choices' => $this->em->getReference('AmberAtsBundle:SelCandStatus', 1),
));

最后,您可以使用回调所选实体的回调,例如使用您使用的相同DQL,限制为1 :(这就是我要做的)

$builder->add('candStatus', 'entity', array(
    'label' => 'Candidate Status', 
    'class' => 'AmberAtsBundle:SelCandStatus',
    'query_builder' => function(EntityRepository $er) {
        return $er->createQueryBuilder('sc')
            ->orderBy('sc.rank', 'ASC')
        ;
    },
    'property' => 'candStatus',
    'preferred_choices' => function(EntityRepository $er) {
        return $er->createQueryBuilder('sc')
            ->orderBy('sc.rank', 'ASC')
            ->setMaxResults(1)
        ;
    },
));

答案 3 :(得分:0)

在Symfony3中,以下内容适用于我:

'preferred_choices' => function($entity) {
                $preferred = [1, 2];
                $choices = [];

                if(in_array($entity->getId(), $preferred)) {
                    $choices[] = $entity;
                }

                return $choices;
            },