Symfony嵌入式表格

时间:2018-10-05 14:21:41

标签: php symfony

问题在于表单是嵌入的,而属性 邮政编码 是嵌入的表单

我在symfony项目中通过OneToOne关系创建了2个实体。

用户实体:

<?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。一个是嵌入EntrepriseType的普通UserType。问题是我的Entreprise查询上有一个ajax查询。

像这样: 用户类型:

    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".

您对如何操作有想法吗? 谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要为实体对象生成setter和getter:

php app/console doctrine:generate:entities App

您将看到实际的文件更改,并且可以使用它们属性postalCode 当前它是私有的,这就是为什么它似乎不存在的原因