Powered by CodeIgniter

Уроки

(28)
14
16 голосов
Учиться, учиться и еще раз учиться — развитие личности идет таким путем.
Доброго времени суток, уважаемые пользователи cogear!
На днях вас ждут интересные новости о будущем движка, а сейчас же я расскажу о том, как реализовать совсем недавно поступивший запрос на шестеренку «Приветственное Сообщение».
Как вам известно, мы проповедуем метод «Быстрой разработки», когда за минимальное количество времени вы получает максимальный результат. Идеология движка строится вокруг этого базового понятия. Поэтому и в этот раз ответ на просьбу не заставил себя долго ждать.
Продолжаем старую добрую традицию уроков.
«Приветственное сообщение» мы реализуем при помощи новой шестеренки, во всей красе воспользовавшись системой хуков.
Зная структуру движка, обсудим схему работы новой шестеренки.
Для начала придем к выводу, что текст приветственного сообщения — это единственная сущность, откуда можно заключить, что удобнее использовать для выполнения этой роли языковую переменную, чем создавать новую таблицу в базе данных.
После этого представим, в какой момент нужно отправить личное сообщение — конечно же, сразу после регистрации. Поэтому мы будем хукать модель формы регистрации после успешного сохранения данных.

Структура

Назовем шестеренку welcome_message.

Структура шестеренки

Нам понадобится всего 4 файла для реализации нашей идеи:
  • 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 минут — попробуйте сами!
Удачи.
03:11 ← 25 ноября 2010 Отправить в Твиттер adminadmin  RSS comments 17

Здесь пока ничего нет.

Комментарии (17) ↓

Автор
admin admin time 03:18 ← 25 ноября 2010 #
Если хотите, чтобы корректно работало и с Loginza — обновите дистрибутив.
shm-valeriy shm-valeriy time 03:33 ← 25 ноября 2010 #
На мой взгляд очень полезный хук для всех!
Автор
admin admin time 03:37 ← 25 ноября 2010 #
Хук — это метод взаимодействия между шестеренками :-)
shm-valeriy shm-valeriy time 16:12 ← 25 ноября 2010 #
Прошу прощения писал комментарий поздно, и забыл о том что в данной системе все модификации обзываются шестеренками :)
inetlover inetlover time 16:36 ← 26 ноября 2010 #
Урок — хороший, познавательный. Спасибо!

Прочитав пост решил сделать по аналогии шестеренку обратной связи. И надо же — сделал :-). Все работает, как задумано.

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

Только есть маленькая капля дегтя, которая портит всю бочку с медом — это никак не получается после отправки письма Анонимом показывать ему сообщение, что его письмо отправлено.

Если я в шестеренке делаю проверку, зарегистрирован пользователь или нет, то при отрицательном ответе показываю ему такое сообщение и вроде бы все нормально, но письмо не отсылается. Это происходит потому, что письмо отсылается при помощи:
$this->pm->send($result);
Где send уже изначально завязан на шестеренки mail и после отправки письма через шестеренку mail она перемешает пользователя в личку. Но так, как в моем случае пользователь не зарегистрирован ему приходится видеть сообщение:

Доступ запрещен

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

Которое его точно дезориентирует.

Вот такая мелочь спутала мои планы по публикации шестеренки обратной связи :-(.
Автор
admin admin time 17:06 ← 26 ноября 2010 #
Саша, а для кого в туториале написано, а?
# // Отменяем редирект после отправки сообщения # $CI->pm->redirect = FALSE;
inetlover inetlover time 17:12 ← 26 ноября 2010 #
О, спасибо! Пошел пробовать.
inetlover inetlover time 21:36 ← 26 ноября 2010 #
Каюсь, сам не понимаю как я очевидное не увидел.

Внес изменения — все работает! Но, как всегда появилась еще одна маленькая фигня.

Под сообщением об отправленном письме подгружается вновь таже форма.

Пытался отрезать эту форму break;, куда я его только не подставлял — все тщетно.

Правда, придумал два фиговых варианта для решения проблемы, которые работают:

1. Подгружать заранее заготовленный шаблон
$CI->output->_display($CI->_template('feedback feedback',$result,TRUE)); exit(); break; Вывод:Получается очень громоздко

2. Сделать функцию которая показывает страницу с сообщением об отправке, и делать редирект на нее.
Вывод:Появляется дополнительная по сути не нужная страница.

Может есть нормальное решение этой проблемы?
Автор
admin admin time 00:10 ← 27 ноября 2010 #
Не совсем понял суть проблемы. Ты редиректь после этого.
$CI->pm->redirect = l('/some_page');
inetlover inetlover time 00:28 ← 27 ноября 2010 #
Выложу свою функцию, правда пока она не доведена до ума, но может она, что-то прояснит.

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(); }
inetlover inetlover time 00:32 ← 27 ноября 2010 #
Проблема в 25 строке, после нее, надо что-то поставить, что бы форма feedback заново не подгружалась.
Автор
admin admin time 00:52 ← 27 ноября 2010 #
Все проще простого.
if($result){ ... } else { $this->form->compile(); }
inetlover inetlover time 01:40 ← 27 ноября 2010 #
Ух, ты — гениально! :-) Спасибо!

Пошел доделывать шестеренку.
inetlover inetlover time 22:57 ← 27 ноября 2010 #
// Берем сущность CodeIgniter
$CI =& get_instance();

Давно мучает вопрос, чем отличается $CI от $this?

Заметил, что $this употребляется в файлах index.php, _admin.php, а также в файлах из папки library. А $CI в хуках, модулях.

Почему не используется, что-то одно?
Автор
admin admin time 23:52 ← 27 ноября 2010 #
По факту — ничем. $this — это обращение к объекту изнутри, а когда объекта нет (хуки — простые функции), то мы вызываем $CI. Поскольку контроллер и модель наследуются от $CI, то они равнозначны.
inetlover inetlover time 01:10 ← 28 ноября 2010 #
Понял, спасибо!
inetlover inetlover time 22:26 ← 05 января 2011 #
В приветственном сообщении обнаружилась орфографическая ошибка.
Написано: прийдется, где й — лишняя.