Модуль обратной связи для 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

 

Метки:

Комментарии 

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

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

 

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

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

 

 
 
anonim Пятница, 20 Январь 2012

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

 

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

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

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

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

 

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

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

 

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

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

 

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

good

 

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

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

 

 
 
anonim Четверг, 14 Июнь 2012

Все просто, устанавливаешь этот модуль, копируешь файлы к модуль под джумла 1.6 в папку с установленным и все, работает, даже на 2.5

 

 
 
anonim Вторник, 28 Август 2012

модуль классный, но вот нет проверки корректности email
подскажите пожалуйста как её добавить в модуль
нашел регулярное выражение для проверки "/^\w+([\.-]?\w+)*@(((([a-z0-9]{2,})|([a-z0-9][-][a-z0-9]+))[\.][a-z0-9])|([a-z0-9]+[-]?))+[a-z0-9]+\.([a-z]{2}|(com|net| org|edu|int|mil |gov|arpa|biz|a ero|name|coop|i nfo|pro|museum) )$/i", а привентить не получилось, ибо познания на данный момент в java и php очень посредственные

 

 
 
anonim Среда, 29 Август 2012

window.addEvent('domready', function(){
if($('get')){
$('get').addEvent('click', function(){

var reg= new RegExp("[0-9a-z_]+@[0-9a-z_^.]+\\.[a-z]{2,3}", 'i')

if($('name').value=='Имя' || $('name').value.length

 

 
 
anonim Суббота, 19 Октябрь 2013

Здравствуйте! Установила Вашу форму обр связи к себе на сайт. E-mail получателя вписала свою почту. Сама по себе форма работает вроде корректно, но письма мне на почту не приходят почему-то...
Ссылка вот: http://www.ask4style.ru/how-to-save-money/webinar1.html

Вы не могли бы помочь мне разобраться? С уважением, Ксения

 

 
 
anonim Вторник, 22 Октябрь 2013

Здравствуйте, Ксения проверьте спам, возможно письма попадают в него?

 

 

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