На днях вас ждут интересные новости о будущем движка, а сейчас же я расскажу о том, как реализовать совсем недавно поступивший запрос на шестеренку «Приветственное Сообщение».
Как вам известно, мы проповедуем метод «Быстрой разработки», когда за минимальное количество времени вы получает максимальный результат. Идеология движка строится вокруг этого базового понятия. Поэтому и в этот раз ответ на просьбу не заставил себя долго ждать.
Продолжаем старую добрую традицию уроков.
Зная структуру движка, обсудим схему работы новой шестеренки.
Для начала придем к выводу, что текст приветственного сообщения — это единственная сущность, откуда можно заключить, что удобнее использовать для выполнения этой роли языковую переменную, чем создавать новую таблицу в базе данных.
После этого представим, в какой момент нужно отправить личное сообщение — конечно же, сразу после регистрации. Поэтому мы будем хукать модель формы регистрации после успешного сохранения данных.
Структура
Назовем шестеренку welcome_message.
- welcome_message.info — информация о шестеренке.
- welcome_message.png — иконка шестеренки, про запас (64x64, прозрачная PNG с сайта IconFinder).
- ru.lng — файл с переводом на русский язык.
- _hooks.php — файл с хуком, где и будет происходить интеграция в процесс.
Файл конфигурации
Все понятно без слов.title = "Welcome Message"
description = "Sent welcome message via PM after user registration"
core = 1.x
version = 1.0
group = plugins
enabled = TRUE
Файл перевода
Аналогично.[gears]
welcome_message = "Приветственное сообщение"
welcome_message_description = "Отправляет пользователю сообщение с приветствием сразу после регистрации."
[welcome_message]
subject = "Добро пожаловать!"
body = "Привет, %user_name%! Добро пожаловать на сайт. Мы приложили немало усилий для его создания, поэтому искренне надеемся, что он прийдется тебе по нраву."
Файл с хуками
<?php
/**
* Welcome message hooks
*
* @author Dmitriy Belyaev <admin@cogear.ru>
* @copyright Copyright © 2010, Dmitriy Belyaev
* @license http://cogear.ru/license.html
* @link http://cogear.ru
* @package Welcome Message
* @subpackage Hooks
* @version $Id$
*/
function welcome_message_form_save_after_($Form,$result,$table,$data){
// Проверяем, наша ли форма и положительный ли результат
if($Form->name == 'register' && $result){
// Устанавливаем раздел перевода
d('welcome_message');
// Берем сущность CodeIgniter
$CI =& get_instance();
// Собираем информацию про только что созданного пользователя
$user = $CI->user->info($Form->insert_id);
// Отменяем редирект после отправки сообщения
$CI->pm->redirect = FALSE;
// Отправляем сообщение, заменяя %user_name% на имя пользователя
$CI->pm->send($user->id,1,t('subject'),str_replace('%user_name%',$user->name,t('body')));
// Возвращаем последний раздел перевода, чтобы избежать конфликтов с другими хуками
d();
}
}
Обратите внимание, что функция хука имеет суффикс after_ и второй аргумент $result, что говорит о том, что хук будет выполнен после события и будет оперировать его результатом в виде второго аргумента.Вот и все!
На создание шестеренки и тестирование ушло не более 20 минут — попробуйте сами!
Удачи.


Прочитав пост решил сделать по аналогии шестеренку обратной связи. И надо же — сделал :-). Все работает, как задумано.
Если пользователь зарегистрирован, то письмо отправляется, как обычно, adminу в личку. А если не зарегистрирован, то к форме добавляются поля с капчей и контактами и так же отправляется админу в личка, а в имени юзера пишется отправил Аноним.
Только есть маленькая капля дегтя, которая портит всю бочку с медом — это никак не получается после отправки письма Анонимом показывать ему сообщение, что его письмо отправлено.
Если я в шестеренке делаю проверку, зарегистрирован пользователь или нет, то при отрицательном ответе показываю ему такое сообщение и вроде бы все нормально, но письмо не отсылается. Это происходит потому, что письмо отсылается при помощи:
$this->pm->send($result);Где send уже изначально завязан на шестеренки mail и после отправки письма через шестеренку mail она перемешает пользователя в личку. Но так, как в моем случае пользователь не зарегистрирован ему приходится видеть сообщение:
Которое его точно дезориентирует.
Вот такая мелочь спутала мои планы по публикации шестеренки обратной связи :-(.
# // Отменяем редирект после отправки сообщения # $CI->pm->redirect = FALSE;Внес изменения — все работает! Но, как всегда появилась еще одна маленькая фигня.
Под сообщением об отправленном письме подгружается вновь таже форма.
Пытался отрезать эту форму break;, куда я его только не подставлял — все тщетно.
Правда, придумал два фиговых варианта для решения проблемы, которые работают:
1. Подгружать заранее заготовленный шаблон
$CI->output->_display($CI->_template('feedback feedback',$result,TRUE)); exit(); break;Вывод:Получается очень громоздко2. Сделать функцию которая показывает страницу с сообщением об отправке, и делать редирект на нее.
Вывод:Появляется дополнительная по сути не нужная страница.
Может есть нормальное решение этой проблемы?
$CI->pm->redirect = l('/some_page');function index($id = FALSE){ $this->form->set('create_mail'); d('feedback'); if(!$this->user->is_logged()) { $this->session->set('form_fail',100); $this->form->set('register'); } $this->form->title(t('feedback'))->hidden('to',array('value'=>'admin')) ->input('subject',array('label'=>t('subject'),'js_validation'=>'required','validation'=>'required')) ->editor('body',array('label'=>t('message'),'js_validation'=>'required','validation'=>'required')) ->buttons('preview',array('send'=>array('class'=>'submit'))); if($result = $this->form->result(TRUE)){ switch($result['action']){ case 'preview': $result['body'] = nl2br($result['body']); $this->_template("preview",$result,3); $this->form->set_values($result); $this->form->compile(); break; case 'send': default: if(!$this->user->is_logged()) { $this->pm->redirect = FALSE; info(t('message_send')); } $this->pm->send($result); } } $this->form->compile(); }if($result){ ... } else { $this->form->compile(); }Пошел доделывать шестеренку.
Давно мучает вопрос, чем отличается $CI от $this?
Заметил, что $this употребляется в файлах index.php, _admin.php, а также в файлах из папки library. А $CI в хуках, модулях.
Почему не используется, что-то одно?
Написано: прийдется, где й — лишняя.