【问题标题】:Symfony: get existing form referenceSymfony:获取现有的表单参考
【发布时间】:2016-01-08 09:45:33
【问题描述】:

在将网站迁移到 symfony 时,我必须重用一些 HTML 代码。当前的 HTML 页面有一个表单:

<form name="n1" id="n1" method="post" onsubmit="return verifSelect()" action="{{path('toto')}}" >

     <select>
         {% for e in experimentations %}
         <option>{{e.name}}</option>
         {% endfor %}
     </select>

</form>

我想将选择的Experimentation 对象(不仅仅是名称)传递给toto 页面。 The symfony doc uses something like:

if ($form->isSubmitted() && $form->isValid()) {
        // ... perform some action, such as saving the task to the database

        return $this->redirectToRoute('task_success');
}

但我有两个问题:

  • 如何获取form 对象引用?
  • 如何获取选定的experimentation 对象引用(以便将其作为参数发送到下一个路由)?

非常感谢您的帮助,

【问题讨论】:

  • 您不能在请求中发送对象。至少你不应该
  • 然后我可以发送实验 ID,以便稍后检索完整对象。但随后该 ID 将在 HTML 页面中可见,并且我将不得不执行另一个 SQL 请求。那不是也很危险吗?

标签: php symfony twig


【解决方案1】:

我不确定我是否理解你的问题,但我会尽力给你答案:

  • 您可以在控制器中使用 $form->getData() 获取表单数据。
  • 您不能将完整对象作为参数传递给下一个路由。

你可以这样做:

$data = $form->getData();
return $this->redirectToRoute('task_success',array('experimentation'=> $data['experimentation');

那么你就可以在你的 totoAction 上获取实验 ID。

希望对你有帮助。

【讨论】:

  • 如果你不想发送 id,你也可以使用 slugs 或类似的东西。
  • $form 来自哪里?主要问题是我没有以 symfony 的方式创建表单(它是一个静态 HTML 表单),所以我没有 $form 变量。还是我错过了什么?
  • 好的,所以你没有 $form var,使用 $request->get('experimentation')。
  • 没有$form var,我不能使用像$form-&gt;isSubmitted() 这样的东西。在用户选择一个之前,我应该如何获得选择的实验(这就是 $request-&gt;get('experimentation') 应该做的对吗?)?
  • 用户提交表单时,可以在Request对象($request)上获取提交的数据。 $form-&gt;isSubmitted() 用于 symfony 表单验证,如果您不使用 symfony 表单,则不必使用它。
【解决方案2】:

首先,您必须为您的选择标签命名,以便您可以引用它name="experimentations"。你还需要一个提交按钮,我猜你有&lt;input type="submit" value="submit"/&gt;

<form name="n1" id="n1" method="post" onsubmit="return verifSelect()" action="{{path('toto')}}" >

     <select name="experimentations">
         {% for e in experimentations %}
         <option>{{e.name}}</option>
         {% endfor %}
     </select>
     <input type="submit" value="submit"/>

</form>

要获取控制器类中的信息,请使用$request-Object。 功能

class DefaultController extends Controller {
    /**
     * 
     * Matches /todo/
     * 
     * @Route("/todo/", name="Todo")
     */
    public function indexAction(Request $request) {
         $experimentations = $request->request->get("experimentations");
         ...
    }

据我所知,在这种情况下您不能使用 form-Object,但人们可能会纠正我...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多