silverstripe模板与if语句一起出现问题

时间:2013-07-12 18:22:32

标签: php templates conditional silverstripe

我正在努力获得一些应该简单易用的东西。 我在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。

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

由于

4 个答案:

答案 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