【问题标题】:render a complete twig template extending another one with ajax in Symfony在 Symfony 中使用 ajax 渲染一个完整的树枝模板扩展另一个模板
【发布时间】:2015-04-20 13:53:07
【问题描述】:

我的 主布局 命名为 layout.html.twig。在此布局中,我为扩展他制作了块内容,请参见代码:

<!DOCTYPE html>
  <html>
  <!-- my html code, meta header, body ... etc -->
    <body>
      <div class="col-md-12 panel panel-default" id="content">
        {% block content %}
          {# extend content to the principal layout #}
        {% endblock %}
      </div>
    </body>
  </html>

事实上,每次我想在{% block content %}加载另一个页面 内容时,我都会像这样扩展布局,例如在indexEquipement.html.twig 中:

{% extends "MyBundleBundle::layout.html.twig" %}

  {% block content %}

    <div class="page-header">
      <h4>add an equipement</h4>
    </div

    <select id="selectEquipement">
      <option selected disabled>choose an equipement</option>
      <option value="{{ path('addEquipement1') }}">Equipement 1</option>
      <option value="{{ path('addEquipement2') }}">Equipement 2</option>
    </select>

  {% endblock %}

这是索引的路由文件:

indexEquipements:
    path:     /manageEquipements
    defaults: { _controller: MySpaceMyBundle:ManageEquipements:indexEquipements }
    requirements:
    methods: GET

如您所见,在此示例中,我有一个带有 url 的 select 标记作为 values 选项。我尝试在不重新加载浏览器页面的情况下使用 ajax 呈现我选择的选项的视图。

选项值的每个 url 实际上是具有不同形式的视图。我在我的选择中选择了一个选项,ajax 在同一页面中返回与我的选择匹配的表单。

请参阅我的控制器以获取设备 1 addAction()

/**
 *
 * @Route("/manageEquipement/addEquipement1", name="addEquipement1")
 * @Method("get")
 */
public function addEquipements1Action() {

    $eq = new Equipement1;

    $form = $this->createForm(new Equipement1Type(), $eq);

    $request = $this->getRequest();

    if ($request->isMethod('POST') | ($form->isValid())) {

        $form->bind($request);

        $em->persist($eq);
        $em->flush();

        return $this->redirect($this->generateUrl('indexEquipements'));

    }  else {

        return $this->render('MySpaceMyBundle:MyFolder:addEquipement1.html.twig', array('form' => $form->createView() ));
    }
}

现在是这个动作的 route 文件:

addEquipement1:
    path:     /manageEquipement/addEquipement1
    defaults: { _controller: MySpaceMyBundle:ManageEquipements:addEquipement1 }
    requirements:
    methods: GET

addEquipement1_process:
    path:     /manageEquipement/addEquipement1/process
    defaults: { _controller: MySpaceMyBundle:ManageEquipements:addEquipement1 }
    requirements:
    methods: POST

如何在 ajax 中呈现 addEquipement1Action() 的表单?


## 编辑##

这是 addEquipement1Action() 的控制器动作:

/**
 *
 * @Route("/manageEquipement/addEquipement1", name="addEquipement1")
 * @Method("get")
 */
public function addEquipement1Action() {

    $request = $this->getRequest();

    $eq = new Equipement1;

    $form = $this->createForm(new Equipement1Type(), $eq);

    if($request->isXmlHttpRequest()){

        $template = $this->forward('MySpaceMyBundle:MyFolder:addEquipement1.html.twig', array('form' => $form->createView() ))->getContent();

        $json = json_encode($template);
        $response = new Response($json, 200);
        $response->headers->set('Content-Type', 'application/json');


        if ($request->isMethod('POST') | ($form->isValid())) {

            $form->bind($request);

            $em->persist($eq);
            $em->flush();

            return new Symfony\Component\HttpFoundation\RedirectResponse($this->generateUrl('indexEquipements'));

        }  else {

            return $response;
        }
    }
}

这是设备的索引: {% 扩展 "MyBundleBundle::layout.html.twig" %}

  {% block content %}

    <div class="page-header">
      <h4>add an equipement</h4>
    </div

    <select id="selectEquipement">
      <option selected disabled>choose an equipement</option>
      <option value="{{ path('addEquipement1') }}">Equipement 1</option>
      <option value="{{ path('addEquipement2') }}">Equipement 2</option>
    </select>

    <div id="formEquipement"></div>

    <script type="text/javascript">
      $('#selectEquipement').change(function(event) {
        $.ajax({
          type: "GET",
          url: "{{ path('addEquipement1') }}",
          dataType: "html",
          success: function(data){
          $("formEquipement").append(data);
          }
        });
      });
    </script>

  {% endblock %}

当我在我的选择标签中应用一个选项时,当我在浏览器中调试时,我可以看到 ajax 调用有效,但它返回了这个错误,涉及我想要显示的视图:

控制器必须返回一个响应(给定 null)。你忘了 在控制器的某处添加 return 语句?

这是我对addEquiment1.html.twig 的树枝视图:

<form action="{{ path('addEquipement1_process') }}" method="POST" {{ form_enctype(form) }}>
  <div class="col-md-5">
    <br>
    <div>
      {{ form_errors(form) }}
    </div>
    <br>
    <div>
      {{ form_widget(form) }}
    </div>
    <br>
    <div>
      {{ form_rest(form) }}
    </div>
    <br>
    <div>
      <input type="submit" value="Add" class="btn btn-small btn-success"/>
    </div>
  </div>
</form>

如何在不使用 Ajax 刷新浏览器的情况下在我的实际页面中正确呈现此视图?

【问题讨论】:

  • http post 动词用于创建资源,使用get 方法直到返回资源

标签: javascript php jquery ajax symfony


【解决方案1】:

如何在 ajax 中呈现 addEquipement1Action() 的表单?

  • 您可以将表单放入 div 容器中,并通过客户端中的 JS 解析出来
  • 或者你分离树枝视图。在indexEquipement.html.twig 的块中包含yourform.html.twig 的形式,并在控制器中添加一个if 语句,如果设置了参数onlyForm,则呈现yourform.html.twig,否则呈现indexEquipement.html.twig。当然,您也可以使用不同的路由和控制器操作来删除 if 语句,这可能会更易于阅读。

【讨论】:

  • 查看我的编辑,我已经更新了在同一视图中呈现表单的代码,但出现了错误The controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?。谢谢。
  • 我知道控制器必须返回响应,但我不明白如何使它......对不起
  • 检查所有 if 语句的所有路径。方法的结尾是隐含的return null,如果$request-&gt;isXmlHttpRequest() == false 怎么办?
  • 我们在这里谈论的只是一个PHP错误好吧。您不得返回 null!如果isXmlHttpRequest() == false 则在您的操作中没有返回语句 ====> 因此返回 null。不懂的先学PHP吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多