【发布时间】:2021-08-03 14:03:17
【问题描述】:
我想制作一个带有显示不同选项的选择字段的表单。
这些选项是NomenclatureDTO 对象字段$libNom 的列表设置为:
class NomenclatureDTO
{
public int $idNom;
public string $libNom;
public string $dtMiseEnPlace;
public string $dtObsolescence;
}
这是表单适用的类:
class AvisDTO
{
public string $dtAvis;
public string $dtEmission;
public string $idActeurAuteur;
public string $nomAuteur;
public string $prenomAuteur;
public bool $boEstTacite;
public ArrayCollection $documents;
public string $idConsultation;
public array $idsPieces;
public int $nomNatureAvisRendu;
public int $nomTypeAvis;
public string $txAvis;
public string $txFondementAvis;
public string $txHypotheses;
public string $txQualiteAuteur;
public function __construct()
{
$this->documents = new ArrayCollection();
}
}
我想在选择选项中显示libNom,但我只需要在提交时使用idNom。
所以,我的表单看起来像:
<?php
namespace App\Form;
use App\Entity\DTO\AvisDTO;
use App\Entity\DTO\DataFormMapper\DataAvisType;
use App\Entity\DTO\NomenclatureDTO;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ChoiceList\ChoiceList;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class AvisType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// dd($options['dataPostAvis']->nomNatureAvisRendu); L21: SCREENSHOT
$builder
->add('nomAuteur', TextType::class, [
'label' => "Nom",
])
->add('prenomAuteur', TextType::class, [
'label' => "Prénom"
])
->add('boEstTacite', ChoiceType::class, [
'required' => true,
'label' => "L'avis est-il tacite ?",
'label_attr' => [
'class' => "font-weight-bold"
],
'expanded' => true,
'multiple' => false,
'choices' => [
'Oui' => true,
'Non' => false,
],
])
->add('nomNatureAvisRendu', ChoiceType::class, [
'label' => "Nature de l'avis rendu",
'required' => false,
'choices' => $options['dataPostAvis']->nomNatureAvisRendu,
'choice_label' => function(?NomenclatureDTO $choice) {
return $choice->libNom;
},
'choice_value' => function(?NomenclatureDTO $choice) {
// dd($choice); L50: SCREENSHOT
// dd(gettype($choice->idNom), $choice->idNom);L51: SCREENSHOT
return $choice->idNom;
},
])
->add('nomTypeAvis', ChoiceType::class, [
'label' => "Type d'avis",
'required' => false,
'choices' => $options['dataPostAvis']->nomTypeAvis,
'choice_label' => function($choice) {
return $choice->libNom;
},
'choice_value' => ChoiceList::value($this, 'idNom'),
])
->add('txAvis', TextareaType::class, [
'required' => true,
'attr' => [
'placeholder' => "Avis favorable avec prescriptions. \nPremière prescription : Les volets doivent être en bois"
]
])
->add('txFondementAvis', TextareaType::class, [
'attr' => [
'placeholder' => "L'avis de l'ABF est rendu en application de l'article R. 425-30 du Code de l'urbanisme."
]
])
->add('txHypotheses', TextareaType::class, [
'attr' => [
'placeholder' => "Dans l'hypothèse où la puissance électrique nécessaire est de x alors le coût de raccordement est de y"
]
])
->add('txQualiteAuteur', TextareaType::class, [
'attr' => [
'placeholder' => "Qualité"
]
])
->add('Envoyer', SubmitType::class, [
'row_attr' => [
'class' => 'row justify-content-end'
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => AvisDTO::class,
'dataPostAvis' => DataAvisType::class,
]);
}
}
屏幕截图 L21:
屏幕截图 L50:
屏幕截图 L51:
我在页面实际显示表单之前收到此错误:
注意:试图获取非对象的属性 'idNom'
这对我来说毫无意义,因为转储 L51 明确表示 $choice 是 NomenclatureDTO 对象...
编辑:
我尝试设置:
->add('nomNatureAvisRendu', ChoiceType::class, [
'label' => "Nature de l'avis rendu",
'required' => false,
'choices' => $options['dataPostAvis']->nomNatureAvisRendu,
'choice_label' => function(?NomenclatureDTO $choice) {
return $choice ? $choice->idNom : null;
},
'choice_value' => static function(?NomenclatureDTO $choice): int {
return $choice->idNom ?? 0;
},
])
提交时返回:
类型属性 App\Entity\DTO\AvisDTO::$nomNatureAvisRendu 必须是 int, App\Entity\DTO\NomenclatureDTO 使用
【问题讨论】:
标签: php symfony symfony-forms choicefield