有可能,是的。您只需要向将返回呈现集合的操作发出 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);