【问题标题】:twig: pass variables from view to controllertwig:将变量从视图传递到控制器
【发布时间】:2013-06-26 14:41:17
【问题描述】:

设置:

  • 树枝 1.13.1
  • PHP 5.4.3

问题:

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

我知道在 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 %}

总结

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

【问题讨论】:

    标签: php templates twig


    【解决方案1】:

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

    但是,您可以将函数传递到视图中。您可能想要创建某种 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 参数。

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

    【讨论】:

      【解决方案2】:

      您想使用切片过滤器,我认为这应该适合您

      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,尽管这只是快速浏览其文档

      【讨论】:

      • 我可以,但我仍然必须加载所有 10k 文章,然后切掉前 5 篇文章。我需要一种方法在调用 db 之前将计数传递给控制器​​..
      • 我对 twig 的了解还不够,无法进一步提供帮助,然后抱歉。就我个人而言,我只会加载 10k,它只是一小部分,但我认为我被宠坏了,因为我使用了过多的硬件,而且我在 10k 上工作的东西只是总结果集的一小部分。对于在单个服务器上运行的小型项目,这可能是一个大问题:(
      【解决方案3】:

      您可以从 twig 模板中嵌入控制器(或呈现其他 url)。这意味着您可以为您的网站创建一个 main layout 模板,并让您的 storyList.html 模板非常简单 - 只是为了迭代故事和他们可能需要的任何标记。

      在您的main layout 中,您将为新闻报道呈现动作:

      <div id="stories">
          {% render url('...') with { section: 'sports', limit: 5}, {'standalone': 'js'} %}
      </div>
      

      这种方式需要在您的页面中包含hindclude.js。检查这些docs。如果你也在使用 symfony(你提到了 MVC,但没有提到框架)——那就更好了。向上滚动一下,看看嵌入式控制器。

      否则,我相信这种方式本质上使用了ajax。

      【讨论】:

        猜你喜欢
        • 2012-02-10
        • 2023-03-19
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        相关资源
        最近更新 更多