所以我已经尝试了一段时间来修改symfonys的基本crud系统以满足我的需要。然而,我无法理解为什么在get形式中他们定义了实体,然后在帖子中他们又重写了实体?
我有一个关系,它将1个作业与许多工作项联系起来,我想修改的是创建'Work',以便它是从一个作业项创建的,并且通过dash_work_new路由传递jobId。
选项1
我管理的是从传递的变量中加载我的工作实体并设置我的工作项,就像这样$entity->setWorkJob()。伟大的?不,因为在提交时调用了dash_work_create路由,为什么?工作实体是否再次定义?因此清除我在newAction()方法
中设置的任何内容选项2
所以我想我会传递变量作为一个隐藏的字段,然后加载提交的所有数据,但挂在createCreateForm是在createAction中重新定义的,所以如果我试图通过createCreateForm($entity,$jobId)在新动作中传递一个变量。我还需要在createAction中定义它,但我没有....啊%#@@ expleve expleve expleve
AH的挫折和缺乏理解。参考console crud生成的symfony workController。我留下了改变后的新路由,从@route new变成@route new/{jobId}
非常感谢您的帮助
/**
* Creates a new Work entity.
*
* @Route("/", name="dash_work_create")
* @Method("POST")
* @Template("LaelapsInvoiceBundle:Work:new.html.twig")
*/
public function createAction(Request $request)
{
$entity = new Work();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('dash_job'));
}
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}
/**
* Creates a form to create a Work entity.
*
* @param Work $entity The entity
*
* @return SymfonyComponentFormForm The form
*/
private function createCreateForm(Work $entity)
{
$form = $this->createForm(new WorkType(), $entity, array(
'action' => $this->generateUrl('dash_work_create'),
'method' => 'POST',
));
$form->add('submit', 'submit', array('label' => 'Create'));
return $form;
}
/**
* Displays a form to create a new Work entity.
*
* @Route("/new/{jobId}", name="dash_work_new")
* @Method("GET")
* @Template()
*/
public function newAction($jobId)
{
$entity = new Work();
$form = $this->createCreateForm($entity);
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}
在您的POST操作中创建表单框架:
$entity = new Work();
$form = $this->createCreateForm($entity);
因为需要处理请求,所以后面的表单中填充了请求数据:
$form->handleRequest($request);
现在您有了包含newAction()
中提供的数据的表单,然后验证它:
$form->isValid()
现在,足够的理论。我看到您只是想将jobId
传递给POST操作。最简单的方法是通过url,你所要做的就是改变表单的路由和动作。POST动作看起来像这样:
/**
* Creates a new Work entity.
*
* @Route("/{jobId}", name="dash_work_create")
* @Method("POST")
* @Template("LaelapsInvoiceBundle:Work:new.html.twig")
*/
public function createAction(Request $request, $jobId)
{
$entity = new Work();
$form = $this->createForm(new WorkType(), $entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
//fetch you Job entity by $jobId and do what you need.
$job = $em->getRepository('MyBundleEntityJob')->findOneById($jobId);
$entity->setWorkJob($job);
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('dash_job'));
}
return array(
'entity' => $entity,
'form' => $form->createView(),
);
和new action:
/**
* Displays a form to create a new Work entity.
*
* @Route("/new/{jobId}", name="dash_work_new")
* @Method("GET")
* @Template()
*/
public function newAction($jobId)
{
$entity = new Work();
$form = $this->createForm(new WorkType(), $entity,
array(
'action' => $this->generateUrl('dash_work_create', array('jobId' => $jobId ))
));
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}