Как вызвать виджет в шаблоне на основе 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 для достижения того же результата.

Другие вопросы по тегам