Я новичок в рамках OOP в целом и Silverstripe в частности. Я уверен, что мне не хватает чего-то жизненно важного!
В настоящее время я пытаюсь создать твиттер для своей главной страницы. В моем Page_controller у меня есть:
public function getTwitterFeed() { ... }
… который получает набор твитов. Я могу форматировать эти данные так, как мне нравится, поэтому структура данных и функция должны быть неактуальными.
В учебниках Silverstripe они приводят следующий пример:
public function LatestNews($num=5) { $holder = NewsHolder::get()->First(); return ($holder) ? News::get()->filter('ParentID', $holder->ID)->sort('Created', 'DESC')->limit($num) : false; }
Затем он вызывается в шаблоне следующим образом:
<% loop LatestNews %> <% include NewsTeaser %> <% end_loop %>
Однако эта функция основана на объекте DataModel (NewsHolder) и получает данные из базы данных (что не работает моя функция твиттера).
Итак, какой тип переменной должен возвращать эта функция? Массив? Объект?
в SilverStripe 3.0 есть 2 вещи, называемые <% 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 %>
поэтому просто превратите свой массив, который вы получаете из twitter в объекты ArrayData, и поместите их все в ArrayList (каждый твит должен быть 1 объект ArrayData)