事情就是这样。
我想在一个视图中制作 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 处理持续存在?