最小化SilverStripe模板对控制器的调用

时间:2016-02-04 17:36:00

标签: php silverstripe templating

在我创建的Silverstripe应用中,我NewsArticlesNewsTags(使用silverstripe-tagfield创建)。我正在使用NewsTags创建一个"相关新闻"每个NewsArticle侧边栏中的小部件。我在RelatedArticles控制器中创建了NewsArticle操作,一切正常。

然而,为了使用RelatedArticles动作,我被迫调用该函数三次。这不是一个大问题,但我希望尽量减少调用多次调用数据库的函数的次数。

以下是我的RelatedNewsModule.ss模板文件的缩减版本:

// First call to check if there are related articles
<% if $RelatedArticles %>

    // second call to get the array
    <% loop $RelatedArticles() %>
        ...
    <% end_loop %>

    // third call to check if there are more than one so we need navigation
    <% if $RelatedArticles.Count > 1 %>
            ... navigation markup
    <% end_if %>

<% end_if %>

我想调用该函数一次,并且可能使用SilverStripe模板中的属性来引用两个检查和文章数组。我不知道怎么做。

处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

正如评论中所说,SilverStripe应该只调用一次数据库并缓存接下来2次调用的RelatedArticles结果。

为了进一步缓存查询,我们可以使用Partial Caching来缓存部分模板。

<% cached 'RelatedArticles', $ID, $List('RelatedArticles').max('LastEdited'), $List('RelatedArticles').count() %>
    <% if $RelatedArticles %>

        // second call to get the array
        <% loop $RelatedArticles %>
            ...
        <% end_loop %>

        // third call to check if there are more than one so we need navigation
        <% if $RelatedArticles.Count > 1 %>
            ... navigation markup
        <% end_if %>

    <% end_if %>
<% end_cached %>