Database API Drupal 7, вставка данных в таблицу, db_insert. Часть 2.

Сложность: 
3

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

Страница для формы

Конечно же, для того, что бы вставить данные нам необходима форма.
Для начала создадим hook_menu в файле нашего модуля. В hook_menu мы создадим страницу для вывода нашей формы.

В файле my_database.module hook_menu будет иметь следующий вид:

  1. /**
  2.  * Implements hook_menu().
  3.  */
  4. function my_database_menu() {
  5.   $items['my_database/insert'] = array(
  6.     'title' => 'Page for insert data',
  7.     'page callback' => 'drupal_get_form',
  8.     'page arguments' => array('my_database_insert_form'),
  9.     'access arguments' => array('administer site configuration'),
  10.   );
  11.   return $items;
  12. }

Здесь стоит обратить внимание на следующие строчки:
5 - страница у нас будет доступна по адресу “/my_database/insert”
7 - выводим форму с помощью функции 'drupal_get_form'
8 - писаться форма будет в функции 'my_database_insert_form'
9 - Доступ к странице регулирует пермишн 'administer site configuration'. Здесь был взят уже существующий доступ в ядре Друпал. Данный доступ называется как “Administer site configuration”, а системное название 'administer site configuration'.

Если у вас есть сложности с написанием hook_menu, предлагаем просмотреть видео Пишем модуль Drupal 7, hook_menu.

Написание формы

Как мы написали в hook_menu, функция для формы будет 'my_database_insert_form'.
В форме необходимо создать поля, в которых мы можем вставить значение через нашу форму.
Поля создадим следующие:
Number - textfield с проверкой на присутствие только целого числа и длинной до 10 символов.
Teaser - textfield с максимальной длинной 150 символов.
Text - textarea.
Все поля обязательны к заполнению.
Поле для id мы заполнять не будем, поскольку в БД оно у нас описано как автоинкремент (то есть увеличение значения поле будет автоматически).

Форма будет иметь следующий вид:

/**
* Build form for insert data.
*/
function my_database_insert_form($form, $form_state) { $form = array(); $form['number'] = array( '#title' => t('Number'), '#type' => 'textfield', '#maxlength' => 10, '#description' => t('Only numbers'), '#required' => TRUE, ); $form['teaser'] = array( '#title' => t('Teaser'), '#type' => 'textfield', '#maxlength' => 150, '#required' => TRUE, ); $form['text'] = array( '#title' => t('Text'), '#type' => 'textarea', '#required' => TRUE, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Submit'), ); return $form; }

Обязательно почистите кеш на вашем Друпал-сайте, для того, что бы hook_menu вступил в силу (сделать это можно на странице “/admin/config/development/performance”, ссылка указана относительная).

Визуально форма будет выглядеть так:

Если вы не сильно понимаете что такое форма в Друпал и что она из себя представляет, рекомендуем освоить следующие статьи:
Пишем модуль, Form API в Drupal 7 (уровень 2.1) часть 1.
Пишем модуль, Form API в Drupal 7 (уровень 2.1) часть 2.

Валидация формы

Обязательно, для нашей формы должна быть валидация. Не смотря на то, что у нас для полей Number и Teaser прописана максимальная длинна, она все равно это не даст нам максимальной защищенности, потому что к элементу input прописывается атрибут maxlength, который можно обойти.
Еще, необходимо сделать проверку на наличие только цифр в поле Number. Необходима валидация на стороне сервера, то есть в php коде.

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

/**
* Validate for my_database_insert_form.
*/
function my_database_insert_form_validate($form, &$form_state) { if (drupal_strlen($form_state['values']['number']) > 10) { form_set_error('number', t('Field "@fieldname" must be less than @c chars.', array('@fieldname' => t('Number'), '@c' => 10))); } elseif (!ctype_digit($form_state['values']['number'])) { form_set_error('number', t('Field "number" must contains an integer.')); } if (drupal_strlen($form_state['values']['teaser']) > 150) { form_set_error('teaser', t('Field "@fieldname" must be less than @c chars.', array('@fieldname' => t('Teaser'), '@c' => 150))); } }

Отправка формы и db_insert

Именно здесь будем делать вставку наших провалидированных данных в нашу таблицу.
Для этого необходимо использовать db_insert.
В самом db_insert самый интересный, это метод fields, в котором мы должны указать поля и их значения для вставки.
Сам код вставки, для примера, будет такой:

db_insert('my_table')
    ->fields(array(
      'field1' => ‘value1’,
      'field2' => ‘value2’,
    ))
    ->execute();

db_insert('my_table') - указываем в какую таблицу будут вставляться данные.
fields - метод для указание полей.
execute - в этом методе происходит вставка в таблицу. Без метода execute у нас бы только сформируется запрос, но не выполнится.

В нашей функции сабмита формы все будет выглядеть так:

/**
* Submit for my_database_insert_form.
*/
function my_database_insert_form_submit($form, &$form_state) { $query = db_insert('my_table') ->fields(array( 'number' => $form_state['values']['number'], 'teaser' => $form_state['values']['teaser'], 'text' => $form_state['values']['text'], )) ->execute(); if ($query > 0) { drupal_set_message(t('Data has been successfully sent.')); } else { drupal_set_message(t("Data hasn't been sent."), 'error'); } }

Обязательно стоит обратить внимание на проверку переменной $query. Если у нас происходит правильная вставка в БД, тогда нам возвращается первичный ключ. В данном случаи мы получаем значение поля id которое автоматически заполнилось. Если это значение больше нуля, тогда у нас есть гарантия, что данные вставились адекватно. Иначе, выводим соответственное сообщение.

Архив с исходниками модуля находится ниже.

Итог

В данной статье мы познакомились с одним из элементов Database API Drupal 7 это функция db_insert. Также мы написали форму, указали к ней валидацию и уже на отправке формы вставляем данные в таблицу.
В следующей части серии статей Database API Drupal 7 про мы познакомимся с выборкой данных из таблицы при помощи db_select, также сформируем удобную таблицу с выводом списка записей и научимся правильно работать с db_update и db_merge.

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