use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\MaskedInput;
<code lang="html">
<div class="form">
<div class="form__wrap">
<div class="form__close">×</div>
<h2 class="form__title">Заполните анкету</h2>
<?php
// Начало ActiveForm
$form = ActiveForm::begin([
'enableAjaxValidation' => false,
'id' => 'sendcheck',
'method' => 'POST',
'action' => ['site/entry'],
])
?>
// остальной код
<div class="form__recaptcha">
<?= $form->field($model, 'reCaptcha')->widget(\himiklab\yii2\recaptcha\ReCaptcha2::class, ['siteKey' => '6LdvXFAqAAAAA-XXXXXXXXXX'])-> label(false) ?>
</div>
<div class="form__button">
<?= Html::submitButton('Отправить') ?>
</div>
<!-- // Конец ActiveForm -->
<?php ActiveForm::end(); ?>
</div>
</div>
<div class="sent">
<div class="sent__close">×</div>
<div class="sent__label">
<h2 class="sent__title">Ваша анкета <br> успешно отправлена!</h2>
</div>
</div>
</code>
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class EntryForm extends Model
{
public $fio; // Полное имя
public $city; // Город
public $phone; // Номер телефона
public $consent; // Согласие на обработку персональных данных
public $reCaptcha; // reCAPTCHA
public function rules()
{
return [
// остальные правила для полей формы...
['reCaptcha', \himiklab\yii2\recaptcha\ReCaptchaValidator2::class, 'secret' => '6LdvXFAqAAAAALXXXXXXXXXXXX'], // Правило для проверки reCAPTCHA
];
}
public function attributeLabels()
{
return [
'fio' => 'ФИО',
'city' => 'Город (Населенный пункт)',
'phone' => 'Номер телефона',
];
}
}
<?php
namespace app\models;
use Yii;
use yii\db\ActiveRecord; // паттерн проектирования для взаимодействия с базой данных
// Модель для взаимодействия с базой данных(представляет таблицу entries в базе данных)
class Entry extends ActiveRecord
{
public static function tableName()
{
return 'entries'; // Название таблицы в базе данных
}
public function rules()
{
return [
[['fio', 'city', 'phone', 'consent',], 'required'],
['fio', 'string', 'max' => 25],
['city', 'string', 'max' => 42],
['phone', 'string', 'max' => 18],
['consent', 'boolean'],
// ['g-recaptcha-response', 'boolean'],
];
}
}
document.getElementById('sendcheck').addEventListener('submit', (e) => {
e.preventDefault();
// сбор данных формы
const formData = new FormData(e.target);
//получаем токен reСAPTCHA
const recaptchaResponse = grecaptcha.getResponse();
// Добавляем токен reCAPTCHA в formData
formData.append('g-recaptcha-response', recaptchaResponse);
// Проверяем, что токен reCAPTCHA не пустой
if (!recaptchaResponse) {
alert('Пожалуйста, подтвердите, что вы не робот.');
return;
}
//ссылка на сервер
const url = 'https://namedomen.ru/index.php?r=site/entry';
// Отправка данных через fetch
fetch(url, {
method: 'POST',
body: formData,
})
.then(response => response.json())
.then(data => {
if (data.success) {
// Показываем модальное окно, если success: true
document.querySelector('.sent').style.display = 'block';
} else {
console.error('Ошибка отправки данных:', data.message);
}
})
.catch(error => {
console.error('Ошибка', error);
})
})
<?php
namespace app\controllers;
use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\web\Response;
use yii\filters\VerbFilter;
// use app\models\LoginForm;
// use app\models\ContactForm;
use app\models\EntryForm; // модель формы валидации данных пользователя
use app\models\Entry; // модель для работы с базой данных
class SiteController extends Controller
{
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::class,
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::class,
'actions' => [
'logout' => ['post'],
],
],
];
}
/**
* {@inheritdoc}
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
/**
* Displays homepage.
*
* @return string
*/
public function actionIndex()
{
$model = new EntryForm();
return $this->render('index', ['model' => $model]);
}
public function actionEntry()
{
$model = new EntryForm();
// Код загружает данные формы, отправленные методом POST в модель и выполняет валидацию.
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
// Здесь получаем токен reCAPTCHA, который был отправлен с формой.
$recaptchaResponse = Yii::$app->request->post('g-recaptcha-response');
// проверка токена reCAPTCHA
$secret = '6LdvXFAqAAAAALXXXXXXXXXXX'; // указать секретный ключ
$response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret}&response={$recaptchaResponse}");
$responseKeys = json_decode($response, true);
// Проверка успешности проверки reCAPTCHA
if (intval($responseKeys["success"]) !== 1) {
return $this->asJson(['success' => false, 'message' => 'Ошибка валидации reCAPTCHA.']);
}
// Создаем новую запись в таблице entries
$entry = new Entry();
$entry->fio = $model->fio;
$entry->city = $model->city;
$entry->phone = $model->phone;
$entry->consent = $model->consent;
if ($entry->save()) {
// return $this->asJson(['success' => true, 'message' => 'Данные успешно сохранены.']);
return $this->render('index', ['model' => $model]);
// return $this->redirect(['site/entry']); // Перенаправление
} else {
// Yii::error($model->errors);
return $this->asJson(['success' => false, 'message' => 'Ошибка при сохранении данных.']);
// return $this->redirect(['site/entry']);
}
}
return $this->render('entry', ['model' => $model]);
}
$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'language' => 'ru-RU',
'aliases' => [
'@bower' => '@vendor/bower-asset',
'@npm' => '@vendor/npm-asset',
],
'components' => [
'reCaptcha' => [
'class' => 'himiklab\yii2\recaptcha\ReCaptcha',
'siteKey' => '6LdvXFAqAAAAAXXXXXXXX', // Замените на ваш ключ сайта
'secret' => '6LdvXFAqAAAAAXXXXXXXXX', // Замените на ваш секретный ключ
],
],
];