Проблема в том, что форма встроена, а свойство postalcode находится во встроенной форме.

Я создал 2 объекта в моем проекте Symfony с отношением OneToOne.

Сущность пользователя:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
// A voir !!!!
use Symfony\Component\Security\Core\User\AdvancedUserInterface;

/**
 * @ORM\Entity(repositoryClass="App    \Repository\UserRepository")
 * @UniqueEntity(
 * fields= {"email"},
 * message= "L'email est déjà utilisé"
 * )
 */
class User implements AdvancedUserInterface, \Serializable
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

...

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Entreprise", mappedBy="user", cascade={"persist", "remove"})
     */
    private $entreprise;

Предприятие

/**
 * @ORM\Entity(repositoryClass="App\Repository\EntrepriseRepository")
 */
class Entreprise
{
    /**
     * @ORM\Id()
     * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="entreprise", cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    /**
     * @ORM\Column(name="postalcode", type="string", length=16, nullable=false)
     */

    private $postalcode;

    public function setPostalcode($postalcode)
    {
        $this->postalcode = $postalcode;

        return $this;
    }

    public function getPostalcode()
    {
        return $this->postalcode;
    }

И теперь я сделал 2 FormType One - это обычный UserType, в который встроен EntrepriseType. Проблема в том, что у меня есть запрос ajax в моем запросе Entreprise.

Вот так: UserType:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->entityManager = $options['entity_manager'];
        $builder
            ->add('email', EmailType::class)
            ->add('username', TextType::class)
            ->add('password', PasswordType::class)
            ->add('confirm_password', PasswordType::class)
            ->add('termsaccepted', CheckboxType::class, array(
            'mapped' => false,
            'constraints' => new IsTrue(),))
            ->add('entreprise', EntrepriseType::class, $options)
        ;
    }

И EntrepriseType:

private $entityManager;
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $this->entityManager = $options['entity_manager'];
    $builder
        ->add('postalcode', TextType::class, array(
            'attr'=> array('class'=>'postalcode form-control', 
            'maxlength'=>4,
            'value'=>'')))
        ->add('ville', ChoiceType::class, array(
                    'attr'=>array('class'=>'ville form-control')))
        ->add('adresse', TextType::class)
        ->add('complementadresse', TextType::class)
    ;
    $city = function(FormInterface $form, $codepostal){

        $repo = $this->entityManager->getRepository("App:Localite");
        $localitestofind = $repo->findBy(array('codepostal'=>$codepostal));
        $localites = array();

        if($localitestofind)
        {
            foreach($localitestofind as $localitetofind)
            {
                $localites[$localitetofind->getNom()] = $localitetofind->getNom();
            }
        }
        $form->add('ville', ChoiceType::class, array(
                                'attr'=>array('class'=>'ville form-control'), 
                                'choices'=> $localites));
    };
    $builder->get('postalcode')->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) use ($city){
        $city($event->getForm()->getParent(), $event->getForm()->getData());
    });
}

Мой файл Twig:

{{form_start(form)}}
    {{form_row(form.username, {'label':'Nom d\'utilisateur','attr':{'placeholder':'Nom d\'utilisateur'}})}}
    {{form_row(form.email, {'label':'Adresse email','attr':{'placeholder':'rh@entreprise.ch'}})}}
    {{form_row(form.password, {'label':'Mot de passe','attr':{'placeholder':'Mot de passe'}})}}
    {{form_row(form.confirm_password, {'label':'Répéter le mot de passe','attr':{'placeholder':'Confirmer votre mot de passe '}})}}
    {{form_row(form.entreprise.adresse, {'label':'Adresse','attr':{'placeholder':'Rue et n°'}})}}
    {{form_row(form.entreprise.complementadresse, {'label':'Complément d\'adresse','attr':{'placeholder':'Espace business 2'}})}}
    {{form_row(form.entreprise.postalcode, {'label':'Code postal','attr':{'placeholder':'Code postal', 'class':'postalcode form-control', 'maxlength':'4', 'value':''}})}}
    {{form_row(form.entreprise.ville, {'label':'Ville','attr':{'placeholder':'Ville', 'class':'ville form-control'}})}}
    {{form_row(form.termsaccepted, {'label':"En soumettant ce formulaire, vous acceptez nos conditions d'utilisation et notre politique de Protection des données."})}}
    <button type="submit" class="btn btn-success" >Inscription</button>
{{ form_end(form)}}

Проблема в том, что мой «почтовый индекс» не распознается: поэтому ошибка:

Neither the property "postalcode" nor one of the methods "getPostalcode()", "postalcode()", "isPostalcode()", "hasPostalcode()", "__get()" exist and have public access in class "App\Entity\User".

У тебя есть идеи, как это сделать? Спасибо за помощь !!!

0
cretthie 5 Окт 2018 в 17:21

1 ответ

Лучший ответ

Вам нужно сгенерировать свои сеттеры и геттеры для объекта сущности:

php app/console doctrine:generate:entities App

Вы увидите фактическое изменение файла, и вы сможете использовать его. Почтовый индекс свойства. В настоящее время он является частным, поэтому он отображается так, как будто его не существует.

1
Ralph Melhem 5 Окт 2018 в 14:25