Yii2 Rules required on

271
07 марта 2018, 08:47

Добрый вечер. Есть вот такой класс

class User extends ActiveRecord implements IdentityInterface {...}

И в нём вот такие правила

public function rules()
{
    return [
        [['username', 'email', 'nickname'], 'required'],
        //[['new_password'], 'required', 'on' => 'createNewUser'],
        [['email'], 'email'],
        [['username', 'nickname'], 'string'],
        ['status', 'default', 'value' => self::STATUS_ACTIVE],
        ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
        ['role', 'default', 'value' => self::ROLE_USER],
        ['role', 'in', 'range' => [self::ROLE_USER]],
    ];
}

Проблема в этой строке:

[['new_password'], 'required', 'on' => 'createNewUser']

Не могу понять почему это правило не работает. Я так понимаю оно действительно только при вызове в моём случае определенного экшна. Вот код экшна:

public function actionCreate()
{
    $model = new User(['scenario' => 'createNewUser']);
    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

Если раскомментировать эту строчку на выхлопе получаю что модель не проходит валидацию.

$model->save() // на выхлопе false 

Итого в логах:

yii\db\ActiveRecord::insert Model not inserted due to validation error.

Вот и форма регистрации нового пользователя, отсюда приходят данные:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model common\models\User */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="user-form">
    <?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'username')->textInput(); ?>   
    <?= $form->field($model, 'email')->input('email'); ?>
    <?= $form->field($model, 'nickname')->textInput(); ?>
    <?= $form->field($model, 'new_password')->input('password'); ?>
    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('backend', 'Create') : Yii::t('backend', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>
    <?php ActiveForm::end(); ?>
</div>
Answer 1

Я создаю для админки отдельную модель, которая наследуется от основной модели. В модели для админки я создаю константы для сценариев и объявляю пару свойств для паролей.

const SCENARIO_ADMIN_CREATE = 'createAdmin';
const SCENARIO_ADMIN_UPDATE = 'updateAdmin';
public $newPassword;
public $newPasswordRepeat;

В правилах валидации эти сценарии использую так

public function rules()
{
    return ArrayHelper::merge(parent::rules(),[
                 [['newPassword', 'newPasswordRepeat'], 'required', 'on' => self::SCENARIO_ADMIN_CREATE],
                 ['newPassword', 'string', 'min' => 6],
                 ['newPasswordRepeat', 'compare', 'compareAttribute' => 'newPassword'],
            ]);
}
public function scenarios()
{
 $scenarios = parent::scenarios();
 $scenarios[self::SCENARIO_ADMIN_CREATE] = ['username', 'email', 'status', 'role', 'newPassword', 'newPasswordRepeat'];
 $scenarios[self::SCENARIO_ADMIN_UPDATE] = ['username', 'email', 'status', 'role', 'newPassword', 'newPasswordRepeat'];
 return $scenarios;
}

И в действии create использую сценарий следующим образом

public function actionCreate()
{        
    $model = new UsersAdmin();
    $model->scenario = UsersAdmin::SCENARIO_ADMIN_CREATE;
    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

В основной модели я никак не обрабатываю пароль.

READ ALSO
Не могу изменить настройки php в scotchbox

Не могу изменить настройки php в scotchbox

Использую vagrant контейнер scotchboxвсе хорошо запустилось и работает

195
Генератор имен на php по слогам из массива

Генератор имен на php по слогам из массива

Здравствуйте, нужен генератор имен, берущий случайные слоги из массива, интересуют варианты как это можно сделать через implode и вариант с конкатенацией

250
Не находит по артиклу в MySql

Не находит по артиклу в MySql

ДД, делаю интеграцию с 1С, Принимаю со стороны 1C файл выгрузки XML, Делаю вывод данных с него проходясь по xml файлу, предварительно его подключив...

247
получить данные от веб-сервера в переменную по ip адресу

получить данные от веб-сервера в переменную по ip адресу

При наборе IPv4 адреса в адресной строке браузера, получаю две строки сообщения ввиде html кода, те

199