Банк модулей :: Создание инсталяции модуля

Прежде чем писать свой собственный инсталлируемый модуль вам нужно создать банк модулей и зарегестрировать его в системе, а как  вариант - зарегестрировать его как публичный репозиторий. Как создать собственный банк модулей читать тут

Итак что нужно для своего модуля:
В банке делаем директорию "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 - название модуля. Чисто информативное поле, нигде особо не используется.
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" , "");
    ?>';

Т.е в этом варианте вы увидите что модулю конфигурация не нужна вовсе.
(Помните что в соответствии с идеологией 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);
    ?>';



Или более сложный вариант:
<?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
//==================================================================================================================
?>




_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'");
?>

При инсталяции такого файла все что вы видите будет выполнено. Казалось бы - зашибись ? Но не тут то было. При такой схеме не будет создан ни 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);
}
?>


Обратите внимание на $_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");



Пользователь

Пароль

Поиск по сайту



Ссылка продана за пачку денег
CMS на PHP и mySQL