trick:将变量从视图传递到控制器


twig: pass variables from view to controller

设置:

  • 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。