Модуль обратной связи для joomla

Четверг, 10 Ноябрь 2011

 

Очень часто в разрабатываемых сайтах на 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->setSender(array($from, $fromname));
  • $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
  • if( is_array( $replyto ) ) {
  • $numReplyTo = count($replyto);
  • for ( $i=0; $i < $numReplyTo; $i++){
  • $mail->addReplyTo( array($replyto[$i], $replytoname[$i]) );
  • }
  • }elseif( isset( $replyto ) ) {
  • $mail->addReplyTo( array( $replyto, $replytoname ) );
  • }
  •  
  • return $mail->Send();
  • }
  • ?>
  •  

 

Функция sendMail принимает следующие параметры:

 

Возвращает функция 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
  • echo $params->get('sendtrue');
  • }else{ //if error send mail
  • echo $params->get('sendfalse');
  • }
  • }
  • ?>
  •  

 

Из комментариев в коде думаю будет понятно что выполняется прием данных из переменных $_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
  • */
  • defined('_JEXEC') or die('Restricted access');
  • 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
  • echo $params->get('sendtrue');
  • }else{ //if error send mail
  • echo $params->get('sendfalse');
  • }
  • }
  • }
  • ?>
  •  

 

То-есть если форма еще не отправлена (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

 

Метки:

Комментарии 

 
Сергей Четверг, 15 Декабрь 2011

Письма не отправляются

 

 
 
cleverscript Суббота, 24 Декабрь 2011

Сергей,
Попробуйте включить максимальный вывод сообщений об ошибках в joomla, и посмотреть, я этот модуль неоднократно использовал в проектах, также убедитесь что на сервере поддерживается функция mail() - для отправки почты.

 

 
 
dr.Griffin Пятница, 20 Январь 2012

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

 

 
 
cleverscript Среда, 25 Январь 2012

Да возможно, но не на всех проектах предусматривает ся регистрация пользователей.
Хотя можно сделать проверку, и если пользователь не авторизован то выводить поля для имени и почты, а если нет то брать из сессии.

Соглашусь с этим, но цель поста была показать простейший пример, на основе которого уже можно развернуть более сложный модуль, который требуется для конкретного проекта.

Спасибо за предложение!

 

 
 
alexgl2004 Пятница, 03 Февраль 2012

есть ошибка в модуле в файле validate.js
если включен mootools, и например выпадающее меню на js, то меню работать не будет. Причина в том, что после отправки пропадает $('get'), т.е. пропадает блок с id=get.
решенеи простое заключить обрботчик клика get, в if($('get')){ }

 

 
 
cleverscript Суббота, 18 Февраль 2012

alexgl2004, большое спасибо за комментарий, ошибку исправил.

 

 

Добавить комментарий