Очень часто в разрабатываемых сайтах на joomla, требуется форма обратной связи, и при этом такая форма нужна в самом простом ее виде: Имя, Email, Текст сообщения, и элементарная валидация полей на заполнение с помощю проверок на javascript.
Исходя из этого обстоятельства (что форма элементарная), я не заморачиваюсь с установкой навороченных модулей обратной связи сторонних разработчиков, которые грузят в документ кучу своих стилей и скриптов, которые зачастую конфликтуют со стандартной библиотекой mootools в joomla, и поэтому требуют доработки.
Нет я не против сторонних крутых модулей обратной связи, просто если в проекте предусмотрена элементарная форма обратной связи, без всевозможных капч и прочих рюшек, предлагаю использовать модуль обратной связи для joomla, который удовлетворит эти простые требования - отправка сообщения на email указанный в настройках модуля.
Безусловно вы сможете доработать этот модуль, добавить в него функционал, этот модуль по сути шаблон для доработки, и в данной статье я опишу как он работает используя стандартные функции joomla для отправки сообщений на email.
И так приступим к разработке модуля. За отправку почтовых сообщений в joomla отвечает метод sendMail() объекта JUtility, и для того чтобы воспользоватся этим методом для начала импортируем в модуль файл libraries/joomla/utilities/utility.php, следующим образом:
Фронтэнд модуля, который видит пользователь (форма обратной связи), включает в себя следующую HTML разметку:
Исходя из этого обстоятельства (что форма элементарная), я не заморачиваюсь с установкой навороченных модулей обратной связи сторонних разработчиков, которые грузят в документ кучу своих стилей и скриптов, которые зачастую конфликтуют со стандартной библиотекой mootools в joomla, и поэтому требуют доработки.
Нет я не против сторонних крутых модулей обратной связи, просто если в проекте предусмотрена элементарная форма обратной связи, без всевозможных капч и прочих рюшек, предлагаю использовать модуль обратной связи для joomla, который удовлетворит эти простые требования - отправка сообщения на email указанный в настройках модуля.
Безусловно вы сможете доработать этот модуль, добавить в него функционал, этот модуль по сути шаблон для доработки, и в данной статье я опишу как он работает используя стандартные функции joomla для отправки сообщений на email.
И так приступим к разработке модуля. За отправку почтовых сообщений в joomla отвечает метод sendMail() объекта JUtility, и для того чтобы воспользоватся этим методом для начала импортируем в модуль файл libraries/joomla/utilities/utility.php, следующим образом:
- <?php
- jimport('joomla.utilities.utility');
- ?>
- Этот файл содержит нужный нам класс JUtility, и содержит нужный нам метод отправки сообщения sendMail(), который выглядит следующим образом: <?phpfunction 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 addressesfor ( $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 - имя получателя ответа на сообщение
Фронтэнд модуля, который видит пользователь (форма обратной связи), включает в себя следующую 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" и выглядят следующим образом:
Полностью логика модуля выглядит следующим образом:
То-есть если форма еще не отправлена (JRequest::getVar('send')!=1), то выводим ее, иначе выполняем отправку сообщения и вывод сообщения пользователю. Данный модуль написан под joomla 1.5, в дальнейшем будет описан модуль для версии 1.7. Также модуль включает в себя элементарную проверку на заполнение полей на Javacript с использованием библиотеки Mootools:
Скачать установочный модуль можно по ссылке: http://cleverscript.ru/demo/cms/joomla/modules/mod_sendmail.zip
Параметры которые будет вводить администратор в настройках модуля это "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
*/
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
}
}
}
?>
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');
});
});
});
});
Комментариев нет:
Отправить комментарий