Модуль обратной связи для 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, большое спасибо за комментарий, ошибку исправил.

 

 
 
tolinakopa Среда, 29 Февраль 2012

good

 

 
 
chakivetal Воскресенье, 25 Март 2012

Не отправляется(( Ошибок не выдает, проверил ошибку замеченную alexgl2004 - исправлена, jq на странице не мало. При нажатии кнопки ничего не происходит, даже без заполнения... Что за беда?
oopseek.com (позиция для модуля выводится во всплывающем окне с применением только css и html, стрелка слева fixed...)

 

 

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