1

私はこれに何日も立ち往生していて、オンラインで見つけたすべての解決策を試しましたが、運がありませんでした。

多くの転校にリンクしている学生がいます。各転送はクラスにリンクされています。

フォームを作成するには、次のクラスを使用します:StudentType、TransferType。

StudentTypeフォームクラスには、TransferTypeタイプのフィールドがありました。以下のコード。

StudentType.php

<?php
// src/PS/PSchoolBundle/Form/StudentType.php

namespace PS\PSchoolBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use PS\PSchoolBundle\Entity\Responsible;
use PS\PSchoolBundle\Entity\AuthorizedPerson;
use PS\PSchoolBundle\Entity\Transfer;

class StudentType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('subNumber', 'text', array('required'  => false))
            ->add('subDate', 'date', array(
                        'required'  => false,
                        'widget' => 'single_text',
                        'format' => 'dd/MM/yyyy',
                        'attr' => array('class' => 'datepicker')
                    ))
            ->add('lastName', 'text')
            ->add('firstName', 'text')
            ->add('lastNameSecondLanguage', 'text', array('required'  => false))
            ->add('firstNameSecondLanguage', 'text', array('required'  => false))
            ->add('birthDate', 'date', array('required'  => false,
                        'widget' => 'single_text',
                        'format' => 'dd/MM/yyyy',
                        'attr' => array('class' => 'datepicker')
                    ))
            ->add('birthPlace', 'text', array('required'  => false))
            ->add('birthPlaceSecondLanguage', 'text', array('required'  => false))
            ->add('gender', 'choice', array('choices' => array('' => 'Veuillez choisir', 'm' => 'Garçon', 'f' => 'Fille')))
            ->add('nationality', 'text', array('required'  => false))
            ->add('homeLanguage', 'text', array('required'  => false))
            ->add('bloodType', 'text', array('required'  => false))
            ->add('familySituation', 'choice', array('required'  => false,
                                                            'choices' => array(
                                                            '' => 'Veuillez choisir',
                                                            'm' => 'Mariés',
                                                            'd' => 'Divorcés',
                                                            'w' => 'Veuve',
                                                            'a' => 'Autre')))
            ->add('schoolStatusBefore', 'choice', array('required'  => false, 'choices' => array('' => 'Veuillez choisir', 's' => 'Scolarisé', 'ns' => 'Non scolarisé')))
            ->add('remark', 'textarea', array('required'  => false))
            ->add('responsibles', 'collection', array('type' => new ResponsibleType,
                                                      'prototype' => true,
                                                      'allow_add' => true,
                                                      'allow_delete' => true))
            ->add('authorizedPersons', 'collection', array('type' => new AuthorizedPersonType,
                                                      'prototype' => true,
                                                      'allow_add' => true,
                                                      'allow_delete' => true))

            ->add('transfers', 'collection', array('type' => new TransferType,
                                                      'prototype' => true,
                                                      'allow_add' => true,
                                                      'allow_delete' => true));
    }

    public function getName()
    {
        return 'student';
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'PS\PSchoolBundle\Entity\Student'
        );
    }
}

TransferType.php

<?php
// src/PS/PSchoolBundle/Form/TransferType.php

namespace PS\PSchoolBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use PS\PSchoolBundle\Entity\Transfer;
use Doctrine\ORM\EntityRepository;

class TransferType extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('reason', 'choice', array(
                        'choices' => array('success' => 'Réussite', 'failure' => 'Échec'),
                        'required'  => false
                        ))
            ->add('date', 'date', array(
                        'widget' => 'single_text',
                        'format' => 'dd/MM/yyyy',
                        'attr' => array('class' => 'datepicker')
                    ))
            ->add('school', 'text', array('required'  => false))
            ->add('classe', 'entity', array('class' => 'PSPSchoolBundle:Classe', 'property' => 'name'));
    }

    public function getName()
    {
        return 'transfer';
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'PS\PSchoolBundle\Entity\Transfer'
        );
    }
}

TransferTypeに「classe」フィールドを追加すると、フォームを表示する代わりに、次のエラーがスローされます。

選択フィールドに渡されるエンティティは管理する必要があります500内部サーバーエラー-FormException

TransferTypeを試しましたが、クラス選択フィールドが入力された状態でフォームが正しく表示されることに注意してください。この問題は、TransferTypeとStudentTypeを一緒に使用した場合にのみ発生します。

ありがとう

編集-以下は、フォームを生成するコントローラーのアクションです。

public function byIdEditAction($id)
{
        $em = $this->getDoctrine()->getEntityManager();

        if(!$student = $em->getRepository('PSPSchoolBundle:Student')->find($id))
        {
        throw $this->createNotFoundException('Student[id='.$id.'] does not exist.');
        }

        $form        = $this->createForm(new StudentType(), $student);
        $formHandler = new StudentHandler($form, $this->get('request'), $em);

        if($formHandler->process())
        {
            $this->get('session')->setFlash('wehappy', "L'élève a été mis à jour.");
            return $this->redirect($this->generateUrl('_studentsbyidshow', array('id' => $student->getId())));
        }

        return $this->render('PSPSchoolBundle:Student:edit.html.twig', array(
            'form' => $form->createView(),
            'student' =>  $student
    ));
}
4

1 に答える 1

0

私の問題は、実際には、エンティティフィールド(Classe)を持つエンティティフィールド(Transfer)を持つStudentTypeを使用しているという事実に関連していました。Studentオブジェクトにリンクされた転送オブジェクトにはClasseがリンクされていなかったため、Classes選択フィールドに追加する必要のあるClasseオブジェクトが管理されていないという事実について不平を言って例外がスローされました。つまり、エンティティマネージャによって管理される必要があります。言い換えれば、それはデータベースからのものでなければなりませんでした。

この問題を修正する方法は2つあります。明らかな方法は、Doctrineでその関係がnull許容に設定されているため、データベースで欠落していたリンクを修正することでした。2番目の方法は、デフォルトのClasseオブジェクトを作成してデータベースからプルし、次のように転送に割り当てることでした。

if(!$classe = $em->getRepository('PSPSchoolBundle:Classe')->find(-2))
    {
        throw $this->createNotFoundException('Classe[id='.$id.'] does not exist.');
    }

    $transfer->setClasse($classe);

StudentTypeを使用して実際にフォームを作成する前に...

これが誰かに役立つことを願っています。

于 2012-09-20T17:24:50.433 に答える