Как правильно сделать регистрацию

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
NagarD
Сообщения: 11
Зарегистрирован: 2014.12.20, 09:56

Как правильно сделать регистрацию

Сообщение NagarD »

Подскажите как правильно сделать.

есть форма регистрации

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

$model = new User();

if(isset($_POST['User']))
{
    $model->attributes = $_POST['User'];
    if($model->save)
    {
        echo 'ok';
    }
} 
Но в модели юсер созданы переменные типа парольКонфирм, кодПроверки + правила. Я думаю это не правильно. Хочу разделить функционал и перенести все лишнее в RegistrationForm от CFormModel, но как это правильно сделать не понимаю.
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: Как правильно сделать регистрацию

Сообщение Alex@ »

этот код должен быть в контролере:

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

$model = new User();

if(isset($_POST['User']))
{
    $model->attributes = $_POST['User'];
    if($model->save)
    {
        echo 'ok';
    }
} 
 
форма должна быть в отдельном файле
так же модель описана в отдельном фале.
NagarD
Сообщения: 11
Зарегистрирован: 2014.12.20, 09:56

Re: Как правильно сделать регистрацию

Сообщение NagarD »

Абсолютно согласен, оно у мене так и есть. Но я не об этом, а вот о чем.

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

$model = new RegistrationForm();

        if(isset($_POST['RegistrationForm']))
        {
            $model->attributes = $_POST['RegistrationForm'];
            if($model->validate())
            {
                $user = new Users;

                $user->email = $_POST['RegistrationForm']['email'];
                $user->password = $_POST['RegistrationForm']['password'];

                if ($user->save(false))
                {
                     Yii::app()->user->setFlash();
                }
            }
        }
 
Но как на меня это не правильно (не красиво) или правильно (красиво)?
Последний раз редактировалось NagarD 2014.12.28, 21:05, всего редактировалось 1 раз.
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: Как правильно сделать регистрацию

Сообщение Alex@ »

Вы присваиваете $model две разные модели зачем?
Аватара пользователя
dignityinside
Сообщения: 76
Зарегистрирован: 2013.04.04, 17:57
Контактная информация:

Re: Как правильно сделать регистрацию

Сообщение dignityinside »

Я у себя делал примерно так...

Controller:

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

public function actionRegistration(){
        
                $model = new User();

                if(isset($_POST['User']))
                {
                    $model->attributes=$_POST['User'];

                    if($model->save())
                    {
                        $this->redirect('login');
                    }
                }

                $this->render('_form_registration', array('model'=>$model));
 }
Модель:

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

protected function beforeSave()
    {
        parent::beforeSave();

        if($this->isNewRecord)
        {
            // здесь сохраняем всё что нам нужно...
            $this->date_registr = time();
            ....
        }

        return parent::beforeSave();
    }
Здесь же я делал проверку данных:

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

public function rules()
    {
        return array(
            array('username, password', 'required'),
            array('username', 'match', 'pattern' => '/^[A-Za-z0-9\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),
            array('password', 'match', 'pattern' => '/^[A-Za-z0-9@\s,]+$/u','message' => 'Пароль содержит недопустимые символы.'),
            array('username, password, email, password2, verifyCode', 'required', 'on'=>'registration'),
            array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'registration'),
            array('email, username', 'unique', 'on'=>'registration'),
            ...
        );
    } 
Ну и форма:

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

<div class="form">

    <?php $form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array(
        'layout' => TbHtml::FORM_LAYOUT_HORIZONTAL,
        'id'=>'form-registration',
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
        ),
    )); ?>

    <?php echo $form->errorSummary($model); ?>

        <?php echo $form->TextFieldControlGroup($model,'username', array('placeholder'=>'Логин')); ?>

        <?php echo $form->PasswordFieldControlGroup($model,'password', array('placeholder'=>'Пароль')); ?>

        <?php echo $form->PasswordFieldControlGroup($model,'password2', array('placeholder'=>'Повторите пароль')); ?>

        <?php echo $form->TextFieldControlGroup($model,'email', array('placeholder'=>'E-Mail')); ?>

        <?php if(Yii::app()->user->isGuest || !CCaptcha::checkRequirements()): ?>
            <?php $this->widget('CCaptcha', array('buttonLabel' => '(Обновить)<br />')); ?>
            <?php echo $form->textFieldControlGroup($model,'verifyCode', array('placeholder'=>'Защитный код')); ?>
        <?php endif; ?>

    <?php echo TbHtml::formActions(array(
        TbHtml::submitButton('Регистрация', array(
            'color' => TbHtml::BUTTON_COLOR_PRIMARY,
        )),
    )); ?>

    <?php $this->endWidget(); ?>

</div><!-- form -->
Мой блог:
https://protonalex.com
NagarD
Сообщения: 11
Зарегистрирован: 2014.12.20, 09:56

Re: Как правильно сделать регистрацию

Сообщение NagarD »

Alex@ писал(а):Вы присваиваете $model две разные модели зачем?
Пардон, опичатка, edited.
NagarD
Сообщения: 11
Зарегистрирован: 2014.12.20, 09:56

Re: Как правильно сделать регистрацию

Сообщение NagarD »

dignityinside писал(а):Я у себя делал примерно так...

Controller:

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

public function actionRegistration(){
        
                $model = new User();

                if(isset($_POST['User']))
                {
                    $model->attributes=$_POST['User'];

                    if($model->save())
                    {
                        $this->redirect('login');
                    }
                }

                $this->render('_form_registration', array('model'=>$model));
 } 
Модель:

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

protected function beforeSave()
    {
        parent::beforeSave();

        if($this->isNewRecord)
        {
            // здесь сохраняем всё что нам нужно...
            $this->date_registr = time();
            ....
        }

        return parent::beforeSave();
    } 
Здесь же я делал проверку данных:

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

public function rules()
    {
        return array(
            array('username, password', 'required'),
            array('username', 'match', 'pattern' => '/^[A-Za-z0-9\s,]+$/u','message' => 'Логин содержит недопустимые символы.'),
            array('password', 'match', 'pattern' => '/^[A-Za-z0-9@\s,]+$/u','message' => 'Пароль содержит недопустимые символы.'),
            array('username, password, email, password2, verifyCode', 'required', 'on'=>'registration'),
            array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'registration'),
            array('email, username', 'unique', 'on'=>'registration'),
            ...
        );
    }
Ну и форма:

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

<div class="form">

    <?php $form = $this->beginWidget('bootstrap.widgets.TbActiveForm', array(
        'layout' => TbHtml::FORM_LAYOUT_HORIZONTAL,
        'id'=>'form-registration',
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
        ),
    )); ?>

    <?php echo $form->errorSummary($model); ?>

        <?php echo $form->TextFieldControlGroup($model,'username', array('placeholder'=>'Логин')); ?>

        <?php echo $form->PasswordFieldControlGroup($model,'password', array('placeholder'=>'Пароль')); ?>

        <?php echo $form->PasswordFieldControlGroup($model,'password2', array('placeholder'=>'Повторите пароль')); ?>

        <?php echo $form->TextFieldControlGroup($model,'email', array('placeholder'=>'E-Mail')); ?>

        <?php if(Yii::app()->user->isGuest || !CCaptcha::checkRequirements()): ?>
            <?php $this->widget('CCaptcha', array('buttonLabel' => '(Обновить)<br />')); ?>
            <?php echo $form->textFieldControlGroup($model,'verifyCode', array('placeholder'=>'Защитный код')); ?>
        <?php endif; ?>

    <?php echo TbHtml::formActions(array(
        TbHtml::submitButton('Регистрация', array(
            'color' => TbHtml::BUTTON_COLOR_PRIMARY,
        )),
    )); ?>

    <?php $this->endWidget(); ?>

</div><!-- form -->
Да можно и так, но я ведь, наоборот, хочу уйти от такого метода. Хочу оставить модель Юсер чистой без всяких verifyCode и password2, это только два свойства (можна сказать нормально), но их может быть больше, а когда их больше ты начинаешь тормозить и теряться.
Я написал выше свой вариант и он работает, но проблема с отображением ошибок, т.к. модель не та. Выход есть это создать свой валидатор, который будет делать дополнительный запрос в бд и проверять что нужно. Но как на меня это не правильно, должно быть простое и лаконичное решение.
Ответить