1

我正在评估我的模板中的 ArrayCollection,如下所示:

{% for article in articles %}
   <li
      {% if article.new %}
         class="new"
      {% endif %}
   >{{ article.name|e }}</li>
{% endfor %}

现在我想重新加载文章 ArrayCollection 而不重新加载整个页面,就像您在 Ajax 中所做的那样。是否可以重新加载它并让 twig 像上面那样循环评估所有文章?

我想用twig来评估内容

4

1 回答 1

2

有可能,是的。您只需要向将返回呈现集合的操作发出 ajax 请求。这可以通过创建新操作(推荐)或在请求中添加新参数来实现,这些参数将告诉 twig 哪个部分要渲染或不渲染(更容易做,更难维护)。

编辑

因为作者要求我扩展我的答案。

让我们假设News控制器的YourNs\YourBundle 内容应该看起来像这样:

class NewsController extends Controller
{

    /**
     * @Route("/articles")
     * @Template()
     */
     public function listAction(){
         $articles = $this->yourMethodToFindArticles();
         return compact('articles');
     }
}

接下来要做的是通过添加YourNs/YourBundle/Resources/views/News/list.html.twig文件并填充它来呈现这个动作。

完成后,您需要添加功能来启动 ajax 请求以获取刷新的文章集合。FOSJsRouting也可能对此有用。

您可以向控制器添加新操作

    /**
     * @Route("/_api/articles-list")
     * @Template()
     */
     public function apiListAction(){
         $articles = $this->yourMethodToFindArticles();
         return compact('articles');
     }

并使其模板仅呈现您的收藏。

或根据以下参数化您的第一个操作并渲染模板:

{% if app.request.query.get('partial') %}
Template elements
{% endif %}
{% for article in articles %}
<li
  {% if article.new %}
     class="new"
  {% endif %}
>{{ article.name|e }}</li>
{% endfor %}
{% if app.request.query.get('partial') %}
Other template elements
{% endif %}

第二种解决方案显然不如第一种,尤其是当您开始使用 esi 标签时,如果您这样做,您的代码将如下所示:

class NewsController extends Controller
{

    /**
     * @Route("/articles")
     * @Template()
     */
     public function listAction(){
         return [];
     }

    /**
     * @Route("/_api/articles-list")
     * @Template()
     */
     public function apiListAction(){
         $articles = $this->yourMethodToFindArticles();
         return compact('articles');
     }
}

和 listAction() 模板:

Template elements
{{ render_esi(url('yourns_yourbundle_news_apilist' }}
Other template elements

请注意,上面的代码片段只是解释琐碎问题的简化解决方案。

编辑2

使用 FOSJsRouting 获取的示例,带有 api 操作的 js 代码:

var url = Routing.generate('yourns_yourbundle_news_apilist')
var fetchedCollection = $.get(url);

参数化模板的示例:

var url = Routing.generate('yourns_yourbundle_news_list', {'partial': 'true'})
var fetchedCollection = $.get(url);
于 2013-08-21T08:37:53.623 回答