0

事情就是这样。

我想在一个视图中制作 2 个表单。一个绑定到实体,另一个是文件类型,我想在其中放置 .csv 并捕获其中的信息以填充第一个实体。

我已经创建了第一个,但我不知道如何创建第二个并将其正确集成到同一个视图中,这样它们就不会互相争斗。这是我的文件(csv 进程还没有在这里)

我的控制器:

public function adminAction()
    {
    $form = $this->createForm(new StudentsType, null);
    $formHandler = new StudentsHandler($form, $this->get('request'), $this->getDoctrine()->getEntityManager());

    if( $formHandler->process() )
    {
        return $this->redirect( $this->generateUrl('EnsgtiEnsgtiBundle_ens'));
    }

    return $this->render('EnsgtiEnsgtiBundle:Appli:admin.html.twig', array(
        'form' => $form->createView(),
    ));

    }

第一种形式:

class StudentsType extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('nom', 'text')->setRequired(false)
            ->add('prenom', 'text')
            ->add('email', 'email')
            ->add('codeEtape', 'text')
            ->add('file', new StudentsListType)->SetRequired(false);
    }

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

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'Ensgti\EnsgtiBundle\Entity\Students',
        );
    }

}

处理程序:

class StudentsHandler
{
    protected $form;
    protected $request;
    protected $em;

    public function __construct(Form $form, Request $request, EntityManager $em)
    {
        $this->form    = $form;
        $this->request = $request;
        $this->em      = $em;
    }

    public function process()
    {
        if( $this->request->getMethod() == 'POST' )
        {
            $this->form->bindRequest($this->request);

            if( $this->form->isValid() )
            {
                $this->onSuccess($this->form->getData());

                return true;
            }
        }

        return false;
    }

    public function onSuccess(Students $students)
    {
        $this->em->persist($students);
        $this->em->flush();
    }
}

第二种形式:

class StudentsListType extends AbstractType
{

    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
        ->add('', 'file');

    }

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

}

处理程序:

class StudentsListHandler
{
    protected $form;
    protected $request;
    protected $em;

    public function __construct(Form $form, Request $request, EntityManager $em)
    {
        $this->form    = $form;
        $this->request = $request;
        $this->em      = $em;
    }

    public function process()
    {
        if( $this->request->getMethod() == 'POST' )
        {
            $this->form->bindRequest($this->request);

            if( $this->form->isValid() )
            {
                //$this->onSuccess($this->form->getData());
                print_r($this->form->getData());
                return true;
            }
        }

        return false;
    }

    public function onSuccess(/*StudentsList $studentsList*/)
    {
        //$this->em->persist($studentsList);
        //$this->em->flush();
        echo 'Petit test';
    }
}

使用此代码,我得到以下信息:

“Ensgti\EnsgtiBundle\Entity\Students”类中既不存在属性“file”,也不存在方法“getFile()”或方法“isFile()”

这是正常的,因为我绑定到没有文件类型的实体。我是初学者,所以我一直在阅读文档,但我仍然很难理解所有内容。有没有一种方法可以在同一个视图中制作 2 个表单,其中一个表单未绑定到实体,但无论如何都会通过 csv 处理持续存在?

4

2 回答 2

0

问题是表单期望file成为绑定实体的属性。您只需要将 设置property_path为 false。(参考)例如

->add('file', new StudentsListType, array('property_path' => false))

编辑:

如果将 2 个表单完全分开会更有意义,那么->add(/*...*/)完全删除上面的内容,然后将两个表单从控制器传递给视图。然后,您可以单独渲染每一个。

于 2012-09-13T14:49:10.820 回答
-3

用来<iframe>做那件事。这是如何使用它的链接src,只需将属性 url 放入所需页面。您可以在一种布局中显示 2 页。这就是它的 样子

于 2012-09-13T14:46:30.477 回答