Я создаю форму для сущности с именем "Fournisseur", которая содержит поле CollectionType
для связанной сущности "Контакт". Я правильно создаю представление формы, которое содержит все «контактные» записи и их свойства, если они существуют.
Но у меня возникает проблема, когда я пытаюсь применить тему формы к этому конкретному полю CollectionType
: я не могудоступ к некоторому свойству, и я получаю это сообщение:
"Ни свойство prenom
, ни один из методов prenom()
, getprenom()
/ isprenom()
/ hasprenom()
или __call()
не существуют и не имеютобщедоступный доступ в классе Symfony\Component\Form\FormView
.
Я понял, что эта проблема возникает только в тех полях, имя которых не существует в сущности * 1016. * Например, я могу получить доступ к nom
и email
свойство в Contact
Entity, потому что Fournisseur
entity получил то же свойство и -> createView, кажется, получил это свойство. Но я не могу получить доступ к другому свойству "Contact".
Вы увидите мой кодниже.
Большое спасибо за вашу помощь. Флориан.
Контроллер
/**
* @Route("/admin/fournisseur/ajax/edit/{id}", name="admin_fournisseur_ajax_edit", condition="request.isXmlHttpRequest()")
*/
public function admin_transporteur_ajax_edit(AtmosFournisseur $fournisseur, Request $request, ObjectManager $manager)
{
$form = $this->createForm(FournisseurType::class, $fournisseur, array(
'action' => "/admin/fournisseur/ajax/edit/".$fournisseur->getId()
))
->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
$manager->persist($fournisseur);
$manager->flush();
return new Response('success');
}
else
{
return $this->render('admin/fournisseur/partials/_edit.html.twig', [
'form' => $form->createView(),
'fournisseur'=>$fournisseur,
]);
}
}
Форма FournisseurType
class FournisseurType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom', TextType::class, [
'label' => 'Nom du fournisseur'
])
->add('code', TextType::class, [
'label' => 'Code COGILOG du fournisseur'
])
->add('adrNum', NumberType::class, [
'label' => 'N° Voie'
])
->add('adrVoie', TextType::class, [
'label' => 'Code COGILOG du fournisseur'
])
->add('adrComp1', TextType::class, [
'label' => 'Complément d\'adresse 1'
])
->add('adrComp2', TextType::class, [
'label' => 'Complément d\'adresse 2'
])
->add('adrCP', TextType::class, [
'label' => 'Code Postal'
])
->add('adrCedex', TextType::class, [
'label' => 'Cedex'
])
->add('adrPays', CountryType::class, [
'label' => 'Pays',
'choice_translation_locale' => 'fr'
])
->add('telephone', TelType::class, [
'label' => 'N° de téléphone'
])
->add('email', EmailType::class, [
'label' => 'Adresse e-mail'
])
->add('adrVille', TextType::class, [
'label' => 'Ville'
])
->add('contacts', CollectionType::class, array(
'entry_type' => AtmosFournisseurContactType::class,
'allow_add' => true,
'prototype' => true,
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => AtmosFournisseur::class,
]);
}
}
Шаблон веточки
{{ form_start(form) }}
{% form_theme form _self %}
<div class="row bg-light">
<div class="col-md-12"><h4>Editer le fournisseur</h4></div>
<div class="col-md-6">{{ form_row(form.nom) }}</div>
<div class="col-md-6">{{ form_row(form.code) }}</div>
<div class="col-md-4">{{ form_row(form.adrNum) }}</div>
<div class="col-md-8">{{ form_row(form.adrVoie) }}</div>
<div class="col-md-12">{{ form_row(form.adrComp1) }}</div>
<div class="col-md-12">{{ form_row(form.adrComp2) }}</div>
<div class="col-md-4">{{ form_row(form.adrCP) }}</div>
<div class="col-md-4">{{ form_row(form.adrCedex) }}</div>
<div class="col-md-4">{{ form_row(form.adrVille) }}</div>
<div class="col-md-12">{{ form_row(form.adrPays) }}</div>
<div class="col-md-12">{{ form_row(form.contacts) }}</div>
</div>
{{ form_widget(form) }}
<button class="btn btn-primary" type="submit">Enregistrer le formulaire</button>
{{ form_end(form) }}
{% block _fournisseur_contacts_widget %}
<div style="background:red;">
{{ form_widget(form) }}
</div>
{% endblock %}
{% block _fournisseur_contacts_entry_row %}
{{ form_widget(form) }}
{% endblock %}
{% block _fournisseur_contacts_entry_widget %}
{{ dump(form)}}
<div class="form-group">
<div class="row">
<div class="col-md-2">{{ form_row(form.nom) }}</div>
<div class="col-md-2">{{ form_row(form.prenom) }}</div>
<div class="col-md-2">{{ form_row(form.fonction) }}</div>
<div class="col-md-2">{{ form_row(form.telephone) }}</div>
<div class="col-md-2">{{ form_row(form.email) }}</div>
</div>
</div>
{% endblock %}
AtmosFournisseurContactType Code
class AtmosFournisseurContactType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom', TextType::class, [
'label' => 'Nom'
])
->add('prenom', TextType::class, [
'label' => 'Prénom'
])
->add('telephone', TelType::class, [
'label' => 'N° de téléphone'
])
->add('email', EmailType::class, [
'label' => 'E-mail'
])
->add('fonction', TextType::class, [
'label' => 'Fonction'
])
;
}
** FormView в _fournisseur_contacts_entry_widget **
`FormView^ {#739 ▼
+vars: array:30 [▶]
+parent: null
+children: array:14 [▼
"nom" => FormView^ {#1036 ▶}
"code" => FormView^ {#1032 ▶}
"adrNum" => FormView^ {#894 ▶}
"adrVoie" => FormView^ {#871 ▶}
"adrComp1" => FormView^ {#843 ▶}
"adrComp2" => FormView^ {#807 ▶}
"adrCP" => FormView^ {#783 ▶}
"adrCedex" => FormView^ {#437 ▶}
"adrPays" => FormView^ {#1115 ▶}
"telephone" => FormView^ {#1520 ▶}
"email" => FormView^ {#1522 ▶}
"adrVille" => FormView^ {#1524 ▶}
"contacts" => FormView^ {#1526 ▼
+vars: array:33 [▶]
+parent: FormView^ {#739}
+children: array:2 [▶]
-rendered: true
-methodRendered: false
}
"_token" => FormView^ {#1569 ▶}
]
-rendered: true
-methodRendered: true
`
** _ fournisseur_contacts_widget dum results **
FormView^ {#1526 ▼
+vars: array:33 [▶]
+parent: FormView^ {#739 ▶}
+children: array:2 [▼
0 => FormView^ {#1542 ▶}
1 => FormView^ {#1544 ▶}
]
-rendered: false
-methodRendered: false
}