Итак что нужно для своего модуля:
В банке делаем директорию "1" (т.е полный путь - /modules/1) и там создаем 3 файла
_module_info.ini - содержит описание модуля, связи этого модуля и прочее
_module_configure.txt - содержит PHP код с формой конфигурации
_module_install.txt - содержит PHP код с инсталяцией модуля
xxxxxx1.txt - Любые другие файлы нужные вам для работы модуля
xxxxxx2.txt
xxxxxx3.txt
Расширение txt у них для того чтобы можно было получить доступ к их содержанию просто через HTTP (http://mybank.com/modules/1/xxxxxx1.txt)
_module_info.ini
[module_info]
name = My first module
title = myfirstmodule
type = 1
author = Me
updated = 01.01.2008
descr = Just small description
debug = 0
[module_linked_to]
links =
[module_depends_of]
depends =
name = My first module
title = myfirstmodule
type = 1
author = Me
updated = 01.01.2008
descr = Just small description
debug = 0
[module_linked_to]
links =
[module_depends_of]
depends =
name - название модуля. Чисто информативное поле, нигде особо не используется.
title (строка [a-z0-9_]) - это название пойдет в базу данных и директория под модуль будет создана с этим именем. Т.е не нужно тут использовать спец символы, пробелы, кириллицу и так далее
type ([1-5]) - номер типа модуля . Про типы модулей читать тут
author - Кто создал модуль. Тоже чисто информативно.
updated - дата последнего редактирования модуля. Тоже информативное поле.
descr - Краткое описание модуля. Пойдет в базу данных модулей
debug - Это для output модулей , показывает предусмотрен ли debug_mode для данного модуля. Про debug mode можно почитать тут.
Немного подробнее об этом:
[module_linked_to]
links = 1,2,3
Скажем у вас есть инсталлируемый input модуль для фотогалереи. Там вы создаете обьекты галереи и вводите маленькую картинку, большую и описание.
Все замечательно. И есть у вас 2 или 3 инсталлируемых output модуля для галереи которые выводят содержание этого input модуля. И каждый совершенно по разному. (т.е скажем у вас есть 3 разных сайта где input модули совершенно одинаковы а вот output - разные)
Так вот - [module_linked_to] нужен для того чтобы показать связь между модулями чтобы при инсталяции одного модуля мы сразу видели какой модуль можно инсталировать в связке.
Выглядит это так:

[module_depends_of]
Аналогично [module_linked_to] но с одним большим отличием - те модули которые перечислены в [module_depends_of] - будут проинсталированы автоматически.
Например есть некий класс без которого модуль просто не будет работать - заносим его в depends и хоппа - инсталлим модуль - автоматом инсталлится и класс.
_module_configure.txt
В этом файле содержится форма конфигурации модуля.Этот файл является обычным шаблоном wbg_parse_template класса.
Подробнее об этом классе
Самый простой файл:
<?php $TEMPLATE =
'<?php
$this->make_container("This module dont need configuration" , "");
?>';
'<?php
$this->make_container("This module dont need configuration" , "");
?>';
Т.е в этом варианте вы увидите что модулю конфигурация не нужна вовсе.
(Помните что в соответствии с идеологией wbg_parse_template вы можете включать любой HTML и PHP код в шаблон - поэтому вы вольны как угодно оформлять конфигурацию)

Другой вариант:
$DATA = array('dont_create_sql'=>0, "imagedir"=>"banners");
$TEMPLATE =
'<?php
$this->make_container("<b>_mod_{same as module title}</b>" , "SQL table:");
$this->checkbox("dont_create_sql", "Don't create table");
$this->smalltext("imagedir", "Dir for images", 20);
?>';
$TEMPLATE =
'<?php
$this->make_container("<b>_mod_{same as module title}</b>" , "SQL table:");
$this->checkbox("dont_create_sql", "Don't create table");
$this->smalltext("imagedir", "Dir for images", 20);
?>';

Или более сложный вариант:
<?php
//==================================================================================================================
// <<< Generirujem formu
// ----------------------------------------------------------------------------------------------
// [[[ Defoltnije znachenija polej
$DATA = array(
'sort_by'=>'id',
'disable_manual'=>null,
'up_down'=>null,
'active_unactive'=>null);
// ]]] Defoltnije znachenija polej
// ----------------------------------------------------------------------------------------------
$HTML = '';
// Eto vozvrat iz oshibki
if (isset($_POST['ftitle'])){
foreach ($_POST['ftitle'] as $key=>$value) {
$HTML .= 'add_element("'.$value.'", "'.$_POST['field_type'][$key].'", "'.$_POST['inlist'][$key].'", "'.$_POST['search'][$key].'");';
}
}
$TEMPLATE =
'<?php
$this->smalltext("sort_by", "Field to sort by default", 20);
$this->checkbox("disable_manual", "Disable manual sorting");
$this->checkbox("up_down", "Up down buttons");
$this->checkbox("active_unactive", "Add active/unactive checbox");
$data = $this->checkbox("no_database", null);
$this->tr("Dont create SQL table", $data." Use existent (must be _mod_{module_title})");
$this->spacer();
$this->tr("Fields","<input type='button' class='button' value='Add field' onclick='add_element()'>");
$this->tr("", "<div id='container'></div>");
?>
<script>
function add_element($title, $type, $inlist, $search){
$title = $title ? $title : "";
$type = $type ? $type : "";
$container = document.getElementById("container");
$newDiv = document.createElement("DIV");
$string = 'Name ';
$string += '<input type="text" value="'+$title+'" name="ftitle[]" class="default">';
$string += ' type <select name="field_type[]" style="width:60px" class="default"><option value="0">Text</option><option value="1">Textarea</option><option value="2">Select</option><option value="3">Checkbox</option><option value="4">Date</option></select>';
$string += ' in list <select name="inlist[]" style="width:auto"><option value="0">no</option><option value="1" selected>yes</option></select>';
$string += ' in search <select name="search[]" style="width:auto"><option value="0">no</option><option value="1" selected>yes</option></select>';
$string += ' <a href="#" onclick="del(this);return false"><img src="images/delete.gif" border="0" style="vertical-align:middle"/></a>';
$newDiv.innerHTML = $string;
$container.appendChild($newDiv);
}
function del($obj){
$obj = $obj.parentNode;
$obj.parentNode.removeChild($obj);
}
'.$HTML.'
</script>';
// >>> Generirujem formu
//==================================================================================================================
?>
//==================================================================================================================
// <<< Generirujem formu
// ----------------------------------------------------------------------------------------------
// [[[ Defoltnije znachenija polej
$DATA = array(
'sort_by'=>'id',
'disable_manual'=>null,
'up_down'=>null,
'active_unactive'=>null);
// ]]] Defoltnije znachenija polej
// ----------------------------------------------------------------------------------------------
$HTML = '';
// Eto vozvrat iz oshibki
if (isset($_POST['ftitle'])){
foreach ($_POST['ftitle'] as $key=>$value) {
$HTML .= 'add_element("'.$value.'", "'.$_POST['field_type'][$key].'", "'.$_POST['inlist'][$key].'", "'.$_POST['search'][$key].'");';
}
}
$TEMPLATE =
'<?php
$this->smalltext("sort_by", "Field to sort by default", 20);
$this->checkbox("disable_manual", "Disable manual sorting");
$this->checkbox("up_down", "Up down buttons");
$this->checkbox("active_unactive", "Add active/unactive checbox");
$data = $this->checkbox("no_database", null);
$this->tr("Dont create SQL table", $data." Use existent (must be _mod_{module_title})");
$this->spacer();
$this->tr("Fields","<input type='button' class='button' value='Add field' onclick='add_element()'>");
$this->tr("", "<div id='container'></div>");
?>
<script>
function add_element($title, $type, $inlist, $search){
$title = $title ? $title : "";
$type = $type ? $type : "";
$container = document.getElementById("container");
$newDiv = document.createElement("DIV");
$string = 'Name ';
$string += '<input type="text" value="'+$title+'" name="ftitle[]" class="default">';
$string += ' type <select name="field_type[]" style="width:60px" class="default"><option value="0">Text</option><option value="1">Textarea</option><option value="2">Select</option><option value="3">Checkbox</option><option value="4">Date</option></select>';
$string += ' in list <select name="inlist[]" style="width:auto"><option value="0">no</option><option value="1" selected>yes</option></select>';
$string += ' in search <select name="search[]" style="width:auto"><option value="0">no</option><option value="1" selected>yes</option></select>';
$string += ' <a href="#" onclick="del(this);return false"><img src="images/delete.gif" border="0" style="vertical-align:middle"/></a>';
$newDiv.innerHTML = $string;
$container.appendChild($newDiv);
}
function del($obj){
$obj = $obj.parentNode;
$obj.parentNode.removeChild($obj);
}
'.$HTML.'
</script>';
// >>> Generirujem formu
//==================================================================================================================
?>

_module_install.txt
А вот это уже файл которыйа) инсталлирует модуль. Т.е - переносит нужные файлы из репозитория и кладет их куда нужно. Создает нужные SQL таблицы и записи и регистрирует модуль в системе web-gooroo.
b) Записывает цепочку своих действий для Rollback механизма. В чем смысл ? Допустим ваш модуль скопировал 10 файлов в систему, создал 2 таблицы и хоппа - что то не дало ему инсталлироваться дальше - скажем SQL таблица с нужным названием уже существует. Инсталяция конечно может выпасть по ошибке и оставить ети 10 файлов и 2 уже созданных таблицы в системе - что на мой взгляд является загаживанием системы.
А может и почистить за собой. Например так:

c) Создает LOG файл инсталяции и UNINSTALL файл. LOG - для того чтобы видеть что инсталяция там натворила, а uninstall - чтобы этот модуль можно было аккуратно из системы удалить. Оба эти файла кладутся в директорию модуля
Итак, как может выглядеть _module_install.txt :
<?php
mkdir($_CFG['path_server']."myowndir");
file_put_contents($_CFG['path_server']."myowndir/myownfile.php", "<?php echo 'aaaa'?>");
mysql_query("INSERT INTO wbg_modules SET title='aaaa'");
?>
mkdir($_CFG['path_server']."myowndir");
file_put_contents($_CFG['path_server']."myowndir/myownfile.php", "<?php echo 'aaaa'?>");
mysql_query("INSERT INTO wbg_modules SET title='aaaa'");
?>
При инсталяции такого файла все что вы видите будет выполнено. Казалось бы - зашибись ? Но не тут то было. При такой схеме не будет создан ни Rollback механизм ни uninstall и log файлы. Можно и так конечно - но лучше использовать класс web-gooroo install.class.php.
На что похож более правильнй файл (не сравнивайте с пердыдущим - этот файл делает совершенно другое :):
<?php
$install = new install_module($_POST);
$install->download_file("banners.txt" , $_POST['title'].".php");
$install->download_file("__template.txt" , "__template.php");
$install->download_file("wbg_copy_content.txt" , "wbg_copy_content.php");
$install->download_file("wbg_delete_content.txt" , "wbg_delete_content.php");
$FILE = $_POST['title'].".php";
$install->replace_data_in_file("{SQL_TABLENAME}", $_POST['title'], $FILE);
$FILE = "__template.php";
$install->replace_data_in_file("{IMAGEDIR}", $_POST['imagedir'], $FILE);
$query = "
CREATE TABLE _mod_".$_POST['title']." (
id int(10) unsigned NOT NULL auto_increment,
category_id int(10) unsigned NOT NULL default '0',
title varchar(255) default NULL,
link varchar(255) default NULL,
target varchar(255) default NULL,
foto varchar(255) default NULL,
active tinyint(1) default NULL,
sort_id tinyint(10) default NULL,
counter int(10) unsigned NOT NULL default '0',
PRIMARY KEY (id)
)";
if (!$_POST['dont_create_sql']){
$install->add_table('_mod_'.$_POST['title'], $query);
}
?>
$install = new install_module($_POST);
$install->download_file("banners.txt" , $_POST['title'].".php");
$install->download_file("__template.txt" , "__template.php");
$install->download_file("wbg_copy_content.txt" , "wbg_copy_content.php");
$install->download_file("wbg_delete_content.txt" , "wbg_delete_content.php");
$FILE = $_POST['title'].".php";
$install->replace_data_in_file("{SQL_TABLENAME}", $_POST['title'], $FILE);
$FILE = "__template.php";
$install->replace_data_in_file("{IMAGEDIR}", $_POST['imagedir'], $FILE);
$query = "
CREATE TABLE _mod_".$_POST['title']." (
id int(10) unsigned NOT NULL auto_increment,
category_id int(10) unsigned NOT NULL default '0',
title varchar(255) default NULL,
link varchar(255) default NULL,
target varchar(255) default NULL,
foto varchar(255) default NULL,
active tinyint(1) default NULL,
sort_id tinyint(10) default NULL,
counter int(10) unsigned NOT NULL default '0',
PRIMARY KEY (id)
)";
if (!$_POST['dont_create_sql']){
$install->add_table('_mod_'.$_POST['title'], $query);
}
?>
Обратите внимание на $_POST - в этом массиве придет все из формы сделанной в _module_configure.txt.
Разберем файл по шагам.
$install = new install_module($_POST); -
создаст все нужные папки модуля и зарегестрирует его в wbg_modules
$install->download_file("banners.txt" , $_POST['title'].".php");
скачает из репозитория файл banners.txt , переименует его в title_modulja.php
$install->replace_data_in_file("{SQL_TABLENAME}", $_POST['title'], $FILE);
Заменит в файле $FILE все {SQL_TABLENAME} на $_POST['title']
if (!$_POST['dont_create_sql']){
$install->add_table('_mod_'.$_POST['title'], $query);
}
Если в конфигурации не была поставлен чекбокс "dont_create_sql" то создадим SQL таблицу _mod_title_modulja
По сути наверное самая простая инсталяция могла бы выглядеть так:
$install = new install_module($_POST);
$install->download_file("mainfile.txt" , $_POST['title'].".php");
$install->download_file("mainfile.txt" , $_POST['title'].".php");
Модули
Документы раздела