2

设置:

  • 树枝 1.13.1
  • PHP 5.4.3

问题:

我的数据库中有 10,000 篇文章。我需要一种只允许在页面上显示 X 数量的故事的方法。我知道我可以在调用模板之前限制控制器中的数量,但该数量会因使用的模板而异。我将有一个控制器来处理所有文章。我需要一种方法将模板中的数字传递给控制器​​以限制数组。我不想拉下所有 10,000 篇文章然后使用树枝“切片”过滤器/函数。

我知道在 django 中你可以使用下面的。这只会加载前 3 个故事。

{% 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 %}

概括

我想要一种将数字从模板传递到控制器的方法,这样我就可以限制从数据库返回的行数

4

3 回答 3

5

从逻辑上讲,视图不可能将某些内容传递给控制器​​,因为视图是在堆栈末尾处理的,在其他所有操作之后。

但是,您可以将函数传递到视图中。您可能想要创建某种getViewStories可以从 twig 模板访问的功能。由于您的控制器中已经有了它:

<?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每个模板中的参数。

虽然您可以使用切片过滤器,但我建议您不要使用它,因为它会导致不必要的长数据库调用。这是最优化的方法(我知道)。

于 2013-06-26T14:59:49.480 回答
0

您想使用切片过滤器,我认为这对您有用

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 %}

免责声明:尽管这只是快速浏览其文档,但我从未真正使用过 Twig

于 2013-06-26T14:55:25.363 回答
0

您可以从树枝模板中嵌入控制器(或呈现其他 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。

于 2013-06-26T14:59:43.617 回答