Symfony2 - 更改页面内容 - 与Ajax一样

时间:2013-08-21 08:25:10

标签: javascript ajax symfony twig

我正在我的模板中评估一个ArrayCollection:

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

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

我想使用twig来评估内容

1 个答案:

答案 0 :(得分: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

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

EDIT2

使用api操作使用FOSJsRouting,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);