HOSTCMS v.6. Внедрение в макет кода формы с reCaptcha

Хочу поделиться с вами кодом, который размещается в макете страницы и подгружает в нее форму с reCaptcha.
Для использования этого кода у вас должна быть редакция HostCMS, как минимум "Малый Бизнес". Также, через аккаунт Google, получите код reCaptcha для своего домена, сохраните ключи и ссылку на скрипт recaptcha.js
1. Для начала создаете в админпанели форму с нужными полями/
2. Подключаете в head скрипт API reCaptcha
<script type="text/javascript" src='https://www.google.com/recaptcha/api.js'></script>
3. В XSL шаблоне вывода формы, в месте, где хотите показать reCaptcha, размещаете это код:
<div class="g-recaptcha" data-sitekey="6LeQXykUlq519d56878"></div>
4. В коде макета страницы размещаете php код, показанный ниже, с обработчиком формы и reCaptha. Читайте внимательно комментарии в самом коде и выполните то, что в них указано.
<?php // add ФОРМА БЫСТРОГО ЗАКАЗА $oForm = Core_Entity::factory('Form', 4); // Заменить на id своей формы $Form_Controller_Show = new Form_Controller_Show($oForm); $sSecretKey = "6LeQAAAAAGKJrNNXLPZ94QcuJEy"; // Указывается секретный ключ reCAPTCHA if (!is_null(Core_Array::getPost($oForm->button_name))) {
//------------------ add recaptha if (Core_Array::getPost('g-recaptcha-response')) { $sResponse = Core_Array::getPost('g-recaptcha-response'); $sUrl = 'https://www.google.com/recaptcha/api/siteverify?secret='; . $sSecretKey . "&response=" . $sResponse; $aAnswer = json_decode(file_get_contents($sUrl), TRUE); if ($aAnswer['success']) { //------------------ end recaptha
$Form_Controller_Show ->values($_POST + $_FILES) // 0 - html, 1- plain text ->mailType(0) ->mailXsl( Core_Entity::factory('Xsl')->getByName('ПисьмоКураторуФормыВФорматеHTML') ) ->mailFromFieldName('pochta@yandex.en') ->process(); //Отправляем письмо-подтверждение пользователю $Form_Controller_Show1 = clone $Form_Controller_Show; $sEmail = Core_Array::get($Form_Controller_Show1->values, 'email'); if (Core_Valid::email($sEmail)){ ob_start(); $Form_Controller_Show1 ->xsl( Core_Entity::factory('Xsl')->getByName($Form_Controller_Show1->mailType == 0 ? 'ПисьмоПодтверждениеПользователюФормыВФорматеHTML' : 'ПисьмоПодтверждениеПользователюФормы') ); //->show() $sMailText = ob_get_clean(); if (mb_strpos($sMailText, 'ERROR TRUE') === FALSE){ $subject = 'Вами была заполнена форма Быстрого заказа на сайте site.en';// Темe письма отредактировать // При текстовой отправке нужно преобразовать HTML-сущности в символы $Form_Controller_Show->mailType == 1 && $sMailText = html_entity_decode(strip_tags($sMailText), ENT_COMPAT, 'UTF-8'); $oCore_Mail = Core_Mail::instance() ->to($sEmail) ->from(EMAIL_TO) ->subject($subject) ->message(trim($sMailText)) ->contentType($Form_Controller_Show->mailType == 0 ? 'text/html' : 'text/plain') ->header('X-HostCMS-Reason', 'Form'); // Массив содержащий пути прикрепленных файлов и их имена $aForm_Fields = $oForm->Form_Fields->findAll(); foreach ($aForm_Fields as $oForm_Field){ if ($oForm_Field->type == 2){// File $value = Core_Array::get($Form_Controller_Show->values, $oForm_Field->name); if (!is_null($value)){ if (is_array($value) && $value['size'] > 0){ $oForm_Fill_Fields = Core_Entity::factory('Form_Fill_Field'); $oForm_Fill_Fields->queryBuilder() ->where('form_field_id', '=', $oForm_Field->id) ->where('value', '=', $value['name']) ->limit(1); $aForm_Fill_Fields = $oForm_Fill_Fields->findAll(); if (isset($aForm_Fill_Fields[0])){ $oCore_Mail->attach(array( 'filepath' => $aForm_Fill_Fields[0]->getPath(), 'filename' => $value['name'] )); } } } } } $oCore_Mail->send(); } }
//-------------------------- add recaptha } else { Core_Log::instance()->clear() ->status(Core_Log::$ERROR) ->write('Google Recaptcha: ' . $aAnswer['error-codes'][0]); $Form_Controller_Show ->addEntity( Core::factory('Core_Xml_Entity') ->name('recaptcha_error')->value('1') // Добавляем в XML тег, чтобы затем обработать его в XSL шаблоне вывода формы, для показа сообщения о том, что reCaptcha не подтверждена ); } } else { $Form_Controller_Show ->addEntity( Core::factory('Core_Xml_Entity') ->name('recaptcha_error')->value('1') ); } //-------------------------- end recaptha
} $Form_Controller_Show ->xsl( Core_Entity::factory('Xsl')->getByName('ОтобразитьФормуБыстрыйЗаказ') // Заменить на свой XSL шаблон ) ->addEntity( Core::factory('Core_Xml_Entity') ->name('site_key')->value('6LeQXykABVxo0YpLcOUaswIFlq5') // Указываете ключ reCAPTCHA ) ->show(); ?>
5. В XSL шаблон вывода формы добавьте нижеприведенный код, чтобы обработать ошибку, если reCaptcha не пройдена
<xsl:when test="recaptcha_error = 1">
<div id="error"><div id="redirection"></div>Подтвердите, что вы не робот!</div>
</xsl:when>
