【问题标题】:Why does my offset not increase when I call my increment offset method in Silverstripe?为什么当我在 Silverstripe 中调用增量偏移方法时,我的偏移量没有增加?
【发布时间】:2014-03-16 16:09:48
【问题描述】:

我正在 Silverstripe 项目中的模板文件中调用我的 IncrementOffset() 方法。预期的结果是,每次调用该方法时,私有的 offset 属性都会增加 1。offset 方法如下所示:

class NewPage extends Page {
    public function IncrementOffset() { $this->offset++; }
    public function ResetOffset() { $this->offset = 0; }
    public function Offset() { return $this->offset; }
}

在我的 NewPage.ss 模板中,我有以下代码:

<% loop $InfoPanels %>
    <% if not $Description %>
        <div class="span3">
            <h4 align="center">$Title</h4>
            <a href="{$ButtonURL}" target="blank"><div style="background: url('{$Image.SetSize(225, 225).URL}') no-repeat center center; width: 225px; height: 225px;" class="center3"></div></a>
            <a href="{$ButtonURL}" target="blank" class="btn btn-block">$ButtonLabel</a>
            </div>
        <% if $MultipleOf(3, $Top.Offset()) %>
            </div>
            <div class="row-fluid">
        <% end_if %>
    <% else %>
        $Top.IncrementOffset()
    <% end_if %>
<% end_loop %>
<p>Offset is: $Offset</p>

调用IncrementOffset()后的偏移打印结果输出为:

偏移量为:0

如果我在这里遗漏了一些明显的东西,谁能告诉我?我只是不明白为什么这不起作用。对我来说,这似乎应该是一件很简单的事情。

【问题讨论】:

  • 我从来没有用过silverstripe,但你不应该从$Top.Offset()而不是$Offset获得价值吗?
  • $Top 不像其他变量那样是一个变量,它是一个作用域,总是指最外层的作用域。所以这实际上是正确的。

标签: php silverstripe


【解决方案1】:

因为模板变量在首次访问时被缓存。

SilverStripe 文档中的模板“副作用”部分解释了您的问题

以下是一些您可能会觉得有用的变量:

  • $Pos 循环内的当前位置。将是 1,2,3,4,5,...
  • $Pos(2) pos 有起点,如果我没记错的话是 2,3,4,5,6,...
  • $MultipleOf(3) 应该可以在不传递第二个参数的情况下工作
  • $InfoPanels.Count项目数

在 cmets 对话后编辑:

如果你想过滤掉一些项目,你应该在循环它们之前这样做:

在 php 中:

public function FilteredInfoPanels() {
    $dataList = $this->InfoPanels();
    // only get items of which the Description is not ''
    $dataList = $dataList->filter('Description:not', ''); 
    return $dataList;
}

在模板中:

<% loop $InfoPanels %>
        <div class="span3">
            <h4 align="center">$Title</h4>
            <a href="{$ButtonURL}" target="blank"><div style="background: url('{$Image.SetSize(225, 225).URL}') no-repeat center center; width: 225px; height: 225px;" class="center3"></div></a>
            <a href="{$ButtonURL}" target="blank" class="btn btn-block">$ButtonLabel</a>
            </div>
        <% if $MultipleOf(3) %>
            </div>
            <div class="row-fluid">
        <% end_if %>
<% end_loop %>
<p>Number of filtered Panels is: $FilteredInfoPanels.Count</p>
<p>Number of Panels is: $InfoPanels.Count</p>

【讨论】:

  • 我感觉它正在缓存变量。有没有办法让 Silverstripe 每次都获取一个新的变量?每次模板命中&lt;% else %&gt; 块时,我都需要某种方法来捕获偏移量。
  • 我不知道。但我相信还有另一种方法可以做你想做的事情。你到底想用偏移量来完成什么?
  • 我只想显示具有$Description 的项目,这是主 If 块的用途。每 4 个项目,我想打破当前行并开始一个新行(参见嵌套的 If)。我不能使用 $MultipleOf() 因为这不使用已经输出的项目的实际数量。我想我应该在列表进入模板之前对其进行操作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多