Довольно часто заказчики просят неизведанного, поэтому приходится рехтовать движок в хвост и в гриву. Webasyst с точки зрения логичности кода непостижим и загадочен, а в интернете очень мало адекватных мануалов. Поэтому напишу здесь то, что я постиг на собственном горьком опыте проб и ошибок. В вебасисте несколько разновидностей модулей, я планирую написать о каждом из них, но буду рассказывать только о методах встраивания своих модулей в движок, а не о программировании непосредственно.
Предполагается, что php владеет каждый, кто читает эту статью.
Начнем с того, что у каждого элемента в админке есть свой did.
Например did закладки продуктов равен 9
Этому номеру соответствует xID в таблице SC_divisions.
Создание модуля админки начинается с того, что мы внедряем новую запись в таблицу 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.
Автор: xilix