Как вызвать виджет в шаблоне на основе ID или ClassName
Я использую модуль блога с SilverStripe и пытаюсь вызвать все виджеты со страницы родителя (владельца блога) на странице ввода блога. Я создал функцию, которая запускается в файле BlogEntry.php. Эта функция получает родительскую страницу, получает связанные с ней виджеты, и теперь у меня есть доступ к информации о виджетах.
function getParentWidgets() {
$Holder = DataObject::get_by_id('Page', $this->ParentID);
if (isset($Holder->MyWidgetAreaID)) {
$WidgetArea = $Holder->MyWidgetAreaID;
}
$Widgets = DataObject::get('Widget');
$parentWidgets = new ArrayList();
foreach ($Widgets as $Widget) {
if ($Widget->ParentID == $WidgetArea) {
$parentWidgets->push($Widget);
}
}
foreach ($parentWidgets as $widget) {
error_log($widget->ID);
}
return $parentWidgets;
}
Журнал ошибок внутри возвращает следующее
[Вт июл 07 13:51:01 2015] [ошибка] [клиент 10.0.2.2] 4
[Вт июл 07 13:51:01 2015] [ошибка] [клиент 10.0.2.2] 5
[Вт июл 07 13:51:01 2015] [ошибка] [клиент 10.0.2.2] 6
[Вт июл 07 13:51:01 2015] [ошибка] [клиент 10.0.2.2] 7
У меня есть доступ к этой информации, но как мне зациклить это в шаблоне и показать виджет полностью? В настоящее время, если я в цикле и внутри цикла я ввожу произвольную строку текста, например 'foo', она будет отображаться четыре раза.
<% with $getParentWidgets %>
foo
<% end_with %>
Мне просто нужно показать весь виджет сам... есть ли способ сделать это?
Спасибо, если вам нужно что-то еще, дайте мне знать.
2 ответа
Шаблон SS, эквивалентный $this, равен $Me. Это отобразит объект в текущей области видимости, при условии, что он может быть визуализирован.
Другой вариант - сформировать ваш ArrayList с ассоциативным массивом; затем вы можете использовать ключ для получения значения из цикла.
В этом случае я бы, вероятно, рекомендовал $Me. Вы также захотите зациклить результаты, а не просто изменить контекст с помощью "с". Префикс get является необязательным, поскольку ваша функция не требует аргументов.
<% loop $ParentWidgets %>
$Me
<% end_loop %>
Если это SS3, вам следует обновить свои ORM-запросы.
$Holder = DataObject::get_by_id('Page', $this->ParentID);
Сейчас:
$Holder = Page::get()->byID($this->ParentID);
А также
$Widgets = DataObject::get('Widget');
сейчас
$Widgets = Widget::get();
Мне удалось заставить это работать.
function getParentWidgets() {
$Holder = DataObject::get_by_id('Page', $this->ParentID);
if (isset($Holder->MyWidgetAreaID)) {
$WidgetArea = $Holder->MyWidgetAreaID;
}
error_log($Holder);
$Widgets = Widget::get();
$parentWidgets = new ArrayList();
foreach ($Widgets as $Widget) {
if ($Widget->ParentID == $WidgetArea) {
$renderedWidget = $Widget->renderWith('WidgetHolder');
$parentWidgets->push($renderedWidget);
}
}
return $parentWidgets;
}
Как видите, я нашел родительскую страницу держателя блога. В случае, если я проверил, что идентификатор области виджета был установлен для этой страницы. Затем я сохранил этот идентификатор области виджета в переменной WidgetArea.
Я извлек каждый виджет в БД и создал готовый к заполнению массив массивов. Я перебрал все виджеты и проверил их parentID, если бы parentID совпадал с областью виджетов BlogHolder, я бы поместил их в массив. Это означало, что все виджеты в массиве были виджетами страницы BlogHolder.
Обратите внимание, что я сохранил отрендеренную версию каждого из виджетов, так как не мог отрисовать в цикле Затем я вернул ArrayList parentWidgets в шаблон.
Внутри шаблона я затем перебрал то, что было возвращено, чтобы я мог прочитать все виджеты.
<% loop $getParentWidgets %>
$value
<% end_loop %>
В цикле я назвал $value. Вы могли бы также вызвать $Me для достижения того же результата.