Делаем форму обратной связи с капчей
Очень не хватает в бесплатной версии формы обратной связи, ведь если вы открыты для общения и ваш сайт сделан для посетителей, а не роботов, то рано или поздно кто-то из посетителей захочет с вами связаться. Да и если ваш сайт, сайт организации или фирмы, то вы обязательно рассчитываете на общение со своим посетителем. А как ему это сделать? Ну не писать, в самом деле, свой E-mail на самом видном месте, да и на всякий случай от спама защитится, не мешает. Вот давайте эту форму обратной связи и сделаем, точнее страницу для контактов, если у вас сайт организации. Как выглядит данная форма, вы можете увидеть на вкладке Контакты этого сайта. А ещё мне не понятно, почему разработчики скрипта зажали эту функцию. Нет, конечно, я понимаю, что они хотят получить оплату за свою работу, но данная функция, на просторах интернета сто раз уже описана и разжевана. Раньше я вставлял форму в страницу и передавал выполнение на внешний файл, но мне такое решение кажется не очень элегантным.
А так как я вожусь с этим скриптом давно, пришло и решение. Вот почему, прежде чем дать готовое решение я стараюсь с начала написать предпосылки, надеясь, что они приведут вас к освоению данной системы управления сайтом и расширению её функционала.
В файл соответствующего языка, для русского это lang /ru.php добавим переменные:
$lang['Feedback_page']= "Страница обратной связи";
$lang['Website_email']= "Email сайта";
$lang['Email']= "Ваш Email";
$lang['Contents_letter']= "Ваше сообщение";
$lang['Subject']= "Тема";
$lang['Captcha_code']= "Код проверки";
$lang['send']= "Отправить";
$lang['Your_message_is_sent']= "Ваше сообщение отправлено";
$lang['Мessage _send_error'] = "Произошла ошибка при отправке сообщения";
После:
// plugins
В файл templates/messages.tpl добавим, что будет выводиться при отправке сообщения или ошибке:
<!-- BEGIN FEEDBACK_OK -->
<div class="message" id="ok">
<h3>$lang[Your_message_is_sent]</h3>
</div>
<!-- END FEEDBACK_OK -->
<!-- BEGIN FEEDBACK_NO -->
<div class="message" id="error">
<h3>$lang['Мessage _send_error']<br />
<a href="javascript:history.back();">« $lang['back']</a>
</h3>
</div>
<!-- END FEEDBACK_NO -->
Капчу для этого дополнения мы будем использовать с проекта www.captcha.ru, не люблю я велосипеды изобретать.
Поместим папку с нашей капчей в папку plugins скрипта, теперь нам её надо подключить (с настройками самой капчи вы я думаю, разберётесь – там очень всё подробно).
Подключить капчу нам надо до старта сессии, для этого в файле index.php поместим следующую строку :
require_once DIR_PLUGINS.'kcaptcha/kcaptcha.php';
перед:
session_start( );
Всё капчу мы подключили, теперь пойдём дальше.
Переменную, отвечающую за соответствие странице выводимого нами кода, мы будем хранить в файле config/lang_ru.php, а для другого языка в соответствующем файле. Откроем файл и вставим нашу переменную:
$config['feedback_page'] = 2;
$config['feedback_email'] = "1@1.ru";
Перед:
$aMenuTypes[1]
Выбор нашей страницы обратной связи из административной части скрипта, будет находиться в установках на вкладке страницы, за отображение установок и вкладок отвечает файл templates/admin/settings.tpl, откроем его и вставим:
<tr>
<td>$lang[Feedback_page]</td>
<td>
<select name="feedback_page">
<option value="">$lang['none']</option>
$sFeedbackPageSelect
</select>
</td>
</tr>
Перед:
<!-- tab pages -->
А после:
<!-- pass end -->
Вставим
<!-- feedback start -->
<tr class="l1">
<th>
$lang[Website_email]
</th>
<td>
<input type="text" name="feedback_email" value="$config[feedback_email]" class="input" size="40" alt="feedbackemail" />
</td>
</tr>
<!-- feedback end -->
Откроем файл actions_admin/settings.php и вставим:
$sFeedbackPageSelect = $oPage->throwPagesSelectAdmin( $config['feedback_page'] );
После:
$sWysiwygSelect = throwTrueFalseSelect( $config['wysiwyg'] );
Теперь нам осталось сделать функцию отображения нашей формы обратной связи в клиентской части.
Открываем файл actions_client/p.php и вставляем:
if( isset( $config['feedback_page'] ) && is_numeric( $config['feedback_page'] ) && $iContent == $config['feedback_page'] ){
$sFeedback = isset( $_POST['sSend'] ) ? mailFeedbac ( $_POST ): $oTpl->tbHtml( $aData['sTemplate'], 'FEEDBACK' );
}
else{
$sFeedback = null;
}
После:
$aData['sDescriptionFull'] = $aData['sDescriptionShort'];
Далее открываем файл templates/pages_default.tpl и вставляем переменную, в которую будет передаваться форма обратной связи.
$sFeedback
После:
<h3>$aData[sName]</h3>
А так же вставить после:
<!-- END BANNER -->
Форму обратной связи
<!-- BEGIN FEEDBACK -->
<script type="text/javascript" src="$config[dir_core]checkForm.js"></script>
<form action="$aData[sLinkName]" method="post" onsubmit="return checkForm( this );" id="Feedback">
<fieldset>
<input type="hidden" name="sSend" value="" />
<label for="contactName">$lang[Name]:</label><br>
<input type="text" name="sName" class="input" alt="simple" /><br><br />
<label for="contactEmail">$lang[Email]:</label><br>
<input type="text" name="sMailer" class="input" alt="email" /><br> <br />
<label for="contactTopic">$lang[Subject]:</label><br>
<input type="text" name="sSubject" class="input" alt="simple" /><br><br />
<label for="contactContent">$lang[Contents_letter]:</label><br>
<textarea cols="25" rows="8" name="sContentsLetter" title="simple" /></textarea><br><br />
<img src="plugins/kcaptcha? $session_name=$session_id"/> <br /><br />
<label for="contactContent">$lang[Captcha_code]:</label><br />
<input type="text" name="keystring" class="input" alt="simple" id="keystring" /> <br /><br /><br />
<input type="submit" value="$lang[send]" class="submit" id="submitt" />
</fieldset>
</form>
<!-- END FEEDBACK -->
Теперь нам остаётся вставить в файл core/common.php практически стандартную функцию обратной связи (проверка заполнения формы, правильность написания Email, проверка капчи и формирование заголовка письма) :
/**mailFeedbac
* Функция проверки написания мыла
* Функция отправки мыла
*/
function mailFeedbac ( $aForm, $sFile = 'messages.tpl', $sFeedbackmail = null ){
extract( $aForm );
$oTpl =& TplParser::getInstance( );
if( !empty( $sSubject ) && !empty( $sContentsLetter ) && checkEmail( $sMailer ) === 1 ){
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring']){
if( !isset( $sFeedbackmail ) )
$sFeedbackmail = $GLOBALS['config']['feedback_email'];
$sName = "=?".$GLOBALS['config']['charset']."?B?".base64_encode( $sName )."?=";
$headers = "MIME-Version: 1.0rn";
$headers .= "Content-Type: text/plain; charset=".$GLOBALS['config']['charset']."rn";
$headers .= "Date: ".date('r', time())."rn";
$headers .= "From: "".$sName."" <".$sMailer.">rn";
$headers .= "X-Mailer: Quick.Cms.Lite Send E-mailrn";
mail($sFeedbackmail,$sSubject,$sContentsLetter,$headers);
unset($_SESSION['captcha_keystring']);
return $oTpl->tbHtml( $sFile, 'FEEDBACK_OK' );
}
else{
return $oTpl->tbHtml( $sFile, 'FEEDBACK_NO' );
}
}
}
function checkEmail( $sEmail ){
return preg_match( "/^[a-z0-9_.-]+([_.-][a-z0-9]+)*@([a-z0-9_.-]+([.][a-z]{2,4}))+$/i", $sEmail );
} // Конец функции обратной связи
Вставляем после:
// end function displayDate
Теперь можем заняться оформлением нашей формы обратной связи, для этого в файл стилей templates/plugins.css после:
/*
Quick.Cms default plugins stylesheet
/*/
Вставим:
#Feedback{float: left;width:195px;margin: 0px 15px 10px 5px;}
#Feedback .input,#Feedback textarea{width:180px;font-size:1em;
padding: 5px;
border: solid 1px #E5E5E5;
outline: 0;
background: #FFFFFF url('bg_form.png') left top repeat-x;
background: -webkit-gradient(linear, left top, left 25, from(#FFFFFF), color-stop(4%, #EEEEEE), to(#FFFFFF));
background: -moz-linear-gradient(top, #FFFFFF, #EEEEEE 1px, #FFFFFF 25px);
box-shadow: rgba(0,0,0, 0.1) 0px 0px 8px;
-moz-box-shadow: rgba(0,0,0, 0.1) 0px 0px 8px;
-webkit-box-shadow: rgba(0,0,0, 0.1) 0px 0px 8px;
}
#Feedback .input:focus, #contactPanel textarea:focus {border-color: #C9C9C9;-webkit-box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 8px; }
#Feedback .submit {width: auto;padding: 9px 15px;background: #586c89;border: 0;font-size: 14px;color: #FFFFFF;-moz-border-radius: 5px;-webkit-border-radius: 5px;}
mail.txt, Страница с кодом в текстовом формате