【问题标题】:Random object per page request with SilverStripe使用 SilverStripe 的每个页面请求的随机对象
【发布时间】:2013-03-25 17:17:42
【问题描述】:

假设您显示每个页面请求的随机语句并使用函数返回随机对象,例如:

Statement::get()->sort("RAND()")->limit("1");

但是现在在模板中,您想在不同的地方引用它两次,但它应该是相同的语句,而不是随机不同的语句。您如何确保每个页面请求都获得相同的随机对象?

【问题讨论】:

  • 谁对此投了反对票,请发表评论您为什么这样做?问题对我来说似乎很清楚,赞成
  • 这是一个真正的问题。我真的不喜欢这种“让我们关闭它”的态度......

标签: php silverstripe


【解决方案1】:

用一个能记住对象的静态变量定义一个函数怎么样?

public function rndObj() {
   static $obj = null;
   if(!isset($obj)){
      $obj = Statement::get()->sort("RAND()")->limit("1")->first();
   }
   return $obj;
}

然后在模板中使用rndObj

【讨论】:

  • thx 但这仍然会返回一个随机对象,如果您在同一个请求中调用它两次则不一样
  • @munomono 您是否将rndObj 的定义放在页面控制器中?它对我有用(使用 SilverStripe 2.4 测试)
  • 我在 sstr3 上。如果我将函数放在控制器或模型中,这没有什么区别。该声明有一张图片和一份推荐信,但它们仍然不匹配。
  • @munomono 奇怪。但是,您可以将图片和推荐书放在同一个控件中,例如 $picture $testimonial 吗?
  • 我可以,但这很难看,因为我必须使用 js 将其放在其他位置
【解决方案2】:

一种方法是在控制器init 函数中获取随机语句并将其分配给私有变量。我们添加一个 getRandomStatement 函数来获取随机语句:

class Page_Controller extends ContentController {

    private $randomStatement;

    public function init() {
        parent::init();

        $this->randomStatement = Statement::get()->sort('RAND()')->limit(1)->first();
    }

    public function getRandomStatement() { 
        return $this->randomStatement;
    }
}

【讨论】:

  • 据我所知,这应该可行,但我个人更喜欢@Terje D. 的解决方案 -> 根据 cmets 完成了答案。
  • dohhh 投了你的 1 票,但没有注意到我从未将其标记为已解决 - thx ;)
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2013-09-19
  • 2013-12-17
  • 2012-05-24
相关资源
最近更新 更多