| NordWest |
Отправлено: 2 июля 2022 — 11:14 • Тема: Система "хуков" • Форум: SMF Community |
Ответов: 10 Просмотров: 4067
 |
Часть третья (заключительная)
Рассмотрим ещё несколько полезных хуков: 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));
} |
| NordWest |
Отправлено: 2 июля 2022 — 11:10 • Тема: Система "хуков" • Форум: SMF Community |
Ответов: 10 Просмотров: 4067
 |
Часть вторая (познавательная)
Примечание: один из новых хуков, введенных в 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. |
| NordWest |
Отправлено: 2 июля 2022 — 11:02 • Тема: Система "хуков" • Форум: SMF Community |
Ответов: 10 Просмотров: 4067
 |
Содержимое данной темы скопипащено с просторов интернета. Автор этого мануала - много уважаемый мной Bugo. Сохраняю здесь исключительно для удобства поиска в качестве полезной инфы по работе с SMF...
Часть первая (ознакомительная)
Не все знают, что в последних версиях второй линейки SMF появился ряд полезных (как для авторов модов, так и для администраторов форумов) функций, основная цель которых — уменьшить количество проблем при установке/удалении модов (когда моды вносят изменения в одни и те же файлы и в одни и те же места, проблемы неизбежны).
Более полную информацию об этих новых функциях можно найти в wiki-документации. Называются они хуками. К сожалению, там описаны далеко не все реализованные хуки (но в будущем ситуация должна измениться).
Рассмотрим несколько новых хуков на примере Quick 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,
);
Здесь же происходит вызов другой функции, в которой подключаются таблица стилей и скрипты, необходимые для работы спойлера:
Функция 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 каждой темы оформления, которую вы захотите добавить позже. |
| NordWest |
Отправлено: 14 февраля 2021 — 11:53 • Тема: История изучения движка • Форум: SMF Community |
Ответов: 0 Просмотров: 1684
 |
Ковыряю админку, хочу привести в божеский вид. Понадобилось понять, как в админке выводятся параметры модов.
Файл, отвечающий за это безобразие - ManageSettings.php
Пока разбираюсь со структурой. В планах вычленить скелет прототипа функции для добавления настроек модов. |
| NordWest |
Отправлено: 5 мая 2020 — 11:03 • Тема: Гоcтевуха • Форум: Всё подряд |
Ответов: 5 Просмотров: 2939
 |
Ок. Я в принципе как то так и думал. |
| NordWest |
Отправлено: 8 февраля 2020 — 22:02 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91108
 |
Глухо потому, что админ мягко говоря забил а форум. Смена рода деятельности сказалась. Никак не привыкну к новому месту работы.  |
| NordWest |
Отправлено: 8 февраля 2020 — 21:57 • Тема: Новости дня • Форум: Всё подряд |
Ответов: 276 Просмотров: 91108
 |
Цитата от Гость: Как на opennet, там, вроде к кукам привязано и сохраняется ник твой, можно посмотреть, что и где комментировал даже без регистрации. Удобно. Думаю действительно нужно озадачиться.  |
|