我正在努力获得一些应该简单易用的东西。 我在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()访问器,以便打印一些东西并查看代码是否已到达,但是然后调用了bigThan()函数中的print_r。
任何想法如何使这项工作?
由于
答案 0 :(得分:0)
事实证明,即使删除$ sign修复我的方法调用,它也不允许我实现我想要的。 似乎ss解析器还不足以解释方法变量:'objectCount'变量被解释为字符串。
答案 1 :(得分:0)
您可以尝试对变量进行类型转换。由于大于和小于使用数字,您可以使用(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
答案 2 :(得分:0)
模板解析器不允许您将动态变量传递给方法调用。这是设计 - 它停止模型或控制器逻辑被推入模板(那里的逻辑真的没有位置)
您需要将数据存储在模型或控制器上,并将其作为模型或控制器的属性进行访问。
如果您希望在处理一定数量的迭代后更改行为或输出,可以使用$ iteratorPos(此处有一些关于在模板循环中执行此操作的讨论:http://www.silverstripe.org/general-questions/show/16838)
答案 3 :(得分: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