1

問題の解決策を見つけるのに何時間も費やしましたが、ここで答えを見つけたいと思っています。

これが私のフォーム(エクスペリエンスタイプ)のコードです:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('intitulePoste')
            ->add('entreprise')
            ->add('dateDebut')
            ->add('dateFin')
            ->add('mission')
            ->add('idContrat', 'entity', array(
                            'class' => 'ClasseBundle:Contrat',
                            'property' => 'contrat',
                           // 'property_path' => false,
                             'multiple' => false,
                             'mapped' => true,
                            'empty_value' => 'Contrat',
                            // 'expanded'=> true,
                             ))
            ->add('idville', 'entity', array(
                            'class' => 'ClasseBundle:Ville',
                            'property' => 'nom',
                           // 'property_path' => false,
                             'multiple' => false,
                             'mapped' => true,
                             'attr' => array(
                                            'class' => 'lesvilles'
                                ), 
                             'empty_value' => 'Ville',

                             ))
        ;
    }

そして、エンティティをデータベースに登録するメソッドは次のとおりです。

public function testAction()
    {
        $exp = new Experience();
        $form = $this->createForm(new ExperienceType(), $exp);
        $request = $this->get('request');
        if ($request->getMethod() == 'POST') 
        {
            $form->bind($request);
            if ($form->isValid()) 
            {
                $em = $this->getDoctrine()->getManager();
                $exp = $form->getData();
                $exp->setIdMembre($this->idMembreAction());
                $em->persist($exp);
                $em->flush();
                return $this->redirect($this->generateUrl('test'));
            }
        }

                return $this->render('MembreBundle:Default:FormExp.html.twig', array(
                    'form' => $form->createView()));
    }

フォームを検証すると、「HTTP エラー 500 (内部サーバー エラー)」というエラーが表示され、ファイルdev.logを使用して次のメッセージが表示されます。

doctrine.DEBUG: INSERT INTO Experience (idContrat, idMembre, idVille, intitulePoste company, StartDate, EndDate, Mission) VALUES {"1" (,,,,,,,????): "[オブジェクト] (プロジェクト\\ ClasseBundle \ \ Entity \ \ Contract: {}) "," 2 ": 1," 3 ":" [オブジェクト] (project \ \ ClasseBundle \ \ Entity \ \ City: {}) "," 4 "," ggg "," 5 ":" ワッフル "," 6 "," 2222/22/22 "," 7 "," 2222/22/22 "," 8 ":" hjjhjhj "} []

そこで、ExperienceType ファイルに idVille フィールドと idContart フィールド (必須 false ) の両方に条件を追加し、フォームを検証するときに両方のフィールドが null 値 ( nullable = true )を受け入れることを Experience.php ファイル (エンティティ) に追加しました。私のエンティティは問題なくデータベースに保存されています。だから問題は何ですか?ありがとう

4

3 に答える 3

1

オブジェクトを間違った方法でマップした可能性があります。idContratobject の id プロパティを保存しようとすることを示唆するという名前のフォーム フィールドが表示されますContract__toString()そのため、そのオブジェクトにメソッドが必要でした。

マッピングは次のようになります。

/**
 * @ORM\ManyToOne("You\SomeBundle\Entity\Contract")
 * @ORM\JoinColumn(name="contract_id", referencedColumnName="id")
 * /
protected $contract;

よりも:

/**
 * @ORM\Column(name="idContract", type="integer")
 * /
protected $contract_id;
于 2013-07-19T06:53:50.360 に答える
0

ルックスを削除するという byf-ferdy の提案$exp = $form->getData();は正しいです。

同様の問題を抱えている他の人については、http://symfony.com/doc/2.1/book/forms.html#forms-and-doctrineにこれに関する詳細情報があります。

于 2013-06-15T16:23:18.420 に答える
0

この行はデータをオブジェクトとしてではなく として$exp = $form->getData();返すため、削除できます。メソッドに変数をarray渡したので、エンティティは自動的にフォームにマップされます。$expcreateForm()

于 2013-06-18T08:53:03.227 に答える