Database API Drupal 7, hook_schema и создание таблицы в Drupal 7. Часть 1

Сложность: 
3

По многим просьбам мы распишем как правильно управляться с Базой Данных в Друпал 7.
В этой статье мы познакомимся с самой первой основной Database API, а именно мы создадим таблицу в БД Друпал.

Написание модуля

Про написание модуля для Drupal 7 уже не раз описывалось на данном сайте. Если у Вас есть проблемы с этим, тогда рекомендуем прочитать статью Пишем модуль, Form API в Drupal 7 (уровень 2.1) часть 1 или же видео Пишем модуль Drupal 7, hook_menu.
Стоит обратить внимание на то, что нам необходимо создать только 2 файла, это .info и .module.

Создадим папку с модулем, назвем ее “my_database”, также создадим файлик в середине папки с названием my_database.info.
Содержимое файла стандартное и имеет следующий вид:

name = My database
description = Module for example of use Database API in Drupal.
core = 7.x
version = 7.x-1.x-dev

Дальше создадим файл my_database.module. Содержимое файла будет следующее:

<?php
/**
* @file
* Contains base function for module.
*/

 

Пишем таблицу

Вот мы уже подошли к тому самому моменту, когда нужно работать с Database API в Drupal 7.
Мы будем писать hook_schema для того что бы создать таблицу.
Стоит запомнить один нюанс, что данный хук необходимо писать в файле “.install”, таким образом, при включении модуля в Друпал, данный файл будет запускаться в первую очередь. hook_schema отвечает за создание таблицы в БД Друпала.

Создадим файл my_database.install, содержимое будет следующее:

 
<?php
/**
* @file
* Installation file for My database module.
*/

Файл у нас есть, теперь давайте создадим таблицу с полям:
- id - первичный ключ + автоинкремент;
- number - целые числа;
- teaser - текст до 150 символов, следовательно тип будет varchar;
- text - тип текст.
Таблица будет иметь название my_table.

hook_schema будет выглядеть следующим образом:

  1. /**
  2.  * Implements hook_schema().
  3.  */
  4. function my_database_schema() {
  5.   $schema['my_table'] = array(
  6.     'description' => 'Custom table from My database module.',
  7.     'fields' => array(
  8.       'id' => array(
  9.         'description' => 'The primary identifier for a record.',
  10.         'type' => 'serial',
  11.         'unsigned' => TRUE,
  12.         'not null' => TRUE,
  13.       ),
  14.       'number' => array(
  15.         'description' => 'Field for integer number.',
  16.         'type' => 'int',
  17.         'unsigned' => TRUE,
  18.         'not null' => TRUE,
  19.         'default' => 0,
  20.       ),
  21.       'teaser' => array(
  22.         'description' => 'Teaser field.',
  23.         'type' => 'varchar',
  24.         'length' => 150,
  25.         'not null' => TRUE,
  26.         'default' => '',
  27.       ),
  28.       'text' => array(
  29.         'description' => 'Text field.',
  30.         'type' => 'text',
  31.         'not null' => FALSE,
  32.       ),
  33.     ),
  34.     'primary key' => array('id'),
  35.   );
  36.   return $schema;
  37. }

Давайте разберем строчки кода.
Строчка 5 создает переменную с ключом массива 'my_table', здесь необходимо прописывать название таблицы.
Следующая, 6 строчка, добавляет описание к таблице. Описание таблицы не есть обязательным, но желательным. Обратите внимание, что здесь текст не нужно оборачивать в функцию t, иначе будет ошибка.
В строчках 7-33 описываются поля таблицы. Здесь думаю что все понятно, что ключом каждого поля это и есть его название, в каждом поле есть обязательное значение как 'type', в нем мы описываем тип поля. Еще, поля могут иметь дополнительные параметры, такие как 'description', 'unsigned', 'not null', 'default' и многие другие. Список всех типов вы можете посмотреть в официальной документации, а именно на этой странице.
34 строчка задает первичный ключ для поля 'id'.
И в 36 строчке возвращается массив.

Если вы уверены в том, что у вас создан файл .info, .module и .install, тогда можете смело включать модуль.
Во время включения, Друпал увидит файл .install, за счет того, что он имеет одинаковое название вместе с файлом .info. Потом он увидит задействованный hook_schema. Относительно выстроенных параметров сформируется необходимый SQL-запрос, который будет применен к базе данных, на которой установлен Друпал.

После включение модуля проверьте, появилась ли новая таблица в БД Друпала.

Работа над ошибками

Иногда бывает проблемы с установкой таблицы, например вы включили модуль, а таблицы нет.
В таких случаях необходимо попробовать еще раз установить модуль.
В нашем случаи мы имеем дело с Базой Данных, поэтому если мы выключим модуль, тогда он еще останется в реестре сайта. Следовательно если вы выключите модуль Views а потом снова включите, тогда все его настройки никуда не пропадут. Но если зайти на страницу “/admin/modules/uninstall” (ссылка указана относительная), тогда вы увидите список выключенных модулей которые можно удалить. Только после полного удаления, модуль сотрет все свои следы пребывания в БД, также, во время удаления модуля задействован hook_uninstall (прописывать в .install файле), где можно прописать действия, которые будут сделаны во время удаления..

Получается следующее, если у Вас проблемы с модулем, вы нашли ошибку в уже созданой таблице, тогда выключите его, удалите и тогда снова включите.

Также, если у вас уже есть созданная таблица в ней есть данные, тогда ее удаление не есть уместно, поскольку мы потеряем информацию. В таких случаях необходимо прописать hook_update_N.

Для сверки, в конце статьи прикреплен архив с модулем.

Итог

В это статье мы познакомились с hook_schema, проанализировали как правильно создавать таблицы в БД Друпала.
В следующей части статьи мы познакомимся с написанием запросов используя Database API Drupal 7.

Рассказать друзьям: