Как изменить частичный рендеринг в компоненте OctoberCMS?

По умолчанию компоненты плагина OctoberCMS визуализируют частичный файл default.htm. Можно ли переопределить, какой партиал будет отображаться? Например ...

Файловая структура плагина

├── components
│   ├── example
│   │   ├── default.htm
│   │   ├── other_partial.htm
│   ├── Example.php
├── ...
├── Plugin.php

Example.php

class Example extends ComponentBase  {

   public function onRun() {
       // change the rendered partial, such that other_partial.htm
       // will be rendered instead of default.htm
       $this->setRenderedPartial('other_partial')
   }

}

Я знаю, что можно визуализировать other_partial изнутри default.htm, но в моем случае я стараюсь оставить default.htm нетронутым и вместо этого визуализировать другой фрагмент по умолчанию.


person frthjf    schedule 18.05.2017    source источник


Ответы (6)


В октябре я бы сделал это в шаблоне страницы с некоторой логикой в ​​Twig. На мой взгляд, это было бы наиболее логичным местом для этого.

person Chris V    schedule 18.05.2017
comment
Вы можете привести пример использования шаблона страницы? - person frthjf; 20.05.2017

Вы можете использовать метод renderPartial

public function onRun()
{
    $content = $this->renderPartial('default.htm');
}

документ: http://octobercms.com/docs/plugin/components#render-partial-method

person Nelson Otazo    schedule 19.05.2017
comment
Спасибо, все идет в правильном направлении. Тем не менее, разметка по умолчанию все равно будет отображаться, но я мог бы включить в партиал с некоторой логикой, как предложил Крис В. - person frthjf; 20.05.2017

Я пытался решить эту проблему для своего сайта и думаю, что нашел ответ. В PHP-файле вашего компонента вы можете попробовать эту функцию:

public function onRender(){
    $partialType= $this->property('partialType');
    switch ($partialType) {
        case 'one':
            $partial = '@partial-1.htm';
            break;
        
        case 'two':
            $partial = '@partial-2.htm';
            break;

        case 'three':
            $partial = '@partial-3.htm';
            break;
              
        case 'four':
            $partial = '@partial-4.htm';
            break;
              
        default:
            $partial = '@default.htm';
            break;
    }

   return $this->renderPartial($partial);
}
person Slevin Kelevra    schedule 01.07.2020

Вы должны указать компоненту визуализировать частичный onRender(), который запускается после визуализации макета и страницы:

public function onRender()
{
    return $this->renderPartial('@other_partial');
}

Используйте @, чтобы заставить компонент искать партиал компонента вместо тематического!

person Fernando Barrocal    schedule 31.08.2018

Логика в шаблоне страницы может выглядеть, как приведенный ниже код, чтобы решить, какая часть должна отображаться.

Что-то вроде (синтаксис нужно проверить, потому что в последнее время я им не пользовался:

{% if other %} #if variable 'other' exists in the page
    {% partial "other" %}
{% else %}
    {% partial "default" %}
{% endif %}

Конечно, у вас должна быть какая-то логика на вашей странице, которая либо решает, что переменная «другое» должна существовать, либо нет. Или вы можете выполнить логическую проверку для определенного значения управляющей переменной

person Chris V    schedule 20.05.2017
comment
Спасибо, это сработает. У него есть обратная сторона: вы не можете разветвить разметку компонентов по умолчанию в редакторе страниц (ну, вы можете, но это даст вам это только при наличии логики). В любом случае, это работает! - person frthjf; 22.05.2017
comment
Не могли бы вы подробнее объяснить, что вы имеете в виду? - person Chris V; 22.05.2017
comment
В октябре вы можете настроить разметку по умолчанию в редакторе страницы, нажав на маленьком символе вилки, который загрузит разметку по умолчанию. В этом случае разметка снова содержит только логику if-else, а не фактический частичный код, который вы хотите настроить. Вы все еще можете скопировать его вручную, так что он работает, но мой первоначальный вопрос был о том, чтобы действительно изменить его - но я считаю, что в октябре это невозможно, логика в частичном на самом деле является подходящим вариантом. - person frthjf; 23.05.2017
comment
Фактически, у вас может быть логика в самом частичном (кроме частичного компонента, если я правильно помню). Вы также можете использовать веточку внутри частичного - person Chris V; 23.05.2017

Я все еще ищу решение, для которого не требуется веточка. Я добавил в свой компонент параметр, в котором перечислены все файлы в папке шаблона.

Теперь я могу выбрать желаемый файл шаблона, я хочу этого, когда я просто вызываю компонент вот так:

{% component 'mycomponent' %}

он отображает компонент с использованием правильного партиала, определенного в настройках компонента.

Вероятно, в функции onRun () моего компонента есть какой-то код для pu, но я не могу найти правильный.

Использование $ content = $ this-> renderPartial ('grid.htm'); по-прежнему рендерит частичный default.htm ...

person Alexandre Zeiller    schedule 03.10.2017