如何将自定义数据传递给模板

Mr_*_*imp 5 php silverstripe

我是OOP框架的新手,特别是Silverstripe.我确定我错过了一些至关重要的东西!

我目前正在尝试为我的主页创建一个Twitter提要.在我的Page_controller中我有:

public function getTwitterFeed() { ... }
Run Code Online (Sandbox Code Playgroud)

...获取一组推文.我可以按照我喜欢的方式格式化这些数据,因此数据的结构和功能应该是无关紧要的.

在Silverstripe教程中,他们给出了以下示例:

public function LatestNews($num=5) {
    $holder = NewsHolder::get()->First();
    return ($holder) ? News::get()->filter('ParentID', $holder->ID)->sort('Created', 'DESC')->limit($num) : false;
}
Run Code Online (Sandbox Code Playgroud)

然后在模板中调用它,如下所示:

<% loop LatestNews %>
    <% include NewsTeaser %>
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)

但是,此函数基于DataModel对象(NewsHolder),并从数据库中获取数据(我的twitter函数不是).

那么这个函数应该返回什么类型的变量?数组?一个东西?

Zau*_*sch 16

在SilverStripe 3.0中,有两件事叫做<% loop %><% with %>

  • <% loop %> 期待任何实现SS_List的东西(例如:DataList,ArrayList)
  • <% with %> 接受我认为扩展ViewAbleData的任何类型的对象(例如:DataObject,ArrayData,...)

(在SilverStripe 2.x <% control %>中,这两件事都做了)

所以,你想做什么<% loop TwitterFeed %>?然后你需要返回一个ArrayList

一个简短的例子(未经过测试,但应该有效):

    public function getTwitterFeed() {
            return new ArrayList(array(
                    new ArrayData(array(
                            'Name' => 'Zauberfisch',
                            'Message' => 'blubb',
                    )),
                    new ArrayData(array(
                            'Name' => 'Foo',
                            'Message' => 'ohai',
                    )),
                    new ArrayData(array(
                            'Name' => 'Bar',
                            'Message' => 'yay',
                    ))
            ));
    }


    <% loop TwitterFeed %>
            $Name wrote: $Message<br />
    <% end_loop %>
Run Code Online (Sandbox Code Playgroud)

所以,只需将你从twitter获得的数组转换为ArrayData对象并将它们全部放入ArrayList(每条推文应为1个ArrayData对象)