Поддержка модов без правки кода

Горбушка

Ищу её...
Регистрация
2 Май 2008
Сообщения
3.444
Реакции
2.524
Вопрос на миллион... Как в PHP коде реализовать поддержку модов без правки кода?

Условно, имеет код:

PHP:
<?php

$text = fie_get_contents('1.txt');

echo $text;

?>

Как дать пользователю возможность добавить обработчик, к примеру, без правки кода?

Увы, сам знаю только 2 варианта установки модов:
1) Правка кода, как у phpBB 3
2) Вызов до/после каждой функции пользовательских скриптов, как у WordPress

Первый вариант не подходит однозначно, второй вариант - большая нагрузка.

Как это делать правильно?
 
Вопрос на миллион... Как в PHP коде реализовать поддержку модов без правки кода?

Условно, имеет код:

PHP:
<?php

$text = fie_get_contents('1.txt');

echo $text;

?>

Как дать пользователю возможность добавить обработчик, к примеру, без правки кода?

Увы, сам знаю только 2 варианта установки модов:
1) Правка кода, как у phpBB 3
2) Вызов до/после каждой функции пользовательских скриптов, как у WordPress

Первый вариант не подходит однозначно, второй вариант - большая нагрузка.

Как это делать правильно?
Я сделал поддержку, как я называю, хуков.

То есть в важных местах наставил

$hooks->call_hook('init');
$hooks->call_hook('show_404');
$hooks->call_hook('route:/');
$hooks->call_hook('route:/admin');

И так далее

Так же сделал json файл, во котором можно подвязать к хуку файл. Если в файле нет подвязанного ничего, просто игнорим, иначе подключаем файл

Мой файл, примерно такой:
Код:
{
    "route[1]/admin/":[{"file":"hooks/admin"}],
    "route[3]:domain_other":[{"file":"hooks/other_domain","function":"other_domain"}]
}

У меня 1 сайт на множество доменов. Отдельно для любого домена можно подвязать хук, на многих стадиях типа.

Хотя всё это тоже нагрузка, но полностью окупается.
 
Ну, по сути, это тоже самое, что в WordPress, только упрощённый вариант - без возможности запускать до/после и замены функции, а так же без приоритетов.

Есть ещё идеи?

А как это делается в играх, например? SteamWorkshop же не меняет код игры, а лишь кладёт файлики в определённую папку и всё. Как реализуют в десктопах?
 
<?php

$text
= fie_get_contents('1.txt');

echo
$text;

?>
Вот вместо стандартного fie_get_contents можно написать свою функцию.
Там массив типа static — и в массиве сохранять ключ (вызываемый хук) и функция (обработчик хуков). Или ключ — и массив значений, функция/аргументы.
По сути, тоже как в ВП, только процедурный подход.

Передачу параметров в функцию можно тоже осуществить и по другому.
Вот немного с другим подходом ещё тут я видел рабочую схему Для просмотра ссылки Войди или Зарегистрируйся
Сам не пробовал правда.
 
Последнее редактирование:
Я думаю, что этот вариант подойдет.

Для просмотра ссылки Войди или Зарегистрируйся

"vQmod™" (aka Virtual Quick Mod) is an override system designed to avoid having to change core files. The concept is quite simple... Instead of making changes to the core files directly, the changes are created as xml search/replace script files. These script files are parsed during page load as each "source" core file is loaded with the "include" or "require" php functions. The source is then patched with the script file changes, and saved to a temp file. That temp file is then substituted for the original during execution. The original source file is never altered. This results in a "virtual" change to the core during execution without any actual modification to the core files.

p.s. Активно используется в Опенкарте
 
Вот немного с другим подходом ещё тут я видел рабочую схему Для просмотра ссылки Войди или Зарегистрируйся
Да, сам нашёл эту статью, но буду использовать, скорее, предыдущую реализацию того же автора, либо доработаю эту...
Смысл в том, что эта реализация позволяет изменять результат работы функции, но не позволяет обработать входные параметры до отработки самой функции.

Спасибо!

Я думаю, что этот вариант подойдет.
Да, вариант интересный, но сложный для реверс-инжиниринга... Можно вкратце как это работает?
В смысле, я понял, что заполняется XML, который подменяет код ядра... А как это реализуется технически?

P.s. вариант, как я понял, только для ООП... Мне вариант нужен под процедурный стиль...
 
Вообще без разницы ООП или процедуный стиль

HTML:
<modification>

   <id>product_video_tab_opencart_1.5.4</id>
   <version>1.4</version>
   <vqmver>1.0.8</vqmver>
   <author>Адаптировал под VQMOD - dan</author>

   <file name="admin/language/russian/russian.php">
   <operation>
  <search position="replace"><![CDATA[
     $_['tab_image']
  ]]></search>
       <add trim="true"><![CDATA[
     $_['tab_video']  = 'Видео';
     $_['tab_video_description']  = 'Каждый видеоролик должен находится в одной строке. В магазине в закладке Видео количество роликов подсчитывается по количеству строк в этом поле.';
     $_['tab_image']
  ]]></add>
  </operation>  
   </file>    
</modification>
Ищется файл admin/language/russian/russian.php в Нем $_['tab_image'] заменяется на
PHP:
     $_['tab_video']  = 'Видео';
     $_['tab_video_description']  = 'Каждый видеоролик должен находится в одной строке. В магазине в закладке Видео количество роликов подсчитывается по количеству строк в этом поле.';
     $_['tab_image']

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

Спасибо!
Второй вариант вроде как интереснее, но оба варианта требуют дописывания.
Имхо как минимум защиту от рекурсии нужно добавлять.
 
Имхо как минимум защиту от рекурсии нужно добавлять.
Если это про vqmod... Проблем ни разу не возникало. Работает, как обычный поиск/замена в блокноте. В блокноте рекурсий не бывает ))ю

Но искать проблему и отлаживать такие файлики - это жесть...
 
@dandandan, а что, если несколько модов правят 1 файл? Эта проблема решена? Т.е. изменения из всех модов будут применены к этому файлу и в папочку запишется финальный?

@Den1xxx, вообще пофигу... Если мододел сделает рекурсию - это его проблема.
Я, например, часто вызываю рекурсию для своих целей... Но в ней есть предел/счётчик, естественно. Так что даже хорошо, если такая возможность будет.
 
Назад
Сверху