Slyweb
На разработку сайта! Скидки 50%!

Мой первый модуль на Drupal 6

jQuery и CSS

Обычно изучив ту или иную CMS я начинаю писать о ней или забываю и не возвращаюсь к ней, к тому же Modx и Joomla хватало для решения любых задач, в том числе для построения любых сайтов, когда не хватало переходил на Zend Framework 2. Из всех просмотренных мной CMS(их около десятка) я отобрал joomla, modx и drupal. Drupal попал в список CMS, заслуживающих внимания за возможность использования MVC, хорошей маршрутизации и быстрой интеграции сторонних скрипов в CMS. Мой первый модуль на Drupal был написан на версии Drupal 6.

Где размещать файлы модулей Drupal.

Для размещения файлов я использую директорию "/sites/all/modules/". Мой модуль называется "test-module" поэтому директория модуля будет "/sites/all/modules/test-module ".

Обязательными файлами в директории модуля являются:

  • test_module.module - файл, содержащий php код, который является "сердцем" модуля;
  • test_module.info - информационный файл, содержаний информацию о названии, описание, версию и т.д.

Обязательные для модуля функции

Обязательной функцией для модуля является функция "main", при этом большинство функции модулей Drupal должны начинаться с префикса названия модуля, так как в нашем случае название модуля "test_module", следовательно, полное имя функции "test_module_main".

  • Код
  • Чистый код
  • Копировать в буфер
  1.function test_module_menu(){
  2.        $items = array();
  3.
  4.        $items['honda'] = array(
  5.            'title' => 'Заголовок страницы',//заголовок страницы
  6.            'page callback' => 'main_function',//имя функции
  7.            'access arguments' => array('access main'),
  8.            'type' => MENU_CALLBACK,
  9.            'access callback' => TRUE, //доступ к странице
10.            'page arguments' => array(arg(1)),
11.        );
12.
13.
14.    $items['admin/settings/editorpanel'] = array(
15.        'title' => 'Editor Control Panel',
16.        'page callback' => 'drupal_goto',
17.        'page arguments' => array('control/editor'),
18.        'access arguments' => array('access editor control panel'),
19.    );
20.    
21. return $items;
22.}

        

Функция "test_module_menu" должна возвращать массив устанавливающий маршрутом, в нашем случае это два адреса первый для страниц сайта, второй для администраторского раздела. Разберём первый массив.

  • Код
  • Чистый код
  • Копировать в буфер
  1.        $items['honda'] = array(
  2.            'title' => 'Заголовок страницы',//заголовок страницы
  3.            'page callback' => 'main_function',//имя функции
  4.            'access arguments' => array('access main'),
  5.            'type' => MENU_CALLBACK,
  6.            'access callback' => TRUE, //доступ к странице
  7.            'page arguments' => array(arg(1)),
  8.        );

        

ключи массива и их назначение:

  • title - заголовок страницы;
  • page callback - функция обработчик, вызываемый при открытии страницы по адресу “/honda/”, в нашем случае - "main_function";
  • access callback - функция проверяющая имеет ли пользователь доступ к данному элементу меню, в нашем случае это простая заглушка;
  • access arguments - массив аргументов, передаваемых в функцию, проверяющую права для доступа пользователю к данному модулю, которая определена в элементе массива "access callback".
  • type - тип меню, в наше случае это функция (http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_menu/7);
  • page arguments - массив аргументов, передаваемых в функцию, выполняемую при разборе нашего адреса (указана в параметре "page callback").

Второй элемент массива $items['admin/settings/editorpanel'] предназначен для доступа к администраторскому разделу, в нашем случае перейдя по адресу "admin/settings/editorpanel", будет выполнена функция "drupal_goto", в которую будут переданы аргументы.

Для простого модуля мне не понадобилась функциональность в администраторском разделе, так как модуль выводил данные из базы для пользователей на страницах сайта, поэтому никаких функций для администраторского раздела я не использовал.

Функция, которая выполняет основную работу в модуле, может выглядеть следующим образом:

  • Код
  • Чистый код
  • Копировать в буфер
  1.function main_function($m,$year,$model,$type){
  2.    //var_dump($m,$year,$model,$type);
  3.    $result = db_query_range("SELECT h.* FROM honda as h", 0, 100);
  4.    while ($node = db_fetch_object($result)) {
  5.
  6.        $imgblock = $node->imgblock;
  7.        $dvigatel = $node->dvigatel;
  8.        $model = $node->model;
  9.        $nameblock_ru = $node->nameblock_ru;
10.        $nameblock_en = $node->nameblock_en;
11.        
12.    }
13.    
14.    
15.    $output = theme('test_block', $imgblock,$nameblock_ru,$nameblock_en,$year,$model,$dvigatel);
16.
17.    return $output;
18.}

        

Всё здесь я думаю понятно за исключением функция $output = theme('test_block', $imgblock,$nameblock_ru,$nameblock_en,$year,$model,$dvigatel);, которая предназначена для выбора шаблона, в который будет выводится все данные работы модуля, то есть это своеобразное представление модуля. Пример указан ниже:

  • Код
  • Чистый код
  • Копировать в буфер
  1.
  2.function test_module_theme() {
  3. return array(
  4.    'test_block' => array(
  5.        'arguments' => array(
  6.                    'result' => NULL,
  7.                    'details' => NULL,
  8.                    'nameblock_ru' => NULL,
  9.                    'nameblock_en' => NULL,
10.                    'year' => NULL,
11.                    'model' => NUL,
12.                    'dvigatel' => NULL,
13.                    'blocks' => NULL),
14.        'template' => 'test-block',
15.    ),
16. );
17.}

        

После выполнения данной функции в шаблоне "test-block.tpl.php" будут доступны все переменные, которые мы передали в него. Шаблон - это обычный файл php, поэтому в нем может содержаться любая разметка html кода.

Не забывайте, про маршрутизацию, доступ к нашему модулю можно получить по адресу – "/honda", но и по адресу - "honda/aaa/bbb/ccc", тогда в качестве параметров функция "main_function" примет аргументы $year (aaa),$model (bbb),$type (ccc).


Александр Ермаков