设置:
- Twig 1.13.1
- PHP 5.4.3
问题:
我的数据库中有10000篇文章。我需要一种方法,只允许X数量的故事显示在页面上。我知道我可以在调用模板之前限制控制器中的号码,但根据使用的模板,该号码会有所不同。我将有一个控制器来处理所有的文章。我需要一种方法将数字从模板传递到控制器,以限制数组。我不想把所有10000篇文章都撤下来,然后使用trick"slice"filter/func。
我知道在django你可以使用下面的。这只会加载前三层。
{% get_latest_stories 3 sports as story_list %}
{% for story in story_list %}
{{ story.title }}
{% endfor %}
这是我目前的档案。
控制器
<?php
$stories = news_stories::getStories("sports",5); //getStories(section,limit);
?>
<?=$twig->render("storyList.html", array('stories' => $stories))?>
视图/模板
{% for story in story_list %}
{{ story.title }}
{% endfor %}
摘要
我想用一种方法将一个数字从模板传递到控制器,这样我就可以限制从DB 返回的行数
从逻辑上讲,视图不可能将某些东西传递给控制器,因为视图是在堆栈的末尾处理的,而不是在其他所有操作之后。
但是,可以将函数传递到视图中。您可能想要创建某种getViewStories
函数,您可以从您的小树枝模板访问该函数。既然你的控制器里已经有了这个:
<?php
$stories = news_stories::getStories("sports",5); //getStories(section,limit);
?>
<?=$twig->render("storyList.html", array('stories' => $stories))?>
你所需要做的就是稍微改变一下,比如:
<?php
$function = new Twig_SimpleFunction('getViewStories', function (section, limit) {
return news_stories::getStories(section,limit);
});
$twig->addFunction($function);
?>
<?=$twig->render("storyList.html")?>
现在,从您的模板内部,您可以调用此函数,如下所示:
{% set story_list = getViewStories('sports',5) %}
{% for story in story_list %}
{{ story.title }}
{% endfor %}
并更改每个模板中的getViewStories
参数。
虽然您可以使用切片过滤器,但我建议在您的情况下不要使用它,因为它会导致不必要的长数据库调用。这是(据我所知)最优化的方法。
如果你想使用切片过滤器,我认为这应该适用于
http://twig.sensiolabs.org/doc/filters/slice.html
{% for story in story_list|slice(1,5) %}
{{ story.title }}
{% endfor %}
应该只返回循环的元素1->5,然后中断循环。你也可以这样做
{% for story in story_list|[start:5] %}
{{ story.title }}
{% endfor %}
免责声明:我从未真正使用过trick,尽管这只是快速浏览其文档
您可以从树枝模板内部嵌入控制器(或呈现其他url)。这意味着你可以为你的网站提供一个main layout
模板,并保持你的storyList.html
模板非常简单——只是为了迭代故事和他们可能需要的任何标记。
在你的main layout
中,你会为新闻报道呈现动作:
<div id="stories">
{% render url('...') with { section: 'sports', limit: 5}, {'standalone': 'js'} %}
</div>
这种方式需要在您的页面中包含hindclude.js
。查看这些文档。如果你也在使用symfony(你提到了MVC,但没有提到框架),那就更好了。向上滚动一点,查看嵌入式控制器。
否则,我认为这种方式本质上使用了ajax。