0

我正在努力获得应该易于工作的东西。我在 silverstripe 模板文件中尝试了以下操作但没有成功:

<% if $objectCount > 10 %>

我在 silverstripe 上读过另一个人有同样问题但没有令人满意的答案(http://www.silverstripe.org/template-questions/show/10053)所以我想同时想出一个替代方案基本方法:

<% if $objectCountGreaterThanTen %>

所以我实现了一个隐藏条件逻辑的简单类,如下所示:

class EvaluateLogic extends DataObject {
   public function greaterThan($exp, $x) { 
      print_r('calling logic.greaterThan()');
      return $exp >  $x;
   }
   public function lessThan($exp, $x) { return $exp <  $x; }
   ...
}

然后我在模板中使用的 DataObject 类中实例化一个 EvaluateLogic 成员(名为 $logic),方法是:

<% if $logic.greaterThan($objectCount, 10) %>

但是由于某些原因, .greaterThan() 调用被忽略了。我不明白吗?为了划分问题,我在我的 DataObject 中创建了一个 getLogic() 访问器来打印一些东西,看看是否到达了代码,它是,但是没有调用大于函数中的 print_r。

任何想法如何使这项工作?

谢谢

4

4 回答 4

0

模板解析器不允许您将动态变量传递给方法调用。这是设计使然 - 它阻止将模型或控制器逻辑推入模板(该逻辑确实没有位置)

您需要将数据存储在模型或控制器上,并将其作为模型或控制器的属性进行访问。

如果您希望在处理了一定数量的迭代后更改行为或输出,您可以使用 $iteratorPos (这里有一些关于在模板循环中这样做的讨论:http ://www.silverstripe.org/general-questions /show/16838 )

于 2013-08-02T03:36:36.467 回答
0

您可以尝试对变量进行类型转换。由于 GreaterThan 和 lessThan 使用数字,您可以使用 (int) 或 (float) 进行类型转换。

class EvaluateLogic extends DataObject {
   public function greaterThan($exp, $x) { 
      print_r('calling logic.greaterThan()');
      return (float)$exp > (float)$x;
   }
   public function lessThan($exp, $x) { return (float)$exp < (float)$x; }
   ...
}

http://www.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting

于 2013-07-23T07:17:19.343 回答
0

最简单也是正确的方法是将 objectCount 从控制器返回到模板:

function templateName(){
    return array(
        "Objects"=>$objects,
        "AboveTen"=>$objects->count() > 10 ? true : false
    );
}

此外,在任何循环中还有两个变量称为 $TotalItems 和 $Pos。$TotalItems 变量将为您提供循环通过的对象的总数,而 $Pos 将为您提供总数中的当前对象,如 5/10。

如果您希望循环在 10 处停止,您也可以执行 (v3):

<% loop Object.Limit(10) %>

更多信息在这里http://doc.silverstripe.org/framework/en/reference/templates

于 2014-09-17T11:37:15.963 回答
0

事实证明,即使删除 $ 符号修复了我的方法调用,它也不允许我实现我想要的。似乎 ss 解析器还不足以解释方法变量:“objectCount”变量被解释为字符串。

于 2013-07-15T07:44:18.613 回答