@grippin

Почему проверка на duplicate не работает?

Написал функцию Subscribe. Но почему-то проверка не работает.
Мой Subscription Class:
public static function tableName()
    {
        return 'Subscription';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['email'], 'required'],
            [['email'], 'email'],
            [['email'], 'string', 'max' => 255],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'email' => 'Email',
        ];
    }

actionSubscribe:
public function actionSubscribe() {
        $model = new Subscription();
        if (Yii::$app->request->isAjax) {
            $model->load(Yii::$app->request->post());
            return ($model->validate() && $model->save()) ?
                Yii::t("contact", "Thank you. You'll get latest news") :
                Yii::t("common", "Error");
        }
        if (isset($_POST["email"])) {
            $result = null;
            $duplicate = Subscription::findOne(["email" => $_POST["email"]]);
            if ($duplicate)
                $result = ['status' => 0, "message" => Yii::t("common", "This email already subscribed to our news")];
            else {
                $model->email = $_POST["email"];
                if ($model->validate() && $model->save()) {
                    $result = ['status' => 1, "message" => Yii::t("common", "Successfully subscribed to our news")];
                }
            }
            return $result;
        }
    }
  • Вопрос задан
  • 166 просмотров
Пригласить эксперта
Ответы на вопрос 1
onqu
@onqu
weasy
Если это Yii2
1. Вы вызываете валидацию 2 раза каждый раз.

// первый
$model->validate()

// второй
$model->save()

Чтобы такого не было надо либо убрать прямой вызов validate, либо передавать false в вызов save.
if ($model->validate() && $model->save(false)) 
   ...


2. Нужно проверять, что вернул метод load
if ($model->load($request->post()) && $model->save()) {
    // сохранили и что-то делаем
}


3. $_POST["email"] никогда не прилетит, если при выводе формы Вы делаете так:
// $model instanceof Subscription
$form->field($model, 'email')->textInput();

то в $_POST прилетит:
[
    'Subscription' => [
        'email' => 'some@email'
    ]
]


4. Валидацию на уник можно сделать так
public function rules()
{
    return [
        ['email', 'unique'],
    ];
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы