Пишем модуль Личных сообщений для Drupal 7

test

В данной статье мы сделаем простой модуль отправки и чтения личных сообщений, кое-где используем jQuery. Статья - сам исходный код с комментариями. Итак, создаем папку с модулем, назовем gipmessages =) Файлы:

Привычный нам файл формата info: gipmessages.info. В этом файле вам уже должно быть все знакомо.

; $Id$
name = Gipper Messages
description = advanced private messages
package = PM
version = 0.9
core = 7.x

файл gipmessages.install, срабатывает при включении и удалении модуля, в нашем случае создает таблицу данных для модуля. Код:

<?php
function gipmessages_schema() //ф-ция отвечает за таблицу данных для модуля,
// при включении создает ее, при удалении - удаляет
{
    $schema['gpmessages']=array(
    'description'=>'gippermessages database',
    'fields'=>array(
        'mid'=>array('type'=>'serial', 'unsigned'=>TRUE, 'not null'=>TRUE),
        'uid_from'=>array('type'=>'int', 'not null'=>TRUE,'unsigned'=>TRUE,'default'=>0),
        'uid_to'=>array('type'=>'int', 'not null'=>TRUE, 'unsigned'=>TRUE,'default'=>0),
        'subject'=>array('type'=>'varchar','length'=>150,'not null'=>TRUE,'default'=>'subject'),
        'message'=>array('type'=>'varchar','length'=>255,'not null'=>TRUE,'default'=>'message'),
        'not_read'=>array('type'=>'int','not null'=>FALSE, 'unsigned'=>TRUE,'default'=>1),
        'time_send'=>array('type'=>'int','not null'=>FALSE,'unsigned'=>TRUE,'default'=>0),
        'name_from'=>array('type'=>'varchar','length'=>150,'not null'=>TRUE,'default'=>''),
        ),
        'primary key'=>array('mid'),
    );
    return $schema;
}

Файл gipmessages.module, с самой логикой модуля:

<?php
function gipmessages_menu()//создаем пункт меню Навигация для модуля
{  
    $items['gmessages']=array(
    'title'=>t('Private Messages'),
    'description'=>'Личные сообщения',
    'page callback'=>'gipmessages_list',
    'access callback'=>'user_access',
    'access arguments'=>array('access content'),
    'type'=>MENU_NORMAL_ITEM
    );
    return $items;
}

function gipmessages_send()//форма отправки сообщения
{   
//виджеты
    $form['subject']=array //наш эллемент, поле с темой сообщения
    (
        '#title'=>t('Subject'), //название поля
        '#description'=>t('Subject of message'),//описание поля, t() - ф-ция локализации сообщения
        '#type'=>'textfield', //текстовое поле
        '#required'=>TRUE, //обязательно к заполнению
    );
   
    $form['send_to']=array //поле в которое пишем адресата сообщения
    (
        '#title'=>t('Send To'),
        '#description'=>t('Send Message To'),
        '#type'=>'textfield',
        '#autocomplete_path'=>'user/autocomplete', //автодополнение текста из списка пользователей
        '#required'=>TRUE,
    );
   
    $form['message']=array
    (
        '#title'=>t('Text Of Message'),
        '#type'=>'textarea',//многострочное текстовое поле
        '#required'=>TRUE,
    );
   
    $form['submit'] = array(
    '#type' => 'submit',//кнопка отправки сообщения
    '#value' => 'Submit',
    '#submit'=>array('gipmessages_send_submit'),//название ф-ции обработчика, срабатывающего по нажатию кнопки
  );
   
    return $form;
}
//сам обработчик нажатия на кнопку отправки сообщения
function gipmessages_send_submit($form, &$form_state)
{

//берем значение наших элементов формы
    $sendto = $form_state['values']['send_to'];
    $message = $form_state['values']['message'];
    $subject = $form_state['values']['subject'];
    global $user; //глобальная переменная с данными текущего пользователя

//получаем данные запроса к базе данных из таблицы пользовател, на SQL:

//SELECT n.uid FROM users AS n WHERE n.name='имя';
    $to_id = db_select('users','n')
    ->fields('n', array('uid')) //передаем список полей по которым хотим получить вывод
    ->condition('name',$sendto,'=')
    ->execute()
    ->fetchAssoc();
   
    $uid = $user->uid;
    $name_from = $user->name;
    $timestamp = time();//текущее время отправки сообщения

//формируем список полей и их содержимое
     $fields = array('mid'=>0,'uid_from'=>$uid,'subject'=>$subject,'message'=>$message,'time_send'=>$timestamp,'uid_to'=>$to_id,'name_from'=>$name_from);

//если запрос не вернул 0 - гость, или же 0 - отсутствие результата, вносим сформированные данные в таблицу
     if ($to_id!=0)
     db_insert('gpmessages')->fields($fields)->execute();
}

//форма чтения сообщений
function gipmessages_list()
{
    $perpage = 10;
    $rows = array();
    //заголовок таблицы
    $header = array(
    array('data'=>'ID', 'field'=>'mid'),
    array('data'=>'От кого', 'field'=>'name_from'),
    array('data'=>'Тема', 'field'=>'subject'),
    array('data'=>'Сообщение', 'field'=>'message'),
    array('data'=>'Отправленно', 'field'=>'time_send'),
    );

global $user;
    //выборка из таблицы с сообщениями
    $msgs = db_select('gpmessages','n')
    ->fields('n', array('mid','uid_from','subject','message','time_send','uid_to','name_from'))
    ->extend('PagerDefault')
->condition('uid_to',$user->uid,'=')
    ->limit(30)
    ->extend('TableSort')
    ->orderByHeader($header)
    ->execute();
    //формируем массив для вывода в таблицу
    foreach ($msgs as $msg)
    {
        $rows[] = array(
        check_plain($msg->mid),
        check_plain($msg->name_from),
        check_plain($msg->subject),
        check_plain($msg->message),
        format_date($msg->time_send)
        );
    }
   
    //jquery код, подгружаем вкладки
    drupal_add_library('system','ui.tabs');
    drupal_add_js('jQuery(function(){ jQuery("#tabs").tabs();});','inline');

//код с выводом вкладок
    $jqcode = '<div id="tabs"><ul><li><a href="#tab_read">Read PM</a></li> <li><a href="#tab_send">Send PM</a></li></ul><div id="tab_read">';
   
    $output = $jqcode .theme('table', array('header'=>$header,'rows'=>$rows));//загоняем в выводим код формирования вкладок и таблицу
    $output .= theme('pager').'</div>';//добавляем туда же пейджер
    $tmp = drupal_get_form('gipmessages_send'); //загоняем в переменную форму отправки сообщений
    $form_send = drupal_render($tmp);//рендерим ее в переменную
    $output .= '<div id="tab_send">' . $form_send . '</div>';//выводим отрендеренную форму на вторую вкладку
//в итоге возвращаем все это, тоесть строим саму форму
    return $output;
}

Вот и все, остается включить модуль и посмотреть что он из себя представляет. =) Совершенствованию модуля дальше нет предела =)

Категория: 

Комментарии

test

Я не писал в нем возможность административной формы, по той простой причине что это азы. Для вас как понимаю актуальна ссылочка:

http://api.drupal.org/api/drupal/modules!system!system.api.php/function/...

Этот хук на сколько я понял и позволяет добавить модуль в админку для установки прав доступа разным категориям.

Never Give UP!

Делитесь с друзьями в социальных сетях! Оставляйте комментарии!

Share/Save

Это Вам так же может быть интересно!