Переопределения в плагине для LS 2.0

Здравствуйте, не получается переопределить шаблон в плагине. С переопределением модулей и экшенов проблем нет, переопределил нормально в $aDelegates и $aInherits, а вот шаблон не хочет.

пишу так:

public $aDelegates = array(
        'template' => array(
            'blocks.tpl' => '_blocks.tpl'
        ),
    );


но загружается tbl из папки активного шаблона, а не из плагина. В плагине tpl лежит в папке:
application/plugins/my_plugin/templates/skin/default/blocks.tpl

Имя активного шаблона отлично от default, но я пробовал и так:
application/plugins/my_plugin/templates/skin/my_template/blocks.tpl


Вообще мне нужно переопределить один из файлов компонента, но с этим вообще не понятно, примеров в документации не нашел и скопировал папку компонента в активный шаблон и в плагине пытаюсь переопределить tpl.
Может быть скажете как переопределить компонент напрямую, а не так как у меня?

36 комментариев

avatar
Вы хотите переопределить шаблон другого плагина, шаблона компонента или просто шаблона?
avatar
Нужно почистить каталог /tmp/templates/
  • ort
  • +1
avatar
Шаблоны компонентов из плагина можно переопределять так:
protected $aInherits = array(
        'template' => array(
            'component.alert.alert' => '_myalert.tpl',
        ),
    );

Сначала идет ключевое слово component, потом название компонента, а за ним шаблон компонента.
Вообще использовать $aDelegates не стоит, для шаблонов уже можно использовать $aInherits, причем это позволит переопределить шаблон частично, а не полностью (при условии, что шаблон используется smarty блоки).

Компоненты можно переопределять (полностью и частично) из шаблона, об этом будет подробная документация.
  • ort
  • +1
avatar
Большое спасибо за развернутый ответ :)
avatar
Все таки я упускаю какую-то деталь, не переопределяется шаблон.
Шаблон компонента лежит тут:
application/frontend/components/auth/auth.login.tpl

мой шаблон лежит тут:
application/plugins/my_plug/templates/skin/default/components/auth/login.tpl

в aInherits пишу так:
protected $aInherits = array(
        'template' => array(
            'component.auth.auth.login' => '_components/auth/login.tpl',
        ),
    );
avatar
Смотрим сюда — github.com/livestreet/livestreet/blob/master/application/frontend/components/auth/component.json#L12 шаблон имеет имя login
Значит писать нужно так:
'component.auth.login' => '_components/auth/login.tpl',
avatar
Если пишу так:
'component.auth.login' => '_components/auth/login.tpl',

тогда:
Component template not found: auth/login.tpl
avatar
У плагинов каталог templates переименован в frontend
Пример плагина есть в админке
avatar
а понятно, просто в комментариях сгенеренного плагина через консоль в примерах написан каталог темплейтс, спасибо :)
avatar
Максим, а может быть такое, что некоторые компоненты нельзя переопределить в плагине?
Компонент «Auth» я до этого переопределил, как видно по комментариям ниже, но сейчас пытаюсь проделать тоже самое с компонентом «Poll» и не выходит.
Здесь лежит переопределяющий файл:
/application/plugins/owls/frontend/skin/default/components/poll/result.tpl
В плагине пишу так:
protected $aInherits = array(
        'template' => array(
            'component.poll.result' => '_components/poll/result.tpl',
        ),
    );

Делал все по аналогии с Auth, но не получается.
Получается переопределить только через скин, при чем копировать нужно всю папку компонента со всеми файлами, а если в папку скина скопировать только 1 файл (poll.result.tpl), то ничего не происходит.
Что я делаю не так?
avatar
Пока не все компоненты переведены на единый стиль подключение через конструкцию component, вместо include. Нужно подождать.
avatar
Значит пока только через шаблон можно переопределить?
avatar
да
avatar
Не работает в альфе.
Пробовал в
$aDelegates
переопределить тоже безрезультатно

'actions/ActionIndex/index.tpl'=>'_test.tpl',

экшены таким способом переопределяет, но не компоненты.
Подскажите плис.
avatar
Подсказки выше и ниже.
Без реального примера неработающего кода помочь будет сложно.
avatar
Максим, а скрипты компонента переопределяются так же как шаблоны? Я ниже про это спрашивал, не переопределяется скрипт таким образом:
protected $aInherits = array(
        'template' => array(
            'component.editor.markup' => '_components/editor/js/editor.markup.js',
        )
    );
avatar
не переопределяется скрипт таким образом:
и не должен, template — это шаблоны

css/js у компонентов подключаются через стандартный механизм и имеют уникальное имя в параметре name. По нему их и можно переопределить. Имя формируется так: component.editor.markup
avatar
Я правильно понял?
В методе плагина Init() добавляю скрипт с заменой оригинального
public function Init()
{
    $this->Viewer_AppendScript(Plugin::GetTemplateWebPath(__CLASS__) . "components/editor/js/editor.markup.js", array('name'=>'component.editor.markup'), true);
}
avatar
Init плагина срабатывает раньше сборки компонентов, поэтому не сработает. Нужно вешать это на хук, например, на engine_shutdown_complete
avatar
Спасибо, попробую через хук :)
avatar
Через хук тоже не получилось, опять что-то не так делаю.
Создал в папке плагина хук:
application/plugins/editor/classes/hooks/HookEditor.class.php
с таким содержанием:
class PluginEditor_HookEditor extends Hook
{
    public function RegisterHook()
    {
        $this->AddHook('engine_shutdown_complete', 'replaceJs');
    }

    public function replaceJs()
    {
        $this->Viewer_AppendScript(
            Plugin::GetTemplateWebPath(__CLASS__) . "components/editor/js/editor.markup.js",
            array('name'=>'component.editor.markup'));
    }
}
avatar
Я немного ошибся.
Первый вариант (метод Init) рабочий, как и второй вариант (хук engine_shutdown_complete). С хуком просто надо дописать третий параметр true (replace=true).

А проблема в конкретной попытке переопределить скрипт редактора, т.к. он подключается сейчас отдельно в шаблоне (по требованию) и там имеет другое имя — github.com/livestreet/livestreet-framework/blob/master/frontend/components/editor/editor.tpl#L54. Думаю позже это исправим и приведем имя к стандарту.
avatar
С третьим параметром тоже пробовал, сейчас попробовал в Init()
так:
$this->Viewer_AppendScript(
    Plugin::GetTemplateWebPath(__CLASS__) . "components/editor/js/editor.markup.js",
    array('name'=>'editor_markup_options'), true);

и так
$this->Viewer_AppendScript(
    Plugin::GetTemplateWebPath(__CLASS__) . "components/editor/js/editor.markup.js",
    array('file'=>'Component@editor.markup'), true);

не хочет…
avatar
И через хук пробовал так же подключать JS тоже безрезультатно.
avatar
точно, для скриптов редактора пока не прокатить переопределение — они там сразу вставляются в шаблон, минуя AppendScript. Надо будет подумать как сделать.
avatar
А до меня разве никто не делал плагинов, расширяющих функционал MarkitUp? :) Как эту задачу решали другие?
Просмотрел много разных плагинов, но ни в одном не нашел данной реализации.
avatar
Расширяют не заменой всего скрипта. Примеры надо искать в плагинах, добавляющие кнопки на панель.
Мы же сейчас говорим о замене всего файла скрипта и только для версии 2.0.
avatar
Да, я хочу просто добавить кнопки, наверное не по тому пути пошёл, весь файл заменять ни к чему :)
avatar
я в плагине так переопределил:
 protected $aInherits = array(
        'template' => array(
            'component.auth.login' => '_components/auth/login.tpl',
        ),

переопределяющий файл лежит тут:
application/plugins/ulogin/frontend/skin/default/components/auth/login.tpl
avatar
Помогите пожалуйста передать переменную в блок из того же плагина.

Создал класс в директории:
application/plugins/my/classes/blocks/BlockMy.class.php
class PluginMy_BlockMy extends Block
{
    public function Exec()
    {
        $this->Viewer_Assign('var',  'some_var');
    }
}

И сам блок в папке:
application/plugins/my/frontend/skin/default/blocks/block.my.tpl
пишу в нем переменную
{$var}

но в нее ничего не передается. Созданный класс блока нужно как-то инициализировать?
avatar
другие переменные (те, которые объявлены не в моем классе блока) в этот блок передаются.
avatar
как происходит подключение блока?
avatar
через конфиг плагина:
$config['$root$']['block']['my_rule'] = array(
    'action' => array('index'),
    'blocks' => array(
        'left' => array(
            'my/frontend/skin/default/blocks/block.my.tpl' => array('priority' => 300)
        ),
avatar
avatar
Ого, я подключил блок через задницу ))) Максим спасибо большое за помощь!
avatar
Максим, подскажите еще как правильно переопределить скрипт компонента. Пробовал так:
'template' => array(
            'component.editor.markup' => '_components/editor/js/editor.markup.js',
        ),

и так
'script' => array(
            'component.editor.markup' => '_components/editor/js/editor.markup.js',
        ),
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.