Рекапча в модалке

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
andriel
Сообщения: 24
Зарегистрирован: 2017.12.05, 17:32

Рекапча в модалке

Сообщение andriel » 2018.06.13, 20:22

Здравствуйте, форумчане!
Есть такая задачка, никак не могу решить...

Есть модель

Код: Выделить всё

<?php

namespace frontend\models;

use yii\base\Model;

class PsychologistForm extends Model
{
    public $name;
    public $phone;
    public $email;
    public $reCaptcha;

    public function rules()
    {
        return [
            [['name', 'phone', 'email'], 'required'],
            ['name', 'string'],
            ['email', 'email'],
            ['name', 'trim'],
            [['reCaptcha'], \himiklab\yii2\recaptcha\ReCaptchaValidator::className(), 'secret' => 'your secret key', 'uncheckedMessage' => 'Please confirm that you are not a bot.']

        ];
    }

    public function attributeLabels()
    {
        return [
            'name' => 'Имя',
            'phone' => 'Телефон',
            'email' => 'Ваш E-mail',
        ];
    }
}
А также вьюха

Код: Выделить всё

<?php

use yii\widgets\ActiveForm;
use yii\widgets\MaskedInput;

use frontend\models\PsychologistForm;

$model = new PsychologistForm();

?>
<div class="col-sm-6 col-md-4">

    <?php $form = ActiveForm::begin([
        'validateOnBlur' => false,
        'id' => 'psychologist-form',
        'action' => ['/site/psychologist-consultation/'],
        'errorCssClass' => 'error',
        'options' => [
            'class' => 'consultation'
        ]
    ]); ?>

    <p>Заказать консультацию психолога</p>

    <?= $form->field($model, 'name', ['template' => '{input}'])->textInput(['placeholder' => 'Имя'])->label(false) ?>

    <?= $form->field($model, 'email', ['template' => '{input}'])->textInput(['placeholder' => 'Ваш E-mail'])->label(false) ?>

    <?= $form->field($model, 'phone', ['template' => '{input}'])->widget(MaskedInput::className(), [
        'name' => 'phone',
        'mask' => '+9 (999) 999 9999',
    ])->input('tel', ['placeholder' => 'Телефон'])->label(false) ?>

    <!-- Button to Open the Modal -->
    <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">
        Open modal
    </button>

    <!-- The Modal -->
    <div class="modal" id="myModal">
        <div class="modal-dialog">
            <div class="modal-content">

                <!-- Modal Header -->
                <div class="modal-header">
                    <h4 class="modal-title">Modal Heading</h4>
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                </div>


                <!-- Modal body -->
                <div class="modal-body">
                    <?= $form->field($model, 'reCaptcha')->widget(
                        \himiklab\yii2\recaptcha\ReCaptcha::className(),
                        ['siteKey' => 'your siteKey']
                    ) ?>

                </div>

                <!-- Modal footer -->
                <div class="modal-footer">
                    <button type="submit">Заказать</button>
                </div>

            </div>
        </div>
    </div>


    <?php ActiveForm::end(); ?>

</div>
Так вот, необходимо сделать так, чтобы после заполнения обязательных полей ['name', 'phone', 'email'] открывалась модалка, в ней появилась рекапча. И только после прохождения рекапчи форма отправлялась.

Кнопка открытия модалки срабатывает всегда, а надо только после валидации обязательных полей

Аватара пользователя
Dominus
Сообщения: 626
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Рекапча в модалке

Сообщение Dominus » 2018.06.14, 17:09

Можно с использованием сценариев.
Model:

Код: Выделить всё

class PsychologistForm extends Model
{
    public $name;
    public $verifyCode;

    const SCENARIO_CAPTCHA = 'captcha';

    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // name are required
            [['name'], 'required'],
            // verifyCode needs to be entered correctly
            ['verifyCode', 'required', 'on' => self::SCENARIO_CAPTCHA],
            ['verifyCode', 'captcha', 'captchaAction' => \yii\helpers\Url::to(['/site/captcha']), 'on' => self::SCENARIO_CAPTCHA],            
            [['verifyCode'], 'safe'],
        ];
    }

    /**
     * @return array customized attribute labels
     */
    public function attributeLabels()
    {
        return [
            'name' => Yii::t('app', 'Name'),
            'verifyCode' => Yii::t('app', 'Verification Code'),
        ];
    }
}
View:

Код: Выделить всё

<?php
//...
$script = "
    $('#myModal').modal('toggle');
";
if ($model->scenario === $model::SCENARIO_CAPTCHA) {
    $this->registerJs($script);
} 
?>

<?php $form = ActiveForm::begin([
    'id' => 'psychologist-form'
]);?>

    <?= $form->field($model, 'name')->textInput([
        'autofocus' => true,
        'placeholder' => true
    ]) ?>
            
    <?php yii\bootstrap\Modal::begin([
        'id' => 'myModal',
        'header' => '<h2>Modal Heading</h2>',
        'closeButton' => false,
        'options' => [
            'data' => [
                'backdrop' => 'static',
                'keyboard' => 'false',
            ],
        ],
        'footer' => Html::submitButton('Заказать', ['class' => 'btn btn-primary']),
    ]); ?>

    <?= $form->field($model, 'verifyCode')->widget(yii\captcha\Captcha::class, [               
        'options' => [
            'placeholder' => true
        ],
    ]) ?>

    <?php yii\bootstrap\Modal::end(); ?>

    <div class="form-group">
        <?= Html::submitButton('Отправить', [
            'class' => 'btn btn-primary',
        ]) ?>
    </div>

<?php ActiveForm::end(); ?>
Controller:

Код: Выделить всё

class SiteController extends Controller
{
    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }
    
    /**
     * @return string|\yii\web\Response
     */
    public function actionPsychologistConsultation()
    {
        $model = new PsychologistForm();
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            if (!empty($model->verifyCode)) {
                // Капча пройдена, производим действия
                Yii::$app->session->setFlash('success', 'Данные приняты: ' . $model->name);
                return $this->refresh();
            } else {
                // Выводим капчу
                $model->scenario = $model::SCENARIO_CAPTCHA;
            }
        }
        return $this->render('form', [
            'model' => $model
        ]);
    }
}
Только стандартную капчу заменить на reCaptcha, как то так.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!

Ответить