我已经将实体字段类型添加到我正在使用的表单中,但是当我尝试设置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的新手,所以任何帮助都会受到赞赏
答案 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;
},