1

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

警告:spl_object_hash() 期望参数 1 是对象,字符串在 /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

4 回答 4

11

这适用于 Symfony 2.7:

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

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

于 2015-08-08T09:49:30.147 回答
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);
}
于 2014-03-18T02:33:04.750 回答
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在他们的评论中指出的那样,但是由于您的等级可以改变(我认为),我认为它不适合您的用例:

$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),
));

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

$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)
        ;
    },
));
于 2015-11-26T18:47:56.137 回答
0

在 Symfony3 中,以下对我有用:

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

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

                return $choices;
            },
于 2017-12-02T19:27:16.713 回答