Создание модуля Drupal 7
В этой статье рассмотрим основные этапы написания модуля на Drupal 7:
- Создание модуля
- Создание страницы модуля средствами API Drupal 7
- Создание формы средствами API Drupal 7
- Напишем простенький валидатор формы
- Создадим инсталлятор модуля, который, при включении модуля будет создавать необходимые для работы таблицы в базе данных
- Запись данных из формы в таблицу БД, созданную при установке модуля
Вот основные тезисы данной статьи. И так приступим.
Постановка задачи
Для реализации вышеописанных целей смоделируем мини задачу, которую и будет реализовывать - нужно создать модуль, на странице которого мы сможем заполнить некую форму, которая сохраняет введенные данные в БД и выводит их на странице результатов модуля.
Создание модуля
Создаем папку с нашим модулем по адресу sites/all/modules/test_module. В этой папке нам необходимо создать 3 файла: первый файл test_module.info - информация о нашем модуле, test_module.module - логика модуля, test_module.install - при включении модуля создает таблицу в БД.
в test_module.info пишем:
name = Test module // название модуля, которое будет отображаться пользователю в списке модулей.
description = Модуль для работы с БД // описание модуля, которое будет отображаться пользователю в списке модулей.
core = 7.x // версия ядра
Сохраняем, здесь нам больше указывать ничего не нужно.
Создание страницы модуля средствами API Drupal 7
Далее создадим страницу для модуля, на которой позже мы сделаем форму для сохранения значений в БД. Для этого в test_module.module воспользуемся хуком hook_menu:
<?php
function test_module_menu(){
$item = array(); // регистрируем пустой массив
// ключ массива $item - адрес регистрируемой страницы /my_page
// если в адресе указывать вложенность страницы, то ссылка на страницу отобразится в заданном разделе,
// например, если указать admin/config/my_page, то ссылка на нашу страницу появится в разделе Конфигурация сайта admin/config
$item['my_page'] = array(
'title' => 'Форма для связи с БД',
'page callback' => 'test_module_callback',
'type' => MENU_NORMAL_ITEM,
'access callback' => TRUE
);
return
$item;
}
?>
Теперь в нашей функции обратного вызова test_module_callback, создадим форму со следующими полями: ФИО - тип текстовое поле, Пол - чекбокс с выбором пола. То есть простая форма, где указываем фио и пол.
Создание формы средствами API Drupal 7
в test_module.module, после функции test_module_menu(), пишем наш callback:
<?php
function test_module_callback(){
$form = array(); // регистрируем пустой массив, в котором будут содержаться элементы нашей формы
// создаем первый textfield для ФИО
$form['name'] = array(
'#type' => 'textfield',
'#title' => 'Ваше имя',
'#attributes' => array(
'placeholder' => array('Имя Фамилия')
),
);
// создаем checkbox для Пола:
$form['sex'] = array(
'#type' => 'radios',
'#title' => 'Пол',
'#options' => array(
'0' => 'Male',
'1' => 'Female',
),
'#default_value' => '0',
);
// кнопка отправки формы
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit'
);
// отрисовываем форму
return drupal_render($form);
}
?>
На данном этапе у нас есть страница, созданная модулем, на которой есть текстовое поле, чекбокс с выбором пола и кнопка отправки. Хочу заметить, что модуль я еще не включал, так как включение я хочу осуществить после написания install файла.
Написание простенького валидатора формы
Так же в файле test_module.module мы можем написать валидатор, используя хук hook_validate, или описать свой сабмит формы используя хук hook_submit. Давайте напишем валидатор, который будет проверять длинну текстового поля, чтобы пользователь не мог ввести значение меньше трех символов, для этого после коллбека пишем:
<?php
function test_module_validate($form, &$form_state){ // принимает два аргумента, можете дебажить их, там есть много интересного
$name = $form_state['values']['name']; // из $form_state вытягиваем значение текстового поля
$name_lenght = mb_strlen($name); // считаем количество символов
// проверяем:
if($name_lenght < 3){
form_set_error('name', t('Short name'));
}
}
?>
Сабмит мы опишем позднее, после написания инсталл файла модуля, так как в сабмите мы будем производить сохранение, в базу, введенных в форму значений.
Пишем "инсталлятор" модуля
Окрываем файл test_module.install, в нем используя хук hook_schema(), создадим для модуля, в БД, нужную таблицу, куда будем записывать ФИО и Пол.
<?php
function test_module_schema(){
$schema = array(); // регистрируем пустой массив
// в качестве ключа пишем имя таблицы
$schema['test_module'] = array(
'description' => 'Таблица результатов отправки формы',
'fields' => array( // описываем столбцы таблицы
'id' => array(
'type' => 'serial',
'unsignet' => TRUE,
'not null' => TRUE,
),
'name' => array(
'type' => 'varchar',
'length' => 128,
'default' => '',
),
'sex' => array(
'type' => 'int',
'default' => 0,
),
),
'primary key' => array('id'), // указываем primary key
);
return
$schema;
}
?>
Теперь можно включить наш модуль, после чего в базе данных появится наша таблица 'test_module' со столбцами 'id', 'name', 'sex'.
Так же появится наша форма по адресу /my_page
Запись данных из формы в таблицу БД, созданную при установке модуля
Далее, возвращаемся test_module.module и пишем обработчик события submit. Что бы при отправке формы значения сохранялись в БД.
<?php
function test_module_submit($form, &$form_state){
$q = db_insert('test_module'); // выбираем созданную нами таблицу в БД
// с помощью метода fields заполняем таблицу введенными значениями
$q->fields(
array(
'name' => $form_state['values']['name'],
'sex' => $form_state['values']['sex'],
)
);
// сохраняем в переменную результаты запроса
$res = $q->execute();
// делаем проверку
if ($res) {
drupal_set_message('Форма успешно отправлена','status');
}
else {
drupal_set_message('Ошибка отправки формы','error');
}
}
?>
Все. Теперь у нас есть полноценный модуль, который при включении создает таблицу в БД, в которую пишет результаты, введенные в форму, созданную модулем.