Добрый вечер. Есть вот такой класс
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>
Я создаю для админки отдельную модель, которая наследуется от основной модели. В модели для админки я создаю константы для сценариев и объявляю пару свойств для паролей.
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,
]);
}
}
В основной модели я никак не обрабатываю пароль.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Использую vagrant контейнер scotchboxвсе хорошо запустилось и работает
Здравствуйте, нужен генератор имен, берущий случайные слоги из массива, интересуют варианты как это можно сделать через implode и вариант с конкатенацией
ДД, делаю интеграцию с 1С, Принимаю со стороны 1C файл выгрузки XML, Делаю вывод данных с него проходясь по xml файлу, предварительно его подключив...
При наборе IPv4 адреса в адресной строке браузера, получаю две строки сообщения ввиде html кода, те