Шаблон формы ветки: невозможно получить доступ к свойству PersistentCollection из «Symfony \ Component \ Form \ FormView». Symfony 4 - PullRequest
0 голосов
/ 09 октября 2019

Я создаю форму для сущности с именем "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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...