twig:将变量从视图传递给控制器

B-r*_*rad 2 php templates twig

建立:

  • Twig 1.13.1
  • PHP 5.4.3

问题:

我的数据库中有10,000篇文章.我需要一种方法只允许在页面上显示X个故事.我知道我可以在调用模板之前限制控制器中的数字,但根据使用的模板,该数字会有所不同.我将有一个控制器来处理所有文章.我需要一种方法将数字从模板传递到控制器以限制数组.我不想删除所有10,000篇文章然后使用twig"slice"filter/func.

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

{% get_latest_stories 3 sports as story_list %}
{% for story in story_list %}
    {{ story.title }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这是我目前的文件.

调节器

<?php
$stories = news_stories::getStories("sports",5); //getStories(section,limit);
?>

<?=$twig->render("storyList.html", array('stories' => $stories))?>
Run Code Online (Sandbox Code Playgroud)

查看/模板

{% for story in story_list %}
    {{ story.title }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

摘要

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

Six*_*dio 5

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

但是,您可以将一个函数传递给视图.您可能希望创建一些getViewStories可以从twig模板访问的功能.由于您已在控制器中使用此功能:

<?php
$stories = news_stories::getStories("sports",5); //getStories(section,limit);
?>

<?=$twig->render("storyList.html", array('stories' => $stories))?>
Run Code Online (Sandbox Code Playgroud)

您需要做的就是改变一下,如下所示:

<?php
$function = new Twig_SimpleFunction('getViewStories', function (section, limit) {
    return news_stories::getStories(section,limit);
});
$twig->addFunction($function);
?>

<?=$twig->render("storyList.html")?>
Run Code Online (Sandbox Code Playgroud)

现在,从模板内部,您可以调用此函数,如下所示:

{% set story_list = getViewStories('sports',5) %}

{% for story in story_list %}
    {{ story.title }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

并更改getViewStories每个模板中的参数.

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