А я просто в начале каждого плагина написал вот так:

    const ConfigKey = 'expwall';
    const HooksArray = [
        'template_main_menu_item'       =>  'MenuMain',
        'template_profile_whois_end'    =>  'ProfileWhois'
    ];

    public function RegisterHook()
    {
        $plugin_config_key = $this::ConfigKey;
        foreach ($this::HooksArray as $hook => $callback) {
            $this->AddHook(
                $hook,
                $callback,
                __CLASS__,
                Config::Get("plugin.{$plugin_config_key}.hook_priority.{$hook}") ?? 1
            );
        }
    }


Да, это не решает проблему полностью, но я могу в локальном конфиге прописать:
$config['plugin']['page']['hook_priority']['template_main_menu_item'] = 2;
$config['plugin']['expwall']['hook_priority']['template_main_menu_item'] = -10;


Теперь плагин page отработает раньше, чем ExpWall

Правда если какой-то плагин решит повесить на один и тот же хук два обработчика — эта схема сломается, но я думаю, это нереальный случай.
Все равно глобально это не решает проблему: добавленные пункты будут в конце основного меню.
А если нужно «между», 2-м по сету, 3-м и т.п.?
Я просто добавил хуков и поправил плагины: template_main_menu_item_1, ...2 и т.д.
После ModuleViewer->Init()?
Необходимо вносить изменения в конфиг шаблона(Config::Set()) после первого вызова модуля viewer.
Идеал недостижим. Пришлось писать свой. Заодно вмешиваться в ядро. :(
Есть в движке какой-нибудь механизм, который позволяет получить список всех хуков и всех их обработчиков с приоритетами?

В идеале — консольный.
Удивительно, что разработчики большинства плагинов (всех?) не считают нужным хранить этот приоритет в конфиге плагина — это очень многое бы упростило «искаропки».
Если уж разработчик в теме — не могу не задать еще один вопрос :)

Как изменить какой-то из параметров темы, не внося изменения в /template/skin//settings/config/config.php?

Сделал после загрузки конфигов dump конфига, но настройки темы в него не подгрузились.
Спасибо.
/**
     * Добавляет обработчик на хук
     * @see ModuleHook::AddExecHook
     *
     * @param string $sName Название хука на который вешается обработчик
     * @param string $sCallBack Название метода обработчика
     * @param null|string $sClassNameHook Название класса обработчика, по умолчанию это текущий класс хука
     * @param int $iPriority Приоритет обработчика хука, чем выше число, тем больше приоритет - хук обработчик выполнится раньше остальных
     */
    protected function AddHook($sName, $sCallBack, $sClassNameHook = null, $iPriority = 1)
    {
        if (is_null($sClassNameHook)) {
            $sClassNameHook = get_class($this);
        }
        $this->Hook_AddExecHook($sName, $sCallBack, $iPriority, array('sClassName' => $sClassNameHook));
    }
Да, это работает (как ни удивительно и, несмотря на сортировку плагинов где-то в движке), но это совершенно неочевидный и непрозрачный механизм.
  • avatar dex-
  • 1
Не знаю точно, но могу предположить, что они вызываются по порядку активации плагинов.

plugins.dat
юзал поиск, только плохо :(
Спасибо я вот так сделал, работает даже с компрессией github.com/livestreet/livestreet/issues/887
Заменить
/engine/lib/external/jquery/jquery.scrollto.js
на
github.com/flesler/jquery.scrollTo/blob/1.4.14/jquery.scrollTo.js

И в коде scrollTo:

```
return /webkit/i.test(navigator.userAgent) || doc.compatMode == 'BackCompat' ?
					doc.body :
					doc.documentElement;
```
на
```
return document.scrollingElement || document.documentElement;

```
  • avatar ff00
  • -1
Сразу как проблема возникла её решили, воспользуйтесь поиском.
И как скачать данное обновление?
Только AddEventPreg это с регуляркой, а для прямых урл AddEvent
$this->AddEventPreg('change_rating', 'AjaxChangeRating');

Ниже обьявляете:
public function AjaxChangeRating(){
    $iObjId = getRequest('obj_id');
    $iRating = getRequest('rating');
    //...
}

$('#rating [type=submit]').click(function(){
    summ = parseFloat($('#summ').text());
    obj_id = $(this).attr('id').substr(3);
    ls.ajax.load( aRouter['blog'] + 'change_rating',  {
        obj_id: obj_id,
        rating: summ
    }, function(){
        // После отправки
    } );
    
 });

Как и где подключен js скрипт? Положите его в application/frontend/skin/<Ваш скин>/assets/js/init.js куда нибудь после
jQuery(document).ready(function($){


Используйте компоненты. Пример как работает application/frontend/components/favourite/js/favourite.js. Инициализация
$('.js-favourite-talk').lsFavourite({
        urls: {
            toggle: aRouter['ajax'] + 'favourite/talk/'
        }
    });
ff00, так у меня change_rating.php привязан к функции в Actionblog, которая в свою очередь связана через $this->AddEventPreg('/^[\w\_\w]{1,50}$/i','/sendstars$/i','change_rating');