我正在我的模板中评估一个ArrayCollection:
{% for article in articles %}
<li
{% if article.new %}
class="new"
{% endif %}
>{{ article.name|e }}</li>
{% endfor %}
现在我想重新加载文章ArrayCollection而不重新加载整个页面,就像你在Ajax中那样。是否可以重新加载它并让twig像上面一样评估循环中的所有文章?
我想使用twig来评估内容
答案 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
请注意,上述代码段只是解释琐碎问题的简化解决方案。
使用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);