Форма подписки

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Форма подписки

Сообщение iZacNT »

Доброго времени суток!

Сделал Виджет подписки:

в шаблоне:

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

<?
 echo \app\widgets\subscr::widget();
?>
Модель:

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

     */
    public static function tableName()
    {
        return 'subscription';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['email_subs'], 'unique'],
            [['email_subs'], 'email'],

            [['email_subs'], 'required'],
            [['ts_subs'], 'safe'],
            [['email_subs'], 'string', 'max' => 255],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id_subs' => Yii::t('app', 'Id Subs'),
            'email_subs' => Yii::t('app', 'Email'),
            'ts_subs' => Yii::t('app', 'Ts Subs'),
        ];
    }
}
Вмджет:

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

<?php


namespace app\widgets;

use yii\base\Widget;
use  app\common\Subscription;

class subscr extends Widget
{
    public $email_subs;
    public function init() {
        $this->email_subs = new subscription();
    }

    public function run()
    {
        return $this->render('subscription',[
            'model' => $this->email_subs,
        ]);

    }
}
Вид Виджета:

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

<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
use yii\widgets\Pjax;
?>
<?php Pjax::begin(); ?>
<div class="form-items-holder">
<? $form = ActiveForm::begin(['id' => 'subscript', 'action' => yii\helpers\Url::to(['app/subs']), 'options' => ['data' => ['pjax' => true] ] ]) ?>

<?= $form->field($model,'email_subs')->textInput()->label('E-mail'); ?>
<?= Html::input('submit','submit','Подписаться'); ?>

<?php ActiveForm::end(); ?>
</div>
<?php Pjax::end(); ?>

<div style="clear:both;"></div>
Контроллер:

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

  /*Подписка контроллер*/
    public function actionSubs()
    {
        $model = new Subscription();

        if ($model->load(Yii::$app->request->post()) && $model->validate()){
            $email_subs = Html::encode($model->email_subs);
            $model->email_subs = $email_subs;
            if ($model->save()) {
                Yii::$app->response->refresh(); //очистка данных из формы
                echo "<div class='alert alert-success' role='alert' style='align: center'>
                 <b>  Подписка оформлена!<b>
                </div>";

                exit;
            }
        } else {

            if(strpos($model->errors['email_subs'][0], 'уже занято') !== false) {
                echo "<div class='alert alert-danger' role='alert' aria-label='Close' style='width: 100%'>
                 <b style='color: #9E5645'>  Адрес ".$model->email_subs." уже подписан!</b>
                </div>
                ";
            }
        }
        exit;
    }

    /*Конец контроллера подписки*/

На Локальном сервере все работает отлично. Переношу на хостинг, Код не отробатывает, Точнее Если адрес не проходит валидацию, то правильно выдает соответсвующую ошибку.
Если проходит то данные не сохраняются в БД. В Дебаггере нет SQL запроса на обновление таблицы Подписки. т.е электронный адрес проходит Валидацию (проверил) но не отрабатывает if ($model->save()).
Версия ПХП 5,6.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Форма подписки

Сообщение yiijeka »

if ($model->save()) - запускает процесс валидации, $model->validate() второй раз. А перед save вы меняете email_subs , который скорее всего не проходит вторую валидацию. Чтобы отключить вторую валидацию, напишите if ($model->save(false))

Но даже в этом случае у вас $model->save(false)) может вернуть FALSE и if не отработает. А обработка этой ситуации у вас не предусмотрена, в результате - белый экран в браузере.

Ещё у вас в моделе в методе rules(), правила валидации не эффективно используются. Они выполняются сверху вниз, т.е. если мы уже проверили [['email_subs'], 'email'] и оно оказалось корректно, то мало смысла проверять далее [['email_subs'], 'required'] и [['email_subs'], 'string', 'max' => 255], Поменяйте порядок на - required, string, email, unique
iZacNT
Сообщения: 35
Зарегистрирован: 2019.07.09, 04:53

Re: Форма подписки

Сообщение iZacNT »

yiijeka писал(а): 2019.07.09, 08:25 Ещё у вас в моделе в методе rules(), правила валидации не эффективно используются. Они выполняются сверху вниз, т.е. если мы уже проверили [['email_subs'], 'email'] и оно оказалось корректно, то мало смысла проверять далее [['email_subs'], 'required'] и [['email_subs'], 'string', 'max' => 255], Поменяйте порядок на - required, string, email, unique
Спасибо Вам. Поправил.

Что косается $model->save(). Оказалось все гораздо проще. В БД. в ключевом поле ID я не сделал его Auto increment. и каждый раз добавляя строку в ID $model->save() пыталась вписать значение "0", А раз запись с таким ID уже существовала, соответственно метод возвращал ошибку
Ответить