Сегодня: 03:12:2024 Доброго вам вечера!

I live ExBB and CMS Limbo!  I live ExBB and CMS Limbo!
Логин :
Пароль :
Регистрация?  Забыли пароль? 
 

Страниц (116): « 1 2 3 [4] 5 6 7 8 9 ... » В конец

> Найдено сообщений: 1160
технарь Отправлено: 2 июля 2022 — 12:18 • Тема: Система "хуков" • Форум: SMF Community

Ответов: 10
Просмотров: 2306
List of Integration Hooks

So, what are the hooks and how do you use them?

This list documents each of the hooks, what it does, and what it expects as input.

Each hook can be defined and set using the names below. e.g. integrate_pre_include would be referenced in $modSettings as $modSettings['integrate_pre_include'], and managed in the settings table under that name too.

Each integration hook has been described in the following manner:

* Called from: - lists which file it's called from, and at what point the hook will be called on your behalf.

* Purpose: - what the hook is designed for and what it can allow you to do.

* Accepts: - what type of input the hook is expecting. In almost every case this will simply be the name of a function to call, though can be a static method of a class. It should be obvious that the function will need to already be loaded and thus available to SMF already - if not, you may need to ensure integrate_pre_include loads it, the main SMF files contain it, or you otherwise ensure it is loaded.

* Sends: - the list of parameters in order that the hook will be sent from SMF. May be no variables, may be many. If the hook sends variables that you may want to modify before your function ends, make sure your function states it wants the variables by reference.


For example if a hook states that it sends $value1, $value2 and you want to be able to modify those in your function myfunc(), the specification would be:

code:
function myfunc(&$value1, &$value2)


Include files

integrate_admin_include
Called from: Admin.php, just after $admin_areas has been filled and before the call to the #integrate_admin_areas hook.
Purpose: Allows for example loading files that create new admin sections (used by the hook integrate_admin_areas) or more in general loading files that are needed only in the administration section.
Accepts: A string containing a path to a file to load. Certain identifiers can be used which include:
$boarddir translates to the absolute path to your forum, such as /var/www/smf
$sourcedir points to the Sources directory which normally would reside inside SMF's home directory
$themedir points to the directory of the user's current theme
Sends: No parameters, just looks for the file and loads it if found. If the file does not exist, the function silently skips the call and no error is produced.

integrate_pre_include
Called from: Load.php, just after $modSettings has been loaded, which is very, very early on in SMF processing.
Purpose: Allows you to load a single file of PHP source of your own code. Can be used for other integration functions, as it will be loaded on every single page load.
Accepts: A string containing a path to a file to load. Certain identifiers can be used which include:
$boarddir translates to the absolute path to your forum, such as /var/www/smf
$sourcedir points to the Sources directory which normally would reside inside SMF's home directory
Sends: No parameters, just looks for the file and loads it if found. If the file does not exist, the function silently skips the call and no error is produced.
Example: To include a file called MyFile.php in Sources, the syntax would be $sourcedir/MyFile.php.

integrate_theme_include
Called from: Load.php, just after the theme has been initialized and before the call to the #integrate_load_theme hook.
Purpose: Allows loading files needed by the integrate_load_theme hook.
Accepts: A string containing a path to a file to load. Certain identifiers can be used which include:
$boarddir translates to the absolute path to your forum, such as /var/www/smf
$sourcedir points to the Sources directory which normally would reside inside SMF's home directory
$themedir points to the directory of the user's current theme
Sends: No parameters, just looks for the file and loads it if found. If the file does not exist, the function silently skips the call and no error is produced.
технарь Отправлено: 2 июля 2022 — 12:10 • Тема: Система "хуков" • Форум: SMF Community

Ответов: 10
Просмотров: 2306
Интеграция "Хуков".

A SMF integration hook is a single line of code that calls one or more functions from a list stored in $modSettings. This means that a modder can cause some new code to be run at that point, without changing the core code. It means modders need not worry that some other mod might already have altered the code they want to change. The introduction of integration hooks to SMF has the potential to radically simplify the task of creating and installing many types of mods, and creating bridges to third-party code. Integration hooks are only available in SMF version 2.0 and onwards! A mod's installation package can permanently store its list of hook functions on the database, and specify files to load. A mod can also add integration hook functions from within its code.

Using Integration Hooks
Integration Hooks might seem subtle and mysterious, because it makes the code more dynamic. Anyone reading through the code will have to know the contents of $modSettings in order to know what code is going to be executed at a hook. The concept is simple, though. Just as $modSettings has been used to store all kinds of settings, it is now being used to store the names of functions to execute when an integration hook is called. Most integration hooks appear in the code as a call to call_integration_hook.

code:
function call_integration_hook('name', array(&$param1, &$param2));


Where 'name' is the name of the integration hook, as given in the list below, and the array contains all the parameters to be passed to any integration hook functions that may have been added to the named hook. Because these parameters are passed with the &$ syntax, the parameters are available to be modified by the integration hook functions. In order to take advantage of this, the function definitions must also use the &$ syntax for receiving the parameters

code:
function my_integration_hook_function(&$param1, &$param2){.....}


Before calling each integration hook function, call_integration_hook will check whether that function is callable. If not, it will silently skip that function.

The same function can be added to multiple hooks, but cannot be added more than once to the same hook. It is important to choose unique function names, perhaps by using the Mod name (or an abbreviation) as a prefix, in order to decrease the likelihood that some other mod writer will someday create a function of the same name.

Only one of the integration hooks is not implemented with call_integration_hook. This is the hook 'integrate_pre_load'. This hook simply includes all the files that have been added to the hook.

One of the first mods to take advantage of integration hooks, SlammedDime's SimpleSEF mod, makes only a few edits to the core code, simply to add admin options. The rest of the work is done using integration hooks to load the main SimpleSEF file.

Mod writers would generally do this in an installation script that runs during mod install - like SimpleSEF does. To avoid overwriting any settings already there, use add_integration_function. If it's a one-off thing, use phpMyAdmin and add a new row to, or modify an existing row in the {db_prefix}settings table.

The hook 'integrate_pre_load' is designed to pre-load files containing integration hook function definitions. By adding your file to this hook at install time, you can ensure that all your integration hook functions will be loaded on every page of the forum.

Adding to hooks
add_integration_function

code:
add_integration_function ($hook_name, $hook_executes, $make_permanent);


Depending on the $hook_name used, the value of $hook_executes should be either function_name or a file_path. If $make_permanent is TRUE, the change is saved on the database and the $modSettings cache (if caching is used). If $make_permanent is FALSE, no changes are made to the database or the cache.

A modwriter working on a mod called SimplyPerfect might add something like the following to the mod's install.php file:

code:
add_integration_function('integrate_pre_include', '$sourcedir/Subs-SimplyPerfect.php',TRUE);
add_integration_function('integrate_actions','SimplyPerfect_actions',TRUE);
add_integration_function('integrate_bbc_codes','SimplyPerfect_bbc_codes',TRUE);


remove_integration_function

code:
remove_integration_function($hook_name, $function_name);


This function removes an integration hook (temporary or permanent) from $modSettings, from the database, and from the $modSettings cache.

A mod which needs to temporarily add some novel BBC codes on a special page could use:

code:
add_integration_function('integrate_bbc_codes','SimplyTemporary_bbc_codes',FALSE);
...
remove_integration_function('integrate_bbc_codes','SimplyTemporary_bbc_codes');
технарь Отправлено: 2 июля 2022 — 11:14 • Тема: Система "хуков" • Форум: SMF Community

Ответов: 10
Просмотров: 2306
Часть третья (заключительная)

Рассмотрим ещё несколько полезных хуков: integrate_display_buttons, integrate_mod_buttons, integrate_menu_buttons, integrate_buffer. Порядок их использования аналогичен уже рассмотренным в примерах выше.

Например, хуки integrate_display_buttons и integrate_mod_buttons позволяют добавить свою кнопку на страницу просмотра темы, без редактирования файла Display.template.php. Первый хук — для обычных кнопок, второй — для модераторских. Подробно их рассматривать не буду.

Для добавления/изменения кнопок в главном меню предназначается хук integrate_menu_buttons. Например, в моде Fancy Features я с помощью этого хука устанавливаю опциональное отображение кнопки "Помощь", а также добавляю в подменю Админка новый пункт — Расширенные настройки (для быстрого перехода к настройкам мода):

code:
function fancy_menu_buttons($buttons)
{
global $modSettings, $context, $txt, $scripturl;

if (!empty($modSettings['fancy_button_help'])) {
unset($buttons['help']);
if ($context['current_action'] == 'help') redirectexit('action=home');
}

if ($context['allow_admin']) {
$counter = 0;
foreach ($buttons['admin']['sub_buttons'] as $area => $dummy)
{
$counter++;
if ($area == 'packages')
break;
}

$buttons['admin']['sub_buttons'] = array_merge(
array_slice($buttons['admin']['sub_buttons'], 0, $counter, TRUE),
array('modsettings' => array(
'title' => $txt['fancy_modifications_desc'],
'href' => $scripturl . '?action=admin;area=modsettings;sa=fancy_features',
'show' => allowedTo('admin_forum'),
)),
array_slice($buttons['admin']['sub_buttons'], $counter, NULL, TRUE)
);
}
}



Хук integrate_buffer — без сомнения, один из самых интересных. К примеру, в моде Custom Copyright с помощью этого хука под копирайтом SMF можно добавить собственный:

code:
function editBuffer($buffer)
{
global $modSettings;

if(empty($modSettings['custom_copyright_message']) || $modSettings['custom_copyright_message'] == 'Edit This...' || empty($modSettings['custom_copyright_enable']))
return $buffer;

$search = ', Simple Machines LLC</a>';
$replace = ', Simple Machines LLC</a><br />' . $modSettings['custom_copyright_message'];
return (isset($_REQUEST['xml']) ? $buffer : str_replace($search, $replace, $buffer));
}
технарь Отправлено: 2 июля 2022 — 11:10 • Тема: Система "хуков" • Форум: SMF Community

Ответов: 10
Просмотров: 2306
Часть вторая (познавательная)

Примечание: один из новых хуков, введенных в RC5, оказался не на том месте и не в том «оформлении». Речь идёт о хуке, помогающем добавлять настройки модов в раздел Настройки модификаций, без изменения файла ManageSettings.php. Именно изменения в этом файле зачастую вызывают кучу проблем при установке каждого очередного мода. Разработчики уже в курсе ошибки, но исправлять её отказались, до выхода финала (как обычно). Но это исправление не сложно сделать самостоятельно.

Открываем ManageSettings.php, находим блок:

code:
function ModifyModSettings()
{
global $context, $txt, $scripturl, $modSettings, $settings;

$context['page_title'] = $txt['admin_modifications'];

$subActions = array(
'general' => 'ModifyGeneralModSettings',
// Mod authors, once again, if you have a whole section to add do it AFTER this line, and keep a comma at the end.
);

loadGeneralSettingParameters($subActions, 'general');

// Load up all the tabs...
$context[$context['admin_menu_name']]['tab_data'] = array(
'title' => $txt['admin_modifications'],
'help' => 'modsettings',
'description' => $txt['modification_settings_desc'],
'tabs' => array(
'general' => array(
),
),
);

// Make it easier for mods to add new areas.
call_integration_hook('integrate_modify_modifications', array(&$subActions, &$context[$context['admin_menu_name']]['tab_data']['tabs']));

// Call the right function for this sub-acton.
$subActions[$_REQUEST['sa']]();
}


и меняем его на:

code:
function ModifyModSettings()
{
global $context, $txt, $scripturl, $modSettings, $settings;

$context['page_title'] = $txt['admin_modifications'];

$subActions = array(
'general' => 'ModifyGeneralModSettings',
// Mod authors, once again, if you have a whole section to add do it AFTER this line, and keep a comma at the end.
);

// Make it easier for mods to add new areas.
call_integration_hook('integrate_modify_modifications', array(&$subActions));

loadGeneralSettingParameters($subActions, 'general');

// Load up all the tabs...
$context[$context['admin_menu_name']]['tab_data'] = array(
'title' => $txt['admin_modifications'],
'help' => 'modsettings',
'description' => $txt['modification_settings_desc'],
'tabs' => array(
'general' => array(
),
),
);

// Call the right function for this sub-acton.
$subActions[$_REQUEST['sa']]();
}



После этого станет возможным нормальное добавление страниц настроек модов. Например, сейчас при установке большинства модов, имеющих настройки, ищется блок:

code:
'tabs' => array(
'general' => array(
),
),


и затем заменяется на что-то вроде:

code:
'tabs' => array(
'general' => array(
),
'my_mod' => array(
),
),



Это крайне неудобно. Даже если затем мы по порядку установим ещё несколько модов, без всяких проблем, мы обязательно столкнемся с проблемами при удалении какого-нибудь мода. Но хук integrate_modify_modifications решает проблему. После изменения, предложенного мной выше, достаточно будет в install.php вашего мода прописать:

code:
$hooks = array(
'integrate_pre_include' => '$boarddir/Sources/Subs-MyMod.php',
'integrate_admin_areas' => 'my_mod_admin_areas',
'integrate_modify_modifications' => 'my_mod_modifications',
);

if (!empty($context['uninstalling']))
$call = 'remove_integration_function';
else
$call = 'add_integration_function';



При этом файл Subs-MyMod.php может выглядеть примерно так:

code:
<?php

if (!defined('SMF'))
die('Hacking attempt...');

function my_mod_admin_areas(&$admin_areas)
{
global $txt;

$admin_areas['config']['areas']['modsettings']['subsections']['my_mod_features'] = array($txt['my_mod_title']);
}

function my_mod_modifications(&$subActions)
{
$subActions['my_mod_features'] = 'my_mod_settings';
}

function my_mod_settings()
{
global $context, $txt, $scripturl;

$context['page_title'] = $context['settings_title'] = $txt['my_mod_modifications_desc'];
$context['post_url'] = $scripturl . '?action=admin;area=modsettings;save;sa=my_mod_area';
$context[$context['admin_menu_name']]['tab_data']['tabs']['my_mod_features'] = array('description' => $txt['my_mod_desc']);

$config_vars = array(
array('check', 'my_mod_any_option'),
);

// Saving?
if (isset($_GET['save']))
{
checkSession();
saveDBSettings($config_vars);
redirectexit('action=admin;area=modsettings;sa=my_mod_area');
}

prepareDBSettingContext($config_vars);
}

?>



Обратите внимание на первую функцию (my_mod_admin_areas(&$admin_areas)) в этом файле. Она (через хук integrate_admin_areas) замещает те изменения, которые раньше при установке модов приходилось делать в Admin.php.
технарь Отправлено: 2 июля 2022 — 11:02 • Тема: Система "хуков" • Форум: SMF Community

Ответов: 10
Просмотров: 2306
Содержимое данной темы скопипащено с просторов интернета. Автор этого мануала - много уважаемый мной Bugo. Сохраняю здесь исключительно для удобства поиска в качестве полезной инфы по работе с SMF...

Часть первая (ознакомительная)

Не все знают, что в последних версиях второй линейки SMF появился ряд полезных (как для авторов модов, так и для администраторов форумов) функций, основная цель которых — уменьшить количество проблем при установке/удалении модов (когда моды вносят изменения в одни и те же файлы и в одни и те же места, проблемы неизбежны).

Более полную информацию об этих новых функциях можно найти в wiki-документации. Называются они хуками. К сожалению, там описаны далеко не все реализованные хуки (но в будущем ситуация должна измениться).

Рассмотрим несколько новых хуков на примере Quick Spoiler. Этот мод добавляет кнопку в редактор, для вставки в сообщения пары тегов:

code:
[spoiler][/spoiler]



Итак, прежде всего заглянем в архив мода и обратим внимание, что там нет привычного файла install.xml (или modification.xml). Там вообще из привычных *.xml файлов остался только package-info.xml, в котором прописана процедура установки. В частности, в нем указано, что при установке (и удалении) мода нужно запустить файл hooks.php. Откроем этот файл.

Наблюдаем следующую запись

code:
$hooks = array(
'integrate_pre_include' => '$boarddir/Sources/Subs-QuickSpoiler.php',
'integrate_bbc_codes' => 'spoiler_bbc_add_code',
'integrate_bbc_buttons' => 'spoiler_bbc_add_button',
'integrate_general_mod_settings' => 'spoiler_settings'
);

if (!empty($context['uninstalling']))
$call = 'remove_integration_function';
else
$call = 'add_integration_function';

foreach ($hooks as $hook => $function)
$call($hook, $function);


Это и есть хуки. Функция add_integration_function обходит массив $hooks и добавляет указанные значения в соответствующие переменные. Например, переменной $modSettings['integrate_bbc_codes'] будет присвоено значение spoiler_bbc_add_code, а переменной $modSettings['integrate_bbc_buttons'] — spoiler_bbc_add_button. При удалении мода [if (!empty($context['uninstalling']))] эти значения из переменных удаляются.

Хук integrate_pre_include обрабатывается в Load.php и содержит в себе путь к файлу, который необходимо подключить после установки мода. Раньше, без этого хука, для подключения нужного файла приходилось прописывать строчку require_once('путь к файлу') в index.php (тем самым внося изменения в один из ключевых файлов форума) — причем делать это после каждого обновления форума. Теперь же путь будет храниться в базе данных, а подключаемый файл может содержать внутри любые ваши функции.

Продолжаем изучение package-info.xml. Как видим, при установке в директорию /Sources распаковывается файл Subs-SimpleSpoiler.php. Наши функции, которые вызываются в остальных хуках, описаны именно в этом файле: spoiler_bbc_add_code, spoiler_bbc_add_button и spoiler_settings.

Конструкция в начале файла Subs-QuickSpoiler.php

code:
if (!defined('SMF'))
die('Hacking attempt...');


обязательна, так как не даёт запустить файл напрямую, минуя SMF. Не забывайте её использовать в своих проектах.

В функции spoiler_bbc_add_code через хук integrate_bbc_codes добавляем нужные нам теги (в данном случае: [spoiler][/spoiler]):

code:
$codes[] = array(
'tag' => 'spoiler',
'before' => '<div class="sp-wrap"><div class="sp-body" title="' . $txt['quick_spoiler'] . '">',
'after' => '</div></div>',
'block_level' => true,
);
$codes[] = array(
'tag' => 'spoiler',
'type' => 'unparsed_equals',
'before' => '<div class="sp-wrap"><div class="sp-body" title="$1">',
'after' => '</div></div>',
'block_level' => true,
);



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


code:
spoiler_header();



Функция spoiler_bbc_add_button через хук integrate_bbc_buttons предоставляет возможность добавить новую кнопку, для вставки наших тегов:

code:
function spoiler_bbc_add_button($buttons)
{
global $txt;

$buttons[count($buttons) - 1][] = array(
'image' => 'spoiler',
'code' => 'spoiler',
'before' => '[spoiler]',
'after' => '[/spoiler]',
'description' => $txt['quick_spoiler'],
);
}



В конце файла видим небольшую функцию spoiler_settings, которая подключается через хук integrate_general_mod_settings:

code:
function spoiler_settings($config_vars)
{
global $txt;
loadLanguage('QuickSpoiler');
$config_vars[] = array('select', 'qs_hide_img', explode('|', &$txt['qs_hide_select']));
$config_vars[] = array('check', 'qs_fancy');
}


Это ни что иное, как добавление настроек мода в раздел Настройки модификаций. То есть при установке даже не потребуется редактировать файл ManageSettings.php, как это делалось раньше. Обратите внимание: все текстовые переменные хранятся в отдельном файле, который подключается через функцию loadLanguage.

Кстати, названия ваших функций могут быть любыми. Лишь бы они вызывались через нужные хуки.

Таким образом, при очередном обновлении форума вам даже не потребуется переустанавливать этот мод — всё будет подключаться автоматически, при наличии нужных записей в переменных $modSettings. При установке других подобных модов, использующих те же хуки, значения этих переменных не обнуляются, а дополняются, через запятую. Главное, чтоб названия пользовательских функций не совпадали. Единственное, что может потребоваться сделать — закинуть файлик spoiler.gif в директорию images каждой темы оформления, которую вы захотите добавить позже.
технарь Отправлено: 14 февраля 2021 — 11:53 • Тема: История изучения движка • Форум: SMF Community

Ответов: 0
Просмотров: 1283
Ковыряю админку, хочу привести в божеский вид. Понадобилось понять, как в админке выводятся параметры модов.
Файл, отвечающий за это безобразие - ManageSettings.php

Пока разбираюсь со структурой. В планах вычленить скелет прототипа функции для добавления настроек модов.
технарь Отправлено: 31 января 2021 — 02:57 • Тема: Что мы любим слушать • Форум: Всё подряд

Ответов: 10
Просмотров: 4356


технарь Отправлено: 5 ноября 2020 — 17:03 • Тема: Перешиваем приборную панель Рено Логан • Форум: Сделай сам

Ответов: 101
Просмотров: 92487
Ну так прошивку скачайте - я вам нарисую пробег который нужно.
технарь Отправлено: 5 мая 2020 — 11:03 • Тема: Гоcтевуха • Форум: Всё подряд

Ответов: 5
Просмотров: 1977
Ок. Я в принципе как то так и думал.
технарь Отправлено: 12 февраля 2020 — 16:28 • Тема: Приводим оптимизированный CSS код к читаемому виду • Форум: Записная книжка PHP

Ответов: 0
Просмотров: 2212
Столкнулся с проблемой редактирования таблицы стилей, которая перед этим была подвергнута оптимизации. Код в одну строку без пробелов и переносов... Пробовал расставлять переносы сам, но понял, что быстро чокнусь. Погуглил. Оказывается все просто - есть онлайн сервисы для этой задачи. Вот парочка из них.
https://www.cleancss.com/css-beautify/
http://www.lonniebest.com/FormatCSS/

Страниц (116): « 1 2 3 [4] 5 6 7 8 9 ... » В конец

Powered by ExBB v1.1.180311