Поиск по этому блогу

воскресенье, 13 ноября 2011 г.

Модуль обратной связи для 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->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 принимает следующие параметры: 
  • $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
  • 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>
  • Полностью логика модуля выглядит следующим образом: 
  • <?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');
  • });
  • });
  • });
  • });
  • Скачать установочный модуль можно по ссылке: http://cleverscript.ru/demo/cms/joomla/modules/mod_sendmail.zip
  • Комментариев нет:

    Отправить комментарий