尝试更新我的实体,遗憾的是没有使用Doctrines生成CRUD功能(必须改变我没写过的东西)。 我最终将数据输入到我的表单中,但它只是不会保存更改(同样,它也没有像人们可能怀疑的那样创建一个新实体)。 当我点击“保存”时,我总是返回到我的表单来编辑实体的页面。 检查方法是否为POST,它是。
if ($form->get('save')->isClicked()) {
似乎没有做任何事情,怎么会这样?
以下是我的其余行动:
/**
* Updates.
*
* @Route("/offerweekchange/{offerid}", name="offerweekchange")
* @Template("")
*/
public function offerweekchangeAction(Request $request, $offerid)
{
$request = $this->get('request');
if ($offerid) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AlexanderBuerkleShopBundle:Promotion')->findOneBy(array('id' => $offerid));
$form = $this->createForm(new OfferWeekChangeType(), $entity);
# \Doctrine\Common\Util\Debug::dump($request->getMethod());
if ($form->get('save')->isClicked()) {
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
$em->flush();
return $this->redirect($this->generateUrl('offerweeklist'));
}
}
}
return $this->render('AlexanderBuerkleShopBundle:OfferWeekList:offerweekchange.html.twig',
array('form' => $form->createView(), 'offerid' => $offerid, 'entity' => $entity));
}
}
非常感谢任何帮助。
答案 0 :(得分:2)
首先,这是代码的工作示例:
public function offerweekchangeAction(Request $request, $offerid)
{
if ($offerid) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AlexanderBuerkleShopBundle:Promotion')->findOneBy(array('id' => $offerid));
$form = $this->createForm(new OfferWeekChangeType(), $entity);
$form->handleRequest($request);
# \Doctrine\Common\Util\Debug::dump($request->getMethod());
if ($form->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('offerweeklist'));
}
return $this->render('AlexanderBuerkleShopBundle:OfferWeekList:offerweekchange.html.twig',
array('form' => $form->createView(), 'offerid' => $offerid, 'entity' => $entity));
}
}
其次,你在这里有几个错误,所以让我们逐个分析它们:
1:
if ($offerid) {
你的代码在else分支上什么都不做。
2:
$request = $this->get('request');
您已将请求参数注入操作中。这条线是多余的。
3:
$form->bind($request);
自2.3以来不推荐使用此功能。请改用$ form-> handleRequest($ request)。
4:
$em->flush();
你正在冲洗实体经理,但没有任何东西存在,所以什么都不会发生。你必须先用$ em-> persist($ entity)
来坚持实体5:
if ($request->getMethod() == 'POST') {
方法$ form-> isValid()也检查这一点,因此检查post是多余的。
那就是它。希望它有所帮助。
答案 1 :(得分:0)
此处最可能的问题是使用AbstractType定义您的表单 OfferWeekChangeType )。
要在实体上映射表单数据,您需要设置' data_class'。
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'data_class' => ' Acme\StoreBundle\Entity\Product',
)
);
}
然后在你的控制器内你需要调用:
$form->handleRequest($request);
这会将请求绑定到您的表单。
仅在您调用时:
$form->isValid()
表单中的数据(如果有效)将映射到实体上。
$em->persist($entity);
在这种情况下是superflus,因为Doctrine UnityOfWork已经知道'从您从存储库获取实体时的实体。只需调用
$em->flush($entity);
作为旁注,请记住,只刷新所需的实体(如果可能),冲洗整个UnityOfWork以避免意外行为。
问候。