Модули [в разработке]
  • ZaiSL Апрель 2011
    Модули по своей сути схожи с виджетами. Т.е модуль - это обособленный информационный блок, который выводится на определенных страницах в заданной позиции.

    Модуль может содержать в себе любую информацию - от простого текста до php-кода.

    Зачастую модули взаимодействуют с БД и конкретными компонентами (тогда говорят, что данный модуль "для компонента такого-то").

    Примеры использования модулей:
    - вывод последних новостей на главной странице сайта
    - вывод формы логина
    - вывод опроса в произвольном месте сайта и т.п.

    ====================


    Модули фронтенда находятся в папке /modules
    Модули админпанели - в папке /admin/modules

    Файловая структура модуля
    -----------------------------
    Рассмотрим на примере сферического фронтенд-модуля под названием "Test".
    modules
    test
    test.php
    test.helper.php
    test.params.php
    view
    default.php

    * test.php - основной исполняемый файл модуля. В этом файле происходит разная магия (запросы к БД, вычисления и т.п.), а также именно здесь подключается шаблон представления.
    * test.helper.php - вспомогательный класс, в котором могут находиться функции-помощники, требующиеся для работы модуля. Этот файл не является обязательным - всё зависит от сложности кода и от предпочтений разработчика
    * test.params.php - файл содержит массивы с данными и настройками модуля. Информация из этого файла используется при установке модуля, а также при работе с настройками модуля в админпанели
    * директория views - в этой папке находятся шаблоны (представления) модуля
    * views/default.php - стандартный шаблон вывода модуля


    Подробное описание файлов модуля
    --------------------------------

    ****** test.php
    ****************************************************
    //Запрет прямого доступа
    defined('_JOOS_CORE') or die();

    //Подключение вспомогательной библиотеки
    require_once joosCore::path('test', 'module_helper');

    [.....содержимое_модуля.........]

    //Подключение шаблона модуля
    require $module->template_path;
    ****************************************************

    В основном исполняемом файле модуля доступны следующие переменные:
    $module
    Экземпляр класса joosModule

    $params
    Параметры модуля - ассоциативный массив, полученный декодированием JSON, сохраненным в поле 'params'

    $object_data
    Массив с данными, который был возвращен текущим методом текущего контроллера компонента.
    С помощью этих данных можно успешно избегать дополнительных запросов к БД
    Например: на странице пользователя можно вывести блок информации о пользователе,
    не сделав при этом ни одного запроса к БД - все данные уже будут доступны в $object_data


    test.params.php
    ***********************************************
    //Запрет прямого доступа
    defined('_JOOS_CORE') or die();

    //Установочная информация (обязательный блок)
    //каждый ключ данного массива соответствует полю в таблице `#__modules` БД
    $extension_install = array(
    'type'=>'module',
    'module'=>'test',
    'client_id'=>'0',
    'position'=>'left',
    'title'=>'Тестовый модуль',
    );

    //Регистрация прав
    //Правила прописываются в таблице `#__access`:
    //#__access.section = 'Module'
    //#__access.action = ключ_массива (например: 'view', 'smth_action')

    $extension_access = array(
    'view'=>array(
    'title'=>'Отображать', //#__access.action_label
    'groups'=>array(8,9) //#__access.access (JSON)
    ),
    'smth_action'=>array(
    'title'=>'Какое-то действие',
    'groups'=>array(9)
    )
    );


    //Общая информация о расширении
    //Автор, версия, лицензия и т.п.
    //Блок необязательный, но желательный.
    //Выводится на странице редактирования настроек модуля в админпанеле (пока не выводится! но будет)
    $extension_info = array(
    'author'=>'Joostina Team',
    'creationDate'=>'2010',
    'copyright'=>'(C) 2008-2010 Joostina team.',
    'license'=>'http://www.gnu.org/licenses/gpl-2.0.htm GNU/GPL',
    'authorEmail'=>'joostinacms@gmail.com',
    'authorUrl'=>'www.joostina.ru',
    'version'=>'1.0',
    'description'=>'Модуль для демонстрации всяческих возможностей'
    );


    //Дополнительные параметры модуля (помимо генерируемых системой)
    //Описание полей производится в формате joiAdmin
    //Сгенерированные по данным правилам поля выводятся на странице редактирования модуля в админпанеле
    //Данные, переданные посредством этих полей помещабтся в #__modules.params (в формате JSON)
    $extension_params = array(
    'param1' => array(
    'name' => 'Параметр #1',
    'editable' => true,
    'html_edit_element' => 'edit',
    'html_edit_element_param' => array()
    ),
    'param2' => array(
    'name' => 'Параметр #2',
    'editable' => true,
    'html_edit_element' => 'edit',
    'html_edit_element_param' => array()
    )
    );




    ***********************************************


    ******test.helper.php
    ***********************************************
    //Запрет прямого доступа
    defined('_JOOS_CORE') or die();


    class testHelper {

    public static function smth_func(){
    //..........
    }

    }

    ***********************************************
    Именование вспомогательного класса производится по следующему правилу:
    модульHelper



    ******views/default.php
    **********************************************
    //Запрет прямого доступа
    defined('_JOOS_CORE') or die();?>

    Тееееееест!

    **********************************************
    Так как шаблоны модулей подключаются напрямую из исполняемого файла - в них доступны ввсе переменные, которые доступны в самом исполняемом файле. Этого знания достаточно, чтобы творить в шаблонах всякие чудеса.




    Как это работает (фронтенд)
    --------------------------------
    ****Подготовка модулей
    index.php

    //Подключается класс модулей
    require_once (JPATH_BASE . DS . 'includes' . DS . 'frontend.php');

    //Запускается выполнение запрашиваемого метода контроллера
    joosСontroller::run();
    -> joosСontroller::views($results, self::$controller, self::$task);
    ->
    //Готовим модули к выдаче: выбираем модули, которые нужны для текущей страницы
    joosСontroller::prepare_modules_for_current_page($params, $option, $task);
    ->
    //Из БД выбираются все модули для текущей страницы (одним запросом)
    //Рассортировываются по массивам для удобного обращения впоследствии
    joosModule::modules_by_page($option, $task, $params);


    ****Вывод модулей
    Модули вызываются из index.php шаблона сайта или любого другого подходящего места (например, можно вызывать модуль из шаблона компонента, если есть такая необходимость).
    Вызов модулей осуществляется с помощью обращения к следующим методам:

    //Вывод всех модулей, связанных с позицией 'position'
    joosModule::load_by_position('position');

    //Вывод модуля с ID=1
    joosModule::load_by_id(1);

    //Вывод модуля с именем 'test'
    //С помощью этого метода можно вызывать только устанавливаемые модули (т.е. те, которые организованы в виде файлов),
    //пользовательские (созданные в админке) модули не имеют имён (только заголовки), поэтому к ним нельзя обратиться
    //с помощью данной ф-ции (для их вывода можно использовать обращение по ID - см. выше)
    joosModule::load_by_name('test');

    Напоминиаем, все модули, предназначенные для вывода на текущей странице загружаются одним запросом и один раз. Все необходимые данные можно получить из класса joosModule, не производя дополнительных запросов к БД. Так-то.
  • GoDrGoDr Июнь 2011
    хочу уточнить пару вопросов.
    1. Как подключать Ajax?
    2. Как подключать CSS и где ссылка будет размещаться, в или в ?
    3. Аналогичный вопрос по JS?
    4. Под какими именами будут шаблоны модуля? Ну получится ли путаница с другими модулями? Не проще сделать для каждого модуля свою папку с именем

    ps
    может ответы уже есть на мои вопросы, но я не нашёл :)
  • bostonboston Июнь 2011
    4. Каждый модуль уже располагается в своём отдельном каталоге:
    >https://github.com/joostina/joostina/tree/master/app/modules

    Про остальное пока рано
    Отредактированно boston в 2011-06-10 02:37:13

Добро пожаловать!

Похоже, что Вы здесь впервые. Если хотите поучаствовать, нажмите на одну из этих кнопок!

Войти Зарегистрироваться

В теме отметились