Непонятная ошибка валидации

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
abutan
Сообщения: 31
Зарегистрирован: 2016.11.13, 17:26

Непонятная ошибка валидации

Сообщение abutan »

Здравствуйте всем.
Переделываю сайт клиента. Раньше на сайте по сути не было регистрации нормальной и юзер записывался в таблицу чуть ли не напрямую. Теперь человек решил что надо делать все правильно.
Вот я и делаю. Вот класс формы

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

class SignupForm extends Model
{
	const SCENARIO_USER = 'user_create';
	const SCENARIO_COMPANY = 'company_create';

    public $users_type;
    public $users_fio;
    public $users_name;
    public $users_address;
    public $users_about;
    public $users_email;
    public $users_password;
    public $confirm_password;
    public $users_phone;
    public $users_region;
    public $users_city;
    public $users_hash;

    public function scenarios()
    {
	    $scenarios = parent::scenarios();
	    $scenarios[self::SCENARIO_USER] = ['users_type', 'users_fio', 'users_phone', 'users_email', 'users_password', 'users_phone', 'users_region', 'users_city', 'users_hash'];
	    $scenarios[self::SCENARIO_COMPANY] = ['users_type', 'users_name', 'users_address', 'users_about', 'users_email', 'users_password', 'users_phone', 'users_region', 'users_city', 'users_hash'];
	    return $scenarios;
    }

	public function rules()
    {
        return [
        	['users_type', 'integer'],

            [['users_fio', 'users_name'], 'trim'],
            [['users_fio', 'users_name'], 'string', 'min' => 2, 'max' => 255],
	        [['users_fio', 'users_name'], 'match', 'pattern' => '/^[А-ЯЁа-яё0-9-]+$/', 'message' => 'В имени пользователя и названии организации разрешены только русские буквы, цифры от 0 до 9 и дефис'],

	        [['users_fio', 'users_phone'] , 'required', 'on' => self::SCENARIO_USER],
	        [['users_name', 'users_address', 'users_phone'] , 'required', 'on' => self::SCENARIO_COMPANY],

	        [['users_about'], 'string'],
	        [['users_address'], 'string'],

            ['users_email', 'trim'],
            ['users_email', 'required'],
            ['users_email', 'email'],
            ['users_email', 'string', 'max' => 255],
            ['users_email', 'unique', 'targetClass' => User::class, 'message' => 'Пользователь с таким email уже существует.'],

            [['users_password', 'confirm_password'], 'required'],
            [['users_password', 'confirm_password'], 'string', 'min' => 6],
	        ['confirm_password', 'compare', 'compareAttribute' => 'users_password', 'message' => 'Введенные пароли не совпадают.'],

	        [['users_region', 'users_city'], 'required'],
	        [['users_region', 'users_city'], 'integer'],
	        ['users_hash', 'safe']
        ];
    }

    public function attributeLabels(): array
    {
	    return [
	    	'users_type' => 'Тип пользователя',
          	  'users_fio' => 'Имя для физ. лица',
		    'users_name' => 'Название компании',
		    'users_address' => 'Адрес компании',
		    'users_about' => 'Описание компании',
		    'users_email' => 'Email пользователя',
		    'users_password' => 'Пароль',
		    'confirm_password' => 'Подтверждение пароля',
		    'users_phone' => 'Телефоны',
		    'users_region' => 'Регион пользователя',
		    'users_city' => 'Город',
	    ];
    }

	public function signup(): bool
    {
        if ($this->validate()) {
        	$user = new User();

        	$user->users_fio = $this->users_fio;
        	$user->users_name = $this->users_name;
        	$user->users_address = $this->users_address;
        	$user->users_about = $this->users_about;
        	$user->users_email = $this->users_email;
        	$user->users_password = $user->setPassword($this->users_password);
		$user->users_check_email = User::STATUS_WAIT;
	        $user->users_hash =  base64_encode($user->users_phone.$user->users_email.md5(time()));

			return $user->save();
        }else{
        	return false;
        }
    }
}
Вот сама форма

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

<?php $form = ActiveForm::begin(['id' => 'create-user']); ?>
<?= \frontend\widgets\usertypeselect\UserTypeSelect::widget([
	'field' => 'user-users_type',
	'selected' => $model->users_type,
]) ?>

<?= $form->field($model, 'users_type')->hiddenInput()->label(false); ?>

<div id="div_fiz_lico"
     class="contact-info__wrapper" <?= isset($model->users_type) && $model->users_type == UserType::COMPANY ? ' style="display:none" ' : ''; ?> <?= !isset($model->users_type) ? 'style="display:none"' : ''; ?>>

	<div class="contact-info__label">
		<?= Yii::t('app', 'Имя'); ?>:<span class="glyphicon glyphicon-asterisk color-red icon-aster"></span>
	</div>

	<div class="contact-info__input">
		<?= $form->field($model, 'users_fio')->label(false)->textInput(['maxlength' => true]) ?>
	</div>
</div>

<div id="div_magazin"
     class="contact-info__wrapper" <?= isset($model->users_type) && $model->users_type == UserType::USER ? 'style="display:none"' : ''; ?> >
	<div class="contact-info__line">
		<div class="<?= $model->hasErrors('users_name') ? "contact-info__label contact-info__label--warning" : "contact-info__label"; ?>">
			<?= Yii::t('app', 'Название организации'); ?><span
				class="glyphicon glyphicon-asterisk color-red icon-aster"></span>:
		</div>

		<div class="contact-info__input">
			<?= $form->field($model, 'users_name')->textInput(['maxlength' => true])->label(false) ?>
		</div>
	</div>

	<div class="contact-info__line">
		<div class="<?= $model->hasErrors('users_address') ? "contact-info__label contact-info__label--warning" : "contact-info__label"; ?>">
			<?= Yii::t('app', 'Адрес организации') ?>
			<span class="glyphicon glyphicon-asterisk color-red icon-aster"></span> :
			<?php echo '<span class="glyphicon glyphicon-question-sign ico_question" data-toggle="tooltip" data-placement="bottom" title="' . Yii::t('app', 'Этот адрес мы будем показывать на карте - так вас дополнительно смогут найти. Укажите максимально точно свой адрес нахождения') . '" ></span>';?>
		</div>

		<div class="contact-info__input">
			<?= $form->field($model, 'users_address')->textarea(['rows' => 3])->label(false) ?>
		</div>
	</div>

	<div class="contact-info__line">
		<?php
			echo '<span class="glyphicon glyphicon-plus icon_registration"></span> ' . Yii::t('app', 'После регистрации вы сможете добавить представительства (офисы, филиалы) своей организации.') . '</span>';

		echo '<span class="glyphicon glyphicon-question-sign ico_question" data-toggle="tooltip" data-placement="right" title="'.Yii::t('app', 'Опубликованные объявления будут отображаться в городах нахождения представительств.') .'" ></span>';
		?>
	</div>
	<br/>
	<div class="contact-info__line">
		<div class="contact-info__label"><?= Yii::t('app', 'Описание организации'); ?>:</div>
		<div class="contact-info__input">
			<?= $form->field($model, 'users_about')->textarea(['rows' => 3])->label(false) ?>
		</div>
	</div>
</div>

<div class='reg-upload'>
	<span class="glyphicon glyphicon-picture icon_registration"></span>
	<?= Yii::t('app', 'Добавить изображения можно после регистрации в меню «Настройки».'); ?>
</div>

<br/>
<div class="contact-info__line">
	<div class="<?= $model->hasErrors('users_phone') ? "contact-info__label contact-info__label--warning" : "contact-info__label"; ?>">
		<?= Yii::t('app', 'Номера телефонов'); ?>:<span
			class="glyphicon glyphicon-asterisk color-red icon-aster"></span>
	</div>
	<div class="ml-5">
		<?= PhoneInput::widget([
			'phones' => $model->users_phone
		]) ?>
	</div>
	<div class="frm_hint"><?= Yii::t('app', 'Укажите дополнительные контактные номера телефонов'); ?></div>
</div>

<!--<div class="contact-info__line" id="internet-shop">
	<label class="contact-info__label" for="flag_internet_shop"><?/*= Yii::t('app', 'Мы – интернет-магазин'); */?></label>
	<div class="contact-info__input">
		<input class="contact-info__checkbox" type="checkbox" name="flag_internet_shop"
		       value='<?/*= isset($_POST['flag_internet_shop']) ? $_POST['flag_internet_shop'] : '2'; */?>' <?php /*if (isset($_POST['flag_internet_shop'])) if ($_POST['flag_internet_shop'] == '2') echo 'checked'; */?>
		       id="flag_internet_shop">
	</div>
</div>-->

<div class="contact-info__line">
	<div class="<?= $model->hasErrors('users_email') ? "contact-info__label contact-info__label--warning" : "contact-info__label"; ?>">
		E-mail:<span class="glyphicon glyphicon-asterisk color-red icon-aster"></span>
		<?php echo '<span class="glyphicon glyphicon-question-sign ico_question" data-toggle="tooltip" data-placement="bottom" title="'.Yii::t('app', 'E-mail используется в качестве логина для авторизации на сайте') .'" ></span>';?>
	</div>

	<div class="contact-info__email">
		<?= $form->field($model, 'users_email')->textInput(['maxlength' => true])->label(false) ?>
	</div>
</div>

<div class="contact-info__line">
	<div class="contact-info__label">
		<?= Yii::t('app', 'Пароль'); ?>:<span
				class="glyphicon glyphicon-asterisk color-red icon-aster"></span>
		<?php echo '<span class="glyphicon glyphicon-question-sign ico_question" data-toggle="tooltip" data-placement="bottom" title="'.Yii::t('app', 'Запомните свой пароль. Он необходим для входа в систему. Не храните пароль на рабочем столе!') .'" ></span>';?>
	</div>

	<div class="contact-info__password">
		<?= $form->field($model, 'users_password')->passwordInput()->label(false) ?>
	</div>
</div>

<div class="contact-info__line">
	<div class="contact-info__label">
		<?= Yii::t('app', 'Подтверждение пароля'); ?>:<span
				class="glyphicon glyphicon-asterisk color-red icon-aster"></span>
	</div>

	<div class="contact-info__password">
		<?= $form->field($model, 'confirm_password')->passwordInput()->label(false) ?>
	</div>
</div>

<?= CountySelect::widget([
	'labels' => true,
	'viewAllCities' => false,
	'city' => isset($model->users_city) ? Cities::getOrSetById($model->users_city) : Yii::$app->prefix->data
]); ?>

<div class="reg-info"><?= Yii::t('app', 'Поля, отмеченные символом (') ?><span
		class="glyphicon glyphicon-asterisk color-red icon-aster"></span>
	), <?= Yii::t('app', 'обязательны для заполнения.'); ?></div>
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 text-center reg-submit">
	<?= Html::submitButton(Yii::t('app', 'Зарегистрироваться'), ['class' => 'btn btn-success']); ?>
</div>
<?= $form->errorSummary($model)?>
<?php ActiveForm::end(); ?>

<?php
$js = "
var form = $('#create-user');
var type = form.find('#signupform-users_type');
type.attr('value', '2');
var user = form.find('#btn-fio');
var company = form.find('#btn-user');
user.click(function() {
	type.attr('value', '1');
});
company.click(function() {
	type.attr('value', '2');
});
";

$this->registerJs($js);
?>
вот action

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

$text = Text::getText('/registration.php');

        $model = new SignupForm();
        if ($model->load(Yii::$app->request->post())) {
            $model->users_phone = FN::collect_phones();

	        if(!preg_match('/[0-9]{11,}/', $model->users_phone, $match_phone)){//если в номере меньше 11 цифр, то не добавляем на регистрацию
	            $model->addError('users_phone', Yii::t('app','Формат телефона неверный'));
	        }
	        $model->users_city = Yii::$app->request->post('cityid', 576);//132;
	        $model->users_region = Yii::$app->request->post('regid', 114);//254;
	        $model->users_hash =  base64_encode($model->users_phone.$model->users_email.md5(time()));
        	/* @var User $user */
            if ($user = $model->signup()) {
	            Yii::$app->session->setFlash('success', 'Проверьте свою почту. На указанный Email Вам отправлено письмо с дальнейшими инструкциями.');
	            return $this->redirect(Yii::$app->homeUrl);
            }else{
	            Yii::$app->session->setFlash('error', 'Облом.');
	            print_r($model->getErrors());
            }
        }

        return $this->render('signup', [
            'model' => $model,
	        'text' => $text,
        ]);
Так вот после заполнения полей и нажатия на сабмит ничего не сохраняется, а в логах нахожу - yii\db\ActiveRecord::insert Model not inserted due to validation error. Но ошибки не выводятся и не показываются.
Подскажите , может кто видит где я себя обманываю.
Заранее благодарен.
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Непонятная ошибка валидации

Сообщение someweb »

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

        	$user->users_password = $user->setPassword($this->users_password);
		$user->users_check_email = User::STATUS_WAIT;
	        $user->users_hash =  base64_encode($user->users_phone.$user->users_email.md5(time()));

			return $user->save(); //<--- Ошибки валидации модели User никуда не выводятся
        }else{
        	return false;
        }
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Аватара пользователя
darlov
Сообщения: 204
Зарегистрирован: 2012.01.31, 16:09

Re: Непонятная ошибка валидации

Сообщение darlov »

Ошибка валидации в yii\db\ActiveRecord при сохранении, а вы ждете ошибку от модели. Видимо вы в модели не все условия прописали в rules. Поставьте xdebug, он сэкономит вам уйму времени.
Ответить