Создание формы обратного звонка drupal 7

Аватар пользователя ulogin_facebook_100003178678785
Автор: 
Александр Поляков

В этой статье хотел познакомить вас с написанием модулей для drupal 7.

И желательно на рабочем примере который можно будет применять в своих проектах.

 

Немного полазив по просторам интернетов понял, что для друпала нет модуля обратного звонка, который бы соответствовал моим требованиям.

Везде натыкаюсь на информацию как собрать такую форму с помощью модуля webforms. Но совсем не обязательно нагружать сайт таким тяжеловесом из-за одной формы в два поля.

Ну вот и решил поделиться опытом написать свой и заодно показать насколько это просто.

 

Плюсы данного модуля

  • Легкий

  • Можно быстро перенести в другой проектах

  • Как следствие того, что написан самостоятельно, полное понимание его работы.

  • Возможность кастомизации ограничена только фантазией.

 

Приступим.

 

1. Постановка задачи.

Кнопка обратного звонка собственно представляет из себя форму обратной связи в которой надо заполнить поля (имя, телефон) и нажать отправить. Отправленный данные поступают админу сайта на емейл.

Вроде все просто.

 

2. Этапы разработки

    2.1 Создание формы в блоке

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

    2.3 Формирование текста письма

    2.4 Отправка данных на емейл.

 

2.1 Создание формы в блоке

Приступим модуль будет носить рабочее название callback

Модуль друпала состоит минимум из папки и двух файлов.

MODULENAME.info

MODULENAME.module

в нашем случае

  • callback

    • callback.info

    • callback.module

Создаем их в папке sites/all/modules/custom/

Папки custom по умолчанию нет, ее нужно создать.

Нужна она для того что-бы отделить свои модули от скачанных с drupal.org и что-бы движок не проверял их обновления.

Содержание файла callback.info информация о модуле которая будет отображаться на странице настройки модуле.

 

Листинг callback.info

name=Callback

description=Формы обратной связи.

package=User feedback

core=7.x

 

Файл callback.module собственно сам модуль.

Файл модуля начинается с <?php но закрывающей скобки не ставиться.

В нем мы сделаем логику работы нашего модуля.

 

Первое нам надо отобразить модуль на станице admin/structure/block, что-бы можно было его поставить в нужный регион.

Это делается хуком hook_block_info()

function callback_block_info() {

  $blocks['callback'] = array(

    'info' => t('Обратный звонок'),

    'cache' => DRUPAL_NO_CACHE,

  );

  return $blocks;

}

Далее надо собрать форму для нашего блока

Тут нам поможет hook_form() который собирает массив формы.

Полезная табличка со свойствами элементов формы https://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7

Проектируем форму.

function callback_form($form_state,&$form_submit){

$form['name']=array(

  '#title'=>t('Имя'),

  '#type'=>'textfield',

  '#required'=>TRUE,

  '#maxlength'=> 50,

  '#size'=>30,

);

$form['phone']=array(

  '#title'=>t('Телефон'),

  '#type'=>'textfield',

  '#required'=>TRUE,

  '#maxlength'=> 50,

  '#size'=>30,

);

$form['submit']=array(

  '#type'=>'submit',

  '#value'=>t('Отправить'),

);

return $form;

}

 

Разберем один из элементов

$form['name']=array(

  '#title'=>t('Имя'),

  '#type'=>'textfield',

  '#required'=>TRUE,

  '#maxlength'=> 50,

  '#size'=>30,

);

 

Тут мы создаем массив который описывает элемент формы

текстовое поле '#type'=>'textfield',

с подписью '#title'=>t('Имя'),

обязательное для заполнения '#required'=>TRUE,

максимально вмещающим 50 символов '#maxlength'=> 50,

и длинной 30 '#size'=>30,

 

После двух полей «Имя» и «Телефон» идет кнопка отправить.

$form['submit']=array(

  '#type'=>'submit',

  '#value'=>t('Отправить'),

);

Далее когда форма собрана функция возвращает массив формы.

return $form;

Осталось вывести форму в блок.

Отлично прибегнем к хуку hook_block_view()

 

function callback_block_view($delta = '') {

  $block = array();

    $block['content'] = drupal_get_form('callback_form');

  return $block;

}

 

Тут в контент блока передаем массив формы, собранный перед этим и обработанный функцией drupal_get_form().

Функция drupal_get_form() преобразует массив в html форму.

 

Отлично вот полный листинг файла callback.module

<?php

function callback_block_info() {

  $blocks['callback'] = array(

    'info' => t('Обратный звонок'),

    'cache' => DRUPAL_NO_CACHE,

  );

  return $blocks;

}

 

//Строим форму

function callback_form($form_state,&$form_submit){

  $form['name']=array(

    '#title'=>t('Имя'),

    '#type'=>'textfield',

    '#required'=>TRUE,

    '#maxlength'=> 50,

    '#size'=>30,

  );

  $form['phone']=array(

    '#title'=>t('Телефон'),

    '#type'=>'textfield',

    '#required'=>TRUE,

    '#maxlength'=> 50,

    '#size'=>30,

  );

  $form['submit']=array(

    '#type'=>'submit',

    '#value'=>t('Отправить'),

  );

return $form;

}

 

//Выводим блок

function callback_block_view($delta = '') {

  $block = array();

  $block['content'] = drupal_get_form('callback_form');

  return $block;

}

 

Пора посмотреть как работает наш модуль

  1. Идем на страницу настройки модулей admin/modules

  2. В разделе User feedback включаем модуль.

  3. Заходим на страницу настройки блоков admin/structure/block

  4. Перетаскиваем блок «Обратный звонок» в нужный регион.

 

В нужном регионе появилась форма.

Если не заполняя полей нажать отправить то незаполненные поля посветятся красным и появится сообщение, что нужно заполнить поля.

Однако если ввести данные и нажать отправить визуально нечего не произойдет.

Да и на самом деле не чего не произойдет поскольку наша форма не куда не отправляется.


И так этап 2.1 Создание формы в блоке окончен.

 

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

Для проверки формы существует hook_form_validate.

Что-бы увидеть какие данные отправляются из формы напишем следующие

function callback_form_validate($form, &$form_state){

  debug($form_state['values']);

}

В области сообщений появится информация которая была отправлена из формы в виде массива.

Мы хотим чтобы если имя пользователя короче трех букв форма возвращала ошибку.

Изменяем валидацию на следующее

function callback_form_validate($form, &$form_state){
  //debug($form_state['values']);
  if(mb_strlen($form_state['values']['name'])<3){
    form_set_error('name', t('Слишком короткое имя.'));
  }
}

Проверяем: в поле «имя» пишем например «Ли» - (не в обиду китайцам) 
и получаем ошибку «Слишком короткое имя.» Отлично проверка работает. 
2.3 Формирование текста письма, 2.4 Отправка данных на емейл.

Поскольку они тесно взаимосвязаны реализуем в одной функции hook_form_submit()

//Отправка мейла
function callback_form_submit($form, &$form_state){
    //Получаем даные преданные из формы и пишем в переменные для удосбства
    $name   = $form_state['values']['name'];
    $phone  = $form_state['values']['phone'];

    //Формируем тело письма
    $str  = "Имя ".$name."\r\n";
    $str .= "Телефон ".$phone."\r\n";
    
    //Отправляем через функцию друпала
    // На мейл администратора сайта variable_get('site_mail')
    drupal_mail('system', 'mail', variable_get('site_mail'), language_default(), array(
      'context' => array(
        'subject' => 'Заполнена форма обратного звонка',
        'message' => $str,
      )
    ));
    //И сообщение пользователю, о то что отправка данных состоялась
    drupal_set_message('Сообщение отправлено');
}


 

Если все сделано правильно то на мейл, который указан в admin/config/system/site-information должно прийти письмо.

Если вы работает на локальном компьтере то с настройками отправки и прочим придется разобраться самостоятельно. На денвере например вся почта падает в заглушку.

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

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

Файлы модуля можно скачать тут https://github.com/Backstabe/callback


 

В планах написать продолжение статьи уже по работе с JS и базой данных на примере этого модуля. Увижу обсуждение данного материала, тогда напишу.

Всем спасибо, кто дочитал до конца.

Если информация оказалась полезной оставляйте каменты.

 

*VISA/MasterCard