Адаптация плагина к плагину. Как правильно? (Решено)

Дано:
— плагин «One», который инжектит поле по хуку {hook run='standart_hook'}
— плагин «Two», в котором используется шаблон с нестандартным хуком {hook run='modified_hook'}

Для адаптации плагина к плагину при использовании «нестандартных» хуков нашел 3 варианта:

1. В плагине One в файле \plugins\one\classes\hooks\HookOne.class.php
class PluginOne_HookOne extends Hook {
    public function RegisterHook() {
    ...
        if (class_exists('PluginTwo')) {
            $plugins = $this->Plugin_GetActivePlugins();
            if (in_array('two', $plugins)) {
                $this->AddHook('template_modified_hook', 'field_insert');
            }
        }
    }
}

2. В плагине Two в файле \plugins\two\classes\hooks\HookTwo.class.php
class PluginTwo_HookTwo extends Hook {
    public function RegisterHook() {
    ...
        if (class_exists('PluginOne')) {
            $plugins = $this->Plugin_GetActivePlugins();
            if (in_array('one', $plugins)) {
                $this->AddHook('template_modified_hook', 'field_insert', 'PluginOne_HookOne');
            }
        }
    }
}

3. В плагине Two в папке \plugins\two\classes\hooks\ создаем файл HookOne.class.php
class PluginTwo_HookOne extends Hook {
    public function RegisterHook() {
        $plugins = Engine::getInstance()->GetPlugins();
        if(isset($plugins['one'])){
            $this->AddHook('template_modified_hook', 'field_insert', 'PluginOne_HookOne');
        }
    }
}

Какой из этих вариантов наиболее верный?

Решение (by PSNet ):
Наиболее оптимальный вариант 3.

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

avatar
А цель какая?
avatar
Работают все 3 варианта. Цель — понять какой вариант наиболее верный.
Думаю, что раз плагин Two использует свои «нестандартные» хуки, то ему и подстраиваться под другие плагины. Т.е. 2-й и 3-й варианты. Но какой лучше?
Кстати я не совсем понимаю идет ли проверка на «активированность» плагина One в 3-м варианте?
avatar
нет, мне не понятно что вообще происходит, как это «адаптация плагина к плагину».
avatar
Например:
— плагин Niceurl добавляет возможность указать url вручную при добавлении стандартных типов топика (hook run='add_topic_some-topic-type_begin');
— плагин Filearchive добавляет тип топика «Файл» с аналогичным хуком (hook run='add_topic_file_begin');
Задача:
сделать возможность добавлять вручную url при добавлении типа топика «Файл»
avatar
понял, вы не хотите редактировать сам плагин Niceurl чтобы при обновлении не слетели настройки, а хотите добавить второй плагин, который подключит хук Niceurl в ещё одно место нового типа топика.

Вариант создания стороннего плагина с хуком, который включает место для Niceurl вполне адекватен.
avatar
Спасибо! А в чем разница между:
if (class_exists('PluginOne')) {
    $plugins = $this->Plugin_GetActivePlugins();
    if (in_array('one', $plugins)) {
        ...;
    }
}

и
$plugins = Engine::getInstance()->GetPlugins();
if(isset($plugins['one'])){
    ...;
}

С верхним понятно: есть ли класс плагина и активен ли он.
А как работает нижний — проверяет ли «активированность» плагина?
avatar
1. проверка
if (class_exists('PluginOne')) {

}

означает что плагин one активирован т.к. главный класс существует. Но это не очень красиво. Просто, быстро, эффективно, но «не в духе лс».

2. код:
    $plugins = $this->Plugin_GetActivePlugins();
    if (in_array('one', $plugins)) {
        ...;
    }

делает тоже самое, но читает xml файлы каждого плагина, получает всю информацию о них (автора, описание и т.п.). В духе лс, но в данной ситуации получает много лишней информации. Долго, затратно по ресурсам.

3. код:
$plugins = Engine::getInstance()->GetPlugins();
if(isset($plugins['one'])){
    ...;
}

возвращает только коды активных плагинов. В духе лс, просто, быстро и без обращения к фс (без чтения xml файлов). Данный список уже содержится в ядре и поэтому ресурсы не тратятся.

Для вашей простой проверки подойдет 1 или 3 вариант. Оба быстрые и рабочие, но последний более красив и логичен для движка.
avatar
А что лучше (быстрее) — прописать это отдельным файлом хука или в имеющийся в плагине?
avatar
быстрее если пропишите прямо внутрь хука плагина, но удобно ли?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.