Столкнулся с такой проблемой или с ее реализацией:
Необходимо было сделать новый модуль, по типу клон Блог \ Новости, необходимых доков я не нашел, может плохо искал или их нет, и пришлось ковыряться без них.
Ковырянием было установлено, что в базе:
1) SC_module хранятся пути и названия классов модулей
2) SC_module_configs хранит описание модулей в качестве ключа id SC_module
3) За index.php?did=id отвечает SC_divisions, ключ SC_module_configs, который переходит в SC_division_interface разделяющий front и backend части по разным вызовам классов этого модуля.
В конечном итоге мне удалось его вызвать в админке, но он блокируется Division'ом.... что я упускаю из виду ?
Создание модуля админки начинается с того, что мы внедряем новую запись в таблицу SC_divisions.
INSERT INTO `SC_divisions` SET xName='pgn_mymodule', xParentID=9, xEnabled=1, xPriority=100;
Обратите внимание на то, что
xParentID=9. Это означает, что родителем данного модуля будут продукты. Т.е. этот модуль будет вкладкой во вкладке «Продукты». За позицию между вкладками отвечает параметр
xPriority.
Смотрим какой
xID присвоил нам автоинкремент, запоминаем его. Допустим в нашем случае это
209.
Далее мы идем в таблицу
SC_division_interface. Здесь, с одной стороны все понятно, а с другой не очень. И вот в этом то «не очень» кроется самое важное.
Важные для нас поля:
xDivisionID — Очевидно, что это айдишник нашего модуля. Мы договорились, что это
209.
xInterface — В этом поле хранится имя модуля, и, как ни странно, путь к модулю.
Чтобы понять, что означает циферка перед именем модулей, давайте заглянем в таблицу
SC_module_configs.
Если поглядеть на поля
ConfigKey, то можно понять, что они повторяют структуру папок внутри
/published/SC/html/scripts/modules.
Ага. А мы бы хотели вписать свой модуль в
adminscreens. Смотрим чему равен
ModuleConfigID для
adminscreens. Это
48.
Теперь для нас нет никаких загадок, и мы можем смело писать:
INSERT INTO SC_division_interface SET xDivisionID=209, xInterface=48_mymodule;
Отлично. Полдела сделано.
Теперь идем в
/published/SC/html/scripts/modules/adminscreens/_methods, и создаем там файлы:
mymodule.xml
<?xml version="1.0" encoding="UTF-8"?>
<interfaces>
<interface>
<name>My Module</name>
<key>mymodule</key>
</interface>
</interfaces>
mymodule.php
<?php
/**
* Created by JetBrains PhpStorm.
* User: xilix
* Date: 24.11.12
* Time: 23:32
*/
/**
* @package Modules
* @subpackage AdministratorScreens
*/
class MymoduleController extends ActionsController {
function mymodule(){
}
function main(){
$Register = &Register::getInstance();
/*@var $Register Register*/
$smarty = &$Register->get(VAR_SMARTY);
/*@var $smarty Smarty*/
// здесь пишите все, что вашей душеньке угодно
// можно подсмотреть как это делается в других модулях этой папки
}
}
ActionsController::exec('MymoduleController');
?>
Следует обратить внимание на те места в
mymodule.php, где есть текст
mymodule. Он должен соответствовать названию вашего модуля. Иначе ничего работать не будет.
Осталось совсем немного. А именно дать админу возможность видеть этот модуль. Этот момент почему-то опущен во всех аналогичных статьях, а догадаться до этого непросто. Обычно случается так, что модуль-то работает, а мы его не видим. Чтобы это обнаружить, мне пришлось основательно перелопатить код вебасиста. Решение такое:
Смотрим табличку
U_ACCESSRIGHTS. Добавляем строчку:
INSERT INTO U_ACCESSRIGHTS SET AR_ID='ADMIN', AR_PATH='/ROOT/SC/FUNCTIONS', AR_OBJECT_ID=SC__209, AR_VALUE=1;
Основное в этой строчке что? Правильно —
SC__209. А 209 — это номер нашего модуля.
Остается добавить перевод
pgn_mymodule
INSERT INTO `SC_local` (`id`, `lang_id`, `value`, `group`, `subgroup`) VALUES ('pgn_mymodule', 1, 'Мой модуль', 'general', 'prd'), ('pgn_mymodule', 2, 'My module', 'general', 'prd');
И все. Теперь, если мы зайдем во вкладку
«Продукты», мы увидим внутри вкладку
«Мой модуль», где будет исполняться код из
mymodule.php.