Не проходит валидация

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Не проходит валидация

Сообщение drag0n »

Добрый день!

Нужна помощь, не могу понять почему не проходит валидация???

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

<?php

namespace app\models;

use yii\db\ActiveRecord;


class Withdraw extends ActiveRecord
{
    public $sum;
    public $fpassword;

    public static function tableName()
    {
        return 'withdraw';
    }

    public function attributeLabels()
    {
        return [
            'sum' => 'Введите сумму:',
            'fpassword' => 'Введите финансовый пароль:',
        ];
    }

    public function rules()
    {
        return [
            [['sum'], 'required','message' => 'Вы должны указать сумму для вывода'],
            [['sum'], 'integer', 'min' => 3000, 'tooSmall' => 'Минимальная сумма вывода {min} ₸'],
            [['sum'], 'integer', 'max' => \Yii::$app->user->identity->amount, 'tooBig' => 'Недостаточно средств для вывода'],
            [['fpassword'], 'required','message' => 'Вы должны ввести финансовый пароль'],
            [['fpassword'], 'string', 'length' => [1,30]],
            [['fpassword'], 'match', 'pattern' => '/^[A-Za-z0-9\s,]+$/u'],
        ];
    }

    public function validateWithdraw()
    {
        if ($this->validate())
        {
            $user = User::find()->where(['id'=>\Yii::$app->user->identity->id])->one();
            $user->amount -= $this->sum;

            $orderWithdraw = new Withdraw();
            $orderWithdraw->user_id = \Yii::$app->user->identity->id;
            $orderWithdraw->sum = $this->sum;
            $orderWithdraw->status = 0;
            $orderWithdraw->comment = 'Заявка на вывод средств';
            $orderWithdraw->created_at = date('Y-m-d H:i:s');
            $orderWithdraw->updated_at = date('Y-m-d H:i:s');

            return ($user->save() && $orderWithdraw->save());
        }
    }

}
$orderWithdraw выводит все нормально

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

app\models\Withdraw#1
(
    [sum] => '3000'
    [fpassword] => null
    [yii\db\BaseActiveRecord:_attributes] => [
        'user_id' => '24'
        'status' => 0
        'comment' => 'Заявка на вывод средств'
        'created_at' => '2017-06-23 16:21:12'
        'updated_at' => '2017-06-23 16:21:12'
    ]
    [yii\db\BaseActiveRecord:_oldAttributes] => null
    [yii\db\BaseActiveRecord:_related] => []
    [yii\base\Model:_errors] => null
    [yii\base\Model:_validators] => null
    [yii\base\Model:_scenario] => 'default'
    [yii\base\Component:_events] => []
    [yii\base\Component:_behaviors] => []
)
а вот $orderWithdraw->save() возвращает false
где-то за тупил ???
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Не проходит валидация

Сообщение ElisDN »

Выведите print_r($orderWithdraw->getErrors()) после save().
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

ElisDN писал(а): 2017.06.23, 13:25 Выведите print_r($orderWithdraw->getErrors()) после save().

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

Array ( [fpassword] => Array ( [0] => Вы должны ввести финансовый пароль ) )
Странно я его ввожу
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Не проходит валидация

Сообщение maleks »

drag0n писал(а): 2017.06.23, 13:23 где-то за тупил ???

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

class Withdraw extends ActiveRecord
{
    public $sum;  // ВОТ ЭТО
    public $fpassword;// ПОУБИРАЙТЕ
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

maleks писал(а): 2017.06.23, 13:44
drag0n писал(а): 2017.06.23, 13:23 где-то за тупил ???

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

class Withdraw extends ActiveRecord
{
    public $sum;  // ВОТ ЭТО
    public $fpassword;// ПОУБИРАЙТЕ
Т.е. мне получается 2 разные моделки создать нужно Model и ActiveRecord, я правильно понял ???
а во одной нельзя???
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Не проходит валидация

Сообщение Alexum »

1) Если в БД есть поля sum и fpassword, то их не нужно объявлять как свойства класса
2) Почему столько всего происходит в методе, который, судя по названию должен только валидацией заниматься? Да и место этому коду в контроллере а не в модели.
3) В правилах:

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

 [['fpassword'], 'required','message' => 'Вы должны ввести финансовый пароль'],
В вашем коде $model->fpassword никак не задаётся
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

Alexum писал(а): 2017.06.23, 14:16 1) Если в БД есть поля sum и fpassword, то их не нужно объявлять как свойства класса
2) Почему столько всего происходит в методе, который, судя по названию должен только валидацией заниматься? Да и место этому коду в контроллере а не в модели.
3) В правилах:

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

 [['fpassword'], 'required','message' => 'Вы должны ввести финансовый пароль'],
В вашем коде $model->fpassword никак не задаётся
Они передаются с формы
$model->sum
$model->fpassword

странно, но в контролере заработало :?:

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

    public function actionWithdraw()
    {
        if (!Yii::$app->user->identity->amount)
            return $this->render('withdraw');

        $model = new WithdrawForm();

        if (Yii::$app->request->post())
        {
            $model->load(Yii::$app->request->post());

            $hash = Yii::$app->user->identity->fpassword;
            $fpass = $model->fpassword;

            if (Yii::$app->getSecurity()->validatePassword($fpass, $hash))
                if ($model->validateWithdrawForm())
                {
                    $orderWithdraw = new Withdraw();
                    $orderWithdraw->user_id = \Yii::$app->user->identity->id;
                    $orderWithdraw->sum = $model->sum;
                    $orderWithdraw->comment = 'Заявка на вывод средств';
                    $orderWithdraw->created_at = date('Y-m-d H:i:s');
                    $orderWithdraw->updated_at = date('Y-m-d H:i:s');
                    $orderWithdraw->save();

                    Yii::$app->session->setFlash('success', 'Заявка на вывод средств успешно оформлена');
                    return $this->refresh();
                }
                else
                    Yii::$app->session->setFlash('error', 'Ошибка вывода средств');
            else
                Yii::$app->session->setFlash('error', 'Введите правильный пароль');
        }

        return $this->render('withdraw', compact('model'));
    }
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Не проходит валидация

Сообщение caHek2x »

drag0n писал(а): 2017.06.23, 13:23 где-то за тупил ???
затупили вы вот в чем:
Array ( [fpassword] => Array ( [0] => Вы должны ввести финансовый пароль ) )
Странно я его ввожу

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

            $orderWithdraw = new Withdraw();
            $orderWithdraw->user_id = \Yii::$app->user->identity->id;
            $orderWithdraw->sum = $this->sum;
            $orderWithdraw->status = 0;
            $orderWithdraw->comment = 'Заявка на вывод средств';
            $orderWithdraw->created_at = date('Y-m-d H:i:s');
            $orderWithdraw->updated_at = date('Y-m-d H:i:s');

            return ($user->save() && $orderWithdraw->save());
хм не вижу $orderWithdraw->fpassword ...

upd: не заметил Alexum вам это сказал уже ...
В вашем коде $model->fpassword никак не задаётся
ну повторение мать учения )
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

caHek2x писал(а): 2017.06.23, 14:47
drag0n писал(а): 2017.06.23, 13:23 где-то за тупил ???
затупили вы вот в чем:
Array ( [fpassword] => Array ( [0] => Вы должны ввести финансовый пароль ) )
Странно я его ввожу

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

            $orderWithdraw = new Withdraw();
            $orderWithdraw->user_id = \Yii::$app->user->identity->id;
            $orderWithdraw->sum = $this->sum;
            $orderWithdraw->status = 0;
            $orderWithdraw->comment = 'Заявка на вывод средств';
            $orderWithdraw->created_at = date('Y-m-d H:i:s');
            $orderWithdraw->updated_at = date('Y-m-d H:i:s');

            return ($user->save() && $orderWithdraw->save());
хм не вижу $orderWithdraw->fpassword ...

upd: не заметил Alexum вам это сказал уже ...
В вашем коде $model->fpassword никак не задаётся
ну повторение мать учения )
fpassword из формы передается для проверки он сравнивается в контролере, его нигде сохранять не надо,
чисто только для сравнения правильно или неправильно ввели пароль, больше от него ничего не требуется
и sum тоже из формы передается
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Не проходит валидация

Сообщение caHek2x »

какая разница для чего он там используется ... у вас в правилах валидации он required ... save перед сохранением проводит валидацию ...
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

caHek2x писал(а): 2017.06.23, 15:34 какая разница для чего он там используется ... у вас в правилах валидации он required ... save перед сохранением проводит валидацию ...
Я же fpassword в форме ввожу, так что в нем есть данные он не пустой
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Не проходит валидация

Сообщение caHek2x »

какая разница где вы что вводите ... еще раз: в данном обьекте нет fpassword ... данный обьект это экземпляр класса Withdraw ... у модели Withdraw прописано в правилах обязательное наличие fpassword ... покажите теперь где вы в данной ситуации заполяете данное поле ...

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

            $orderWithdraw = new Withdraw();
            $orderWithdraw->user_id = \Yii::$app->user->identity->id;
            $orderWithdraw->sum = $this->sum;
            $orderWithdraw->status = 0;
            $orderWithdraw->comment = 'Заявка на вывод средств';
            $orderWithdraw->created_at = date('Y-m-d H:i:s');
            $orderWithdraw->updated_at = date('Y-m-d H:i:s');

            return ($user->save() && $orderWithdraw->save());
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Не проходит валидация

Сообщение caHek2x »

drag0n писал(а): 2017.06.23, 14:31 странно, но в контролере заработало :?:

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

....
                    $orderWithdraw->save();
....
то есть в контроллере вы убрали проверку на "сохранено или нет" и считаете что заработало ?
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

т.е. я первый save проверяю и сохраняю, а второй save просто сохраняю
и 2 модельки сделал WithdrawForm и Withdraw

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

    public function actionWithdraw()
    {
        if (!Yii::$app->user->identity->amount)
            return $this->render('withdraw');

        $model = new WithdrawForm();

        if (Yii::$app->request->post())
        {
            $model->load(Yii::$app->request->post());

            $hash = Yii::$app->user->identity->fpassword;
            $fpass = $model->fpassword;

            if (Yii::$app->getSecurity()->validatePassword($fpass, $hash))
                if ($model->validateWithdrawForm())
                {
                    $orderWithdraw = new Withdraw();
                    $orderWithdraw->user_id = \Yii::$app->user->identity->id;
                    $orderWithdraw->sum = $model->sum;
                    $orderWithdraw->comment = 'Заявка на вывод средств';
                    $orderWithdraw->created_at = date('Y-m-d H:i:s');
                    $orderWithdraw->updated_at = date('Y-m-d H:i:s');
                    $orderWithdraw->save();

                    Yii::$app->session->setFlash('success', 'Заявка на вывод средств успешно оформлена');
                    return $this->refresh();
                }
                else
                    Yii::$app->session->setFlash('error', 'Ошибка вывода средств');
            else
                Yii::$app->session->setFlash('error', 'Введите правильный пароль');
        }
        return $this->render('withdraw', compact('model'));
    }

caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Не проходит валидация

Сообщение caHek2x »

drag0n писал(а): 2017.06.23, 17:13 т.е. я первый save проверяю и сохраняю, а второй save просто сохраняю
и 2 модельки сделал WithdrawForm и Withdraw
вы спрашиваете или утверждаете ?
во втором save не проходит валидация и там ничего не сохраняется ... проверьте getErrors ...
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

caHek2x писал(а): 2017.06.23, 17:53
drag0n писал(а): 2017.06.23, 17:13 т.е. я первый save проверяю и сохраняю, а второй save просто сохраняю
и 2 модельки сделал WithdrawForm и Withdraw
вы спрашиваете или утверждаете ?
во втором save не проходит валидация и там ничего не сохраняется ... проверьте getErrors ...
Утверждаю, второй save ($orderWithdraw->save(); ) сохраняет без проблем
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Не проходит валидация

Сообщение caHek2x »

если правила такие как вы написали выше ... то вы чтото путаете ... выведите на экран что возвращает save ... и выведите getErrors ...
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

caHek2x писал(а): 2017.06.23, 18:29 если правила такие как вы написали выше ... то вы чтото путаете ... выведите на экран что возвращает save ... и выведите getErrors ...
getErrors - Array ()

save - true
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Не проходит валидация

Сообщение caHek2x »

ну значит :
- либо вы изменили правила
- либо в модели заранее инициализировали эту переменную
- либо сценарии прописали ...

т.к. по тем правилам что вы написали выше у вас должна быть ошибка при сохранении $orderWithdraw и $orderWithdraw->getErrors() должен показать после save ошибку которую вы писали выше ...
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Не проходит валидация

Сообщение drag0n »

caHek2x писал(а): 2017.06.24, 00:07 ну значит :
- либо вы изменили правила
- либо в модели заранее инициализировали эту переменную
- либо сценарии прописали ...

т.к. по тем правилам что вы написали выше у вас должна быть ошибка при сохранении $orderWithdraw и $orderWithdraw->getErrors() должен показать после save ошибку которую вы писали выше ...
Эти 2 переменные ($sum и $fpassword) у меня сразу были прописаны в модельке,
мне их сказали по убирать, не понятно почему, если они у меня от формы передаются
drag0n писал(а): 2017.06.23, 13:47
maleks писал(а): 2017.06.23, 13:44
drag0n писал(а): 2017.06.23, 13:23 где-то за тупил ???

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

class Withdraw extends ActiveRecord
{
    public $sum;  // ВОТ ЭТО
    public $fpassword;// ПОУБИРАЙТЕ
Ответить