【问题标题】:Symfony rendering templates from ajax来自 ajax 的 Symfony 渲染模板
【发布时间】:2017-03-29 19:13:53
【问题描述】:

我调用了以下 ajax:

$('.checkbox').click(function () {
            $.ajax({
                type:'POST',
                url: '/loadProducts',
                data: {},
                success: function(response) {
                    $('.js-products').html(response);
                }});
            return false;
        });

现在,当我调用我的端点 loadProducts 时,我想获取产品、呈现产品模板并返回所有产品。

在我的端点我可以这样做:

/**
 * @Route("/loadProducts", name="loadProducts")
 */
public function loadProducts() {
    /* @var \AppBundle\Service\ProductService $productService */
    $productService = $this->get('app.product');

    $products = $productService->getProducts();

    $productItems = [];
    foreach ($products as $product) {
        $productItems = $this->render('home/productItem.html.twig', [
            'product' => $product
        ]);
    }

    $response = new Response();
    $response->headers->set('Content-Type', 'application/json');
    $response->setContent(json_encode($productItems));
    return $response;
}

但这只会呈现一种产品。如何返回渲染多个 product.html.twig 文件? (除了创建一个渲染所有的新模板)

【问题讨论】:

  • 你的 php 怎么样了?
  • 我指定了我的端点,基本上就是这样,但是渲染一个产品,我将如何渲染多个
  • 这样想:一个请求就是一个响应。该响应可以包含 HTML(我认为这就是您想要的)。在 HTML 中,您可以呈现多个 (product-)
    。任何有自己的形象,价格和描述。在 Symfony 中,你也可以渲染一个响应。基本上,您使用 ONE twig 模板呈现 HTML,但在该模板中,您可以使用 for 循环来呈现多个相同的内容。在该循环中,您也可以包含其他模板。
  • 就是这样,但我想知道 symfony 中是否有一种方法可以一次渲染一堆模板,然后一次渲染响应 html
  • 不是直接的。我用一个例子来回答你

标签: php ajax symfony


【解决方案1】:

你会得到这样的东西。您的操作将开始渲染 products.html.twig,其中有一个循环多次渲染 product.html.twig

products.html.twig

{% extends base_template %}

{% block body %}
<div class="container">
    <div class="row">
        {% for product in products %}
            <div class="col-md-3">
                {% include 'shop/product.html.twig' %}
            </div>
        {% endfor %}
    </div>
</div>
{% endblock %}

product.html.twig

<div class="product">
    <img src="somesource.jpg">
    <div class="description">
        <h3>{{ product.name }}</h3>
        <p>{{ product.description }}</p>
    </div>
</div>

【讨论】:

  • 这就是我目前所拥有的,但现在我想通过单击一个按钮来呈现更多产品。此按钮向端点发出 ajax 请求以获取更多产品 (loadMore),然后呈现结果。实现这一目标的最佳方法是什么?
  • 同理。这有点像分页,因为您必须跟踪渲染产品的数量。实际上只有你的查询会改变: return $this->getEntityManager() ->createQuery('...') ->setMaxResults(5) ->setFirstResult(10) ->getResult();
  • 并使用 JQuery .append 将 html 附加到产品容器中。 api.jquery.com/append
  • 是的,但是我如何渲染结果,我不能在 ajax 中渲染它,所以我需要先在端点渲染并输出结果,但是我如何一次渲染多个产品
猜你喜欢
相关资源
最近更新 更多
热门标签