Модуль обратной связи для joomla
Очень часто в разрабатываемых сайтах на joomla, требуется форма обратной связи, и при этом такая форма нужна в самом простом ее виде: Имя, Email, Текст сообщения, и элементарная валидация полей на заполнение с помощю проверок на javascript.
Исходя из этого обстоятельства (что форма элементарная), я не заморачиваюсь с установкой навороченных модулей обратной связи сторонних разработчиков, которые грузят в документ кучу своих стилей и скриптов, которые зачастую конфликтуют со стандартной библиотекой mootools в joomla, и поэтому требуют доработки.
Нет я не против сторонних крутых модулей обратной связи, просто если в проекте предусмотрена элементарная форма обратной связи, без всевозможных капч и прочих рюшек, предлагаю использовать модуль обратной связи для joomla, который удовлетворит эти простые требования - отправка сообщения на email указанный в настройках модуля.
Безусловно вы сможете доработать этот модуль, добавить в него функционал, этот модуль по сути шаблон для доработки, и в данной статье я опишу как он работает используя стандартные функции joomla для отправки сообщений на email.
И так приступим к разработке модуля. За отправку почтовых сообщений в joomla отвечает метод sendMail() объекта JUtility, и для того чтобы воспользоватся этим методом для начала импортируем в модуль файл libraries/joomla/utilities/utility.php, следующим образом:
- <?php
- jimport('joomla.utilities.utility');
- ?>
Этот файл содержит нужный нам класс JUtility, и содержит нужный нам метод отправки сообщения sendMail(), который выглядит следующим образом:
- <?php
- function sendMail($from, $fromname, $recipient, $subject, $body, $mode=0, $cc=null, $bcc=null, $attachment=null, $replyto=null, $replytoname=null )
- {
- // Get a JMail instance
- $mail =& JFactory::getMailer();
- $mail->setSubject($subject);
- $mail->setBody($body);
- // Are we sending the email as HTML?
- if ( $mode ) {
- $mail->IsHTML(true);
- }
- $mail->addRecipient($recipient);
- $mail->addCC($cc);
- $mail->addBCC($bcc);
- $mail->addAttachment($attachment);
- // Take care of reply email addresses
- for ( $i=0; $i < $numReplyTo; $i++){
- }
- }
- return $mail->Send();
- }
- ?>
Функция sendMail принимает следующие параметры:
- $from - адрес отправителя
- $fromname - имя отправителя
- $recipient - адрес электронной почты получателя
- $subject - тема сообщения электронной почты
- $body - тело письма
- $mode - режим или формат сообщения, предполагает три параметра false = plain text, true = HTML, 0 - по дефолту
- $cc - CC коды в письме, дефолтное значение: null
- $bcc - BB коды в письме, дефолтное значение: null
- $attachment - имена файлов прикрепленных к письму
- $replyto - email адрес на который будет отправлен ответ
- $replytoname - имя получателя ответа на сообщение
Возвращает функция sendMail, при успешной отправки сообщения 1, а при неудачной отправки логическое false
Фронтэнд модуля, который видит пользователь (форма обратной связи), включает в себя следующую HTML разметку:
- <div class="cont-form <?php echo $params->get('moduleclass_sfx'); ?>">
- <form id="contact" action="" method="post">
- <p><input id="name" class="txt" type="text" name="name" value="Имя" onBlur="if(this.value=='') this.value='Имя';" onFocus="if(this.value=='Имя') this.value='';"/></p>
- <p><input id="phone" class="txt" type="text" name="phone" value="Телефон" onBlur="if(this.value=='') this.value='Телефон';" onFocus="if(this.value=='Телефон') this.value='';"/></p>
- <p><input id="email" class="txt" type="text" name="email" value="Email" onBlur="if(this.value=='') this.value='Email';" onFocus="if(this.value=='Email') this.value='';"/></p>
- <p><textarea onBlur="if(this.value=='') this.value='Сообщение';" onFocus="if(this.value=='Сообщение') this.value='';" id="mess" class="txt" name="mess" rows="" cols="">Сообщение</textarea></p>
- <input type="hidden" name="send" value="1"/>
- <p><input id="get" type="button" value="Отправить"/></p>
- <p class="cb"></p>
- </form>
- </div>
А сама логика модуля обратной связи, которая выполняет прием данных отправленных из формы, и передачу их в функцию sendMail, а также вывод сообщения пользователю о том что сообщение успешно отправлено, выглядит следующим образом:
- <?php
- //get data fields form
- $from = JRequest::getVar('email', 'Email не указан');
- $fromname = JRequest::getVar('name', 'Имя не указано');
- $phone = JRequest::getVar('phone', 'Номер не указан');
- $comment = JRequest::getVar('mess', 'Текст сообщения не указан');
- $replyto = $from;
- $replytoname = $fromname;
- //get var setting module
- $recipient = $params->get('recipient');
- $subject = $params->get('subject');
- if($from!='' && $fromname!='' && $comment!='' && $phone!=''){
- //create body
- $body = "Имя: ".$fromname."\r\n".
- "Email: ".$from."\r\n".
- "Телефон: ".$phone."\r\n".
- "Текст сообщения:\r\n".$comment;
- // Get a JMail instance
- $mail = new JUtility();
- //initialize function sendMail
- $send = $mail->sendMail($from, $fromname, $recipient, $subject, $body, 0, null, null, null, $replyto, $replytoname);
- if($send==1){ //if true send mail
- }else{ //if error send mail
- }
- }
- ?>
Из комментариев в коде думаю будет понятно что выполняется прием данных из переменных $_GET или $_POST (в зависимости от того что будет в атрибуте method формы обратной связи, я рекомендую использовать POST), затем получаем значения из настроек модуля (которые введет администратор). После чего проверяются значения из формы на то что они не пусты и содержат данные, и если все ок, то инициализируется функция sendMail, с передачей ей всех необходимых параметров. Далее идет условие что если переменная $send равна единице то выводим сообщение "Спасибо за ваше сообщение!", иначе "Ошибка отправки сообщения!" (Сообщения можно изменить в настройках модуля).
Параметры которые будет вводить администратор в настройках модуля это "recipient" - email на который будет высылаться сообщения и "subject" - тема сообщения. Поля в админке модуля формируются в установочном файле модуля "mod_sendmail.xml" и выглядят следующим образом:
- <params>
- <param name="moduleclass_sfx" type="text" default="" label="Module Class Suffix" description="PARAMMODULECLASSSUFFIX" />
- <param name="recipient" type="text" default="" label="E-mail получателя" description="PARAMMODULEEMAIL" />
- <param name="subject" type="text" default="" label="Тема" description="PARAMMODULESUBJECT" />
- </params>
- <params group="advanced">
- <param name="sendtrue" type="textarea" class="inputbox"
- rows="5"
- cols="50"
- label="Сообщение об успешной отправке: "
- description="Сообщение об успешной отправке"
- default="Спасибо за ваше сообщение!" />
- <param name="sendfalse" type="textarea" class="inputbox"
- rows="5"
- cols="50"
- label="Сообщение об неудачной отправке: "
- description="Сообщение об неудачной отправке"
- default="Ошибка отправки сообщения!" />
- </params>
Подробнее о том как писать модуль и указивать параметры настроек вы можете узнать из статьи: Создание MVC модуля для Joomla 1.5!
Полностью логика модуля выглядит следующим образом:
- <?php
- /**
- * @version $Id: default.php 502 2011-11-3 10:25:42Z cleverscript $
- * @package mod_sendmail
- * @author Cleverscript http://www.cleverscript.ru
- * @copyright Copyright (c) 2008 - 2011 Cleverscript, a business unit of Nuevvo Webware Ltd. All rights reserved.
- * @license GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
- */
- jimport( 'joomla.application.module.helper' );
- jimport('joomla.utilities.utility');
- ?>
- <?php
- if(JRequest::getVar('send')!=1){
- ?>
- <div class="cont-form <?php echo $params->get('moduleclass_sfx'); ?>">
- <form id="contact" action="" method="post">
- <p><input id="name" class="txt" type="text" name="name" value="Имя" onBlur="if(this.value=='') this.value='Имя';" onFocus="if(this.value=='Имя') this.value='';"/></p>
- <p><input id="phone" class="txt" type="text" name="phone" value="Телефон" onBlur="if(this.value=='') this.value='Телефон';" onFocus="if(this.value=='Телефон') this.value='';"/></p>
- <p><input id="email" class="txt" type="text" name="email" value="Email" onBlur="if(this.value=='') this.value='Email';" onFocus="if(this.value=='Email') this.value='';"/></p>
- <p><textarea onBlur="if(this.value=='') this.value='Сообщение';" onFocus="if(this.value=='Сообщение') this.value='';" id="mess" class="txt" name="mess" rows="" cols="">Сообщение</textarea></p>
- <input type="hidden" name="send" value="1"/>
- <p><input id="get" type="button" value="Отправить"/></p>
- <p class="cb"></p>
- </form>
- </div>
- <?php }else{
- //get data fields form
- $from = JRequest::getVar('email', 'Email не указан');
- $fromname = JRequest::getVar('name', 'Имя не указано');
- $phone = JRequest::getVar('phone', 'Номер не указан');
- $comment = JRequest::getVar('mess', 'Текст сообщения не указан');
- $replyto = $from;
- $replytoname = $fromname;
- //get var setting module
- $recipient = $params->get('recipient');
- $subject = $params->get('subject');
- if($from!='' && $fromname!='' && $comment!='' && $phone!=''){
- //create body
- $body = "Имя: ".$fromname."\r\n".
- "Email: ".$from."\r\n".
- "Телефон: ".$phone."\r\n".
- "Текст сообщения:\r\n".$comment;
- // Get a JMail instance
- $mail = new JUtility();
- //initialize function sendMail
- $send = $mail->sendMail($from, $fromname, $recipient, $subject, $body, 0, null, null, null, $replyto, $replytoname);
- if($send==1){ //if true send mail
- }else{ //if error send mail
- }
- }
- }
- ?>
То-есть если форма еще не отправлена (JRequest::getVar('send')!=1), то выводим ее, иначе выполняем отправку сообщения и вывод сообщения пользователю. Данный модуль написан под joomla 1.5, в дальнейшем будет описан модуль для версии 1.7. Также модуль включает в себя элементарную проверку на заполнение полей на Javacript с использованием библиотеки Mootools:
- window.addEvent('domready', function(){
- $('get').addEvent('click', function(){
- if($('name').value=='Имя' || $('name').value.length<3){
- $('name').addClass('err');
- alert('Не заполнено поле "Имя"');
- }
- else if($('phone').value=='Телефон' || $('phone').value.length<3){
- $('phone').addClass('err');
- alert('Не заполнено поле "Телефон"');
- }
- else if($('email').value=='Email' || $('email').value.length<3){
- $('email').addClass('err');
- alert('Не заполнено поле "Email"');
- }
- else if($('mess').value=='Сообщение' || $('mess').value.length<3){
- $('mess').addClass('err');
- alert('Не заполнено поле "Сообщение"');
- }
- else {
- $('contact').submit();
- }
- $$('.txt').each(function(el,i){
- el.addEvent('focus', function(){
- el.removeClass('err');
- });
- });
- });
- });
Скачать установочный модуль можно по ссылке: mod_sendmail.zip
PS. Читайте последние записи RSS Подписка на RSS

Комментарии
Попробуйте включить максимальный вывод сообщений об ошибках в joomla, и посмотреть, я этот модуль неоднократно использовал в проектах, также убедитесь что на сервере поддерживается функция mail() - для отправки почты.
Хотя можно сделать проверку, и если пользователь не авторизован то выводить поля для имени и почты, а если нет то брать из сессии.
Соглашусь с этим, но цель поста была показать простейший пример, на основе которого уже можно развернуть более сложный модуль, который требуется для конкретного проекта.
Спасибо за предложение!
если включен mootools, и например выпадающее меню на js, то меню работать не будет. Причина в том, что после отправки пропадает $('get'), т.е. пропадает блок с id=get.
решенеи простое заключить обрботчик клика get, в if($('get')){ }
oopseek.com (позиция для модуля выводится во всплывающем окне с применением только css и html, стрелка слева fixed...)