【问题标题】:silverstripe templates issue with if statementssilverstripe 模板与 if 语句有关
【发布时间】:2013-07-12 18:22:32
【问题描述】:

我正在努力获得应该易于工作的东西。 我在 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() 访问器来打印一些东西,看看是否到达了代码,它是,但随后没有调用 greaterThan() 函数中的 print_r。

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

谢谢

【问题讨论】:

  • 妈的,我有点惭愧,错误就在我的眼皮底下。 内显然不允许有 $ 符号

标签: php templates conditional silverstripe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以尝试对变量进行类型转换。由于 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

    【讨论】:

    • 实际上问题出在其他地方。在示例 (&lt;% if $logic.greaterThan($objectCount, 10) %&gt;) 中,$objectCount 被读取/解释为字符串 'objectCount' 而不是变量。除非 ss 解释器进化,否则我看不到我的问题的解决方案。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      最简单也是正确的方法是将 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-11-21
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        相关资源
        最近更新 更多