За последние 24 часа нас посетили 34348 программистов и 1751 робот. Сейчас ищет 971 программист ...

Реализация регистрации на Yii-2

Тема в разделе "Yii", создана пользователем roswww, 22 ноя 2016.

  1. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Доброго времени суток,пытаюсь реализовать регист... на фреймворке,вопрос с валидацией решил и она пропускает пароль и капчу ,но база не записывает нового пользователя,..
    Подскажите где именно искать ошику ,если какой файл нужен для коректности я предоставлю...
    С уваж...
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это частый затык, он легко исправляется с помощью з...
     
    Sergey_Tsarev, HeavyLady и denis01 нравится это.
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @roswww что-то мало что понятно в вопросе
    включи debug панель, можно добавить в config/web.php
    PHP:
    1. if (YII_ENV_DEV) {
    2.     // configuration adjustments for 'dev' environment
    3.     $config['bootstrap'][] = 'debug';
    4.     $config['modules']['debug'] = [
    5.             'class' => 'yii\debug\Module',
    6.             'allowedIPs' => ['твой ip']
    7.     ];
    8.  
    9.     $config['bootstrap'][] = 'gii';
    10.     $config['modules']['gii'] = [
    11.             'class' => 'yii\gii\Module',
    12.             'allowedIPs' => ['твой ip']
    13.     ];
    14. }
    что возвращает save() у модели пользователя при регистрации, если я правильно понял?
     
  4. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    --- Добавлено ---
    cпс.попробую ,отпишусь..
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    там в debug панели можно смотреть запросы которые в базу ушли, если у тебя там переадресация, то есть список последних запросов скрипта и уже в нём список запросов в базу можно смотреть
     
  6. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    если не пишет в базу, значит валидацию не прошел, сделай у save(false). Я так иногда делал
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    проверить результат validate() то же нужно

    если там внутри if($model->validate()) находиться save(), то false может не помочь

    @roswww ждём код контроллера в котором регистрация реализована и модель пользователей, модель формы регистрации + можно view регистрации
     
  8. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
  9. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    OK,чуть позже скину,сейчас со смарта.
     
  10. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    OC = Debian-"Jessie",временно работаю с индейцем.
    Происходит следующие при вводе log,pass,подтверждение pass,captcha.
    станичка перезагружается и я оказываюсь на главной ,появляется окно сохранить пароль.
    но Б/Д - не записывает данные нового пользователя, смотрел через DAO и phpmyadmin.

    Вот модель полностью.

    PHP:
    1. <?php
    2.  
    3. namespace app\models;
    4.  
    5. use Yii;
    6.  
    7.  
    8. /**
    9. * This is the model class for table "{{%users}}".
    10. *
    11. * @property integer $id
    12. * @property string $name
    13. * @property string $email
    14. * @property string $password
    15. * @property integer $isActive
    16. * @property string $create_at
    17. */
    18. class Users extends \yii\db\ActiveRecord
    19.  
    20.  
    21. {
    22.  
    23.     public $password2;
    24.     public $verifyCode;
    25.  
    26.     /** public $password2;
    27.      * @inheritdoc
    28.      */
    29.     public static function tableName()
    30.     {
    31.         return '{{%users}}';
    32.     }
    33.  
    34.     /**
    35.      * @inheritdoc
    36.      */
    37.     public function rules()
    38.     {
    39.         return [
    40.             [['name', 'email', 'password'], 'required'],
    41.             [['isActive'], 'integer'],
    42.             [['create_at'], 'safe'],
    43.             [['name'], 'string', 'max' => 15],
    44.             [['email', 'password'], 'string', 'max' => 50],
    45.             [['email'], 'email'],
    46.             [['password2'] ,'compare', 'compareAttribute'=>'password'],
    47.             [['verifyCode'], 'captcha'],
    48.         ];
    49.     }
    50.  
    51.     /**
    52.      * @inheritdoc
    53.      */
    54.     public function attributeLabels()
    55.     {
    56.         return [
    57.             'id' => '#',
    58.             'name' => 'Имя',
    59.             'email' => 'E-mail',
    60.             'password' => 'Пароль',
    61.             'password2' => 'Повторите пароль',
    62.             'isActive' => 'Активен',
    63.             'create_at' => 'Дата обновление',
    64.             'verifyCode' => 'Введите код',
    65.         ];
    66.     }
    67. }
    68. //
    После генирации модели GII сказал вписать в контролер код ,но я его дописал вот фрагмент...


    PHP:
    1. public function actionReg()
    2. {
    3.     $model = new Users();
    4.     //print_r(Yii::$app->request->post());
    5.     if ($model->load(Yii::$app->request->post())) {
    6.         //print_r($model);
    7.         if ($model->validate()) {
    8.            //  form inputs are valid, do something here
    9.             $model->save();
    10.  
    11.    //        Yii::$app->mailer->compose()
    12.    //           ->setTo($model->email)
    13.     //           ->setFrom(Yii::$app->params['admin-email'])
    14.     //           ->setSubject('Registration')
    15.   //             ->setTextBody('Вы успешно зарегистрированы')
    16.   //             ->send();
    17.  
    18.             $this->redirect('/');
    19.         }
    20.     }
    21.  
    22.     return $this->render('reg', [
    23.         'model' => $model,
    24.     ]);
    25. }
    26. //
    если раскоментировать выдаёт ошибку..
    вот вьюшка ,но не совсем понимаю для чего она вам....
    //
    PHP:
    1. <?php
    2.  
    3. use app\components\TextWidget;
    4. use yii\helpers\Html;
    5. use yii\widgets\ActiveForm;
    6. use yii\captcha\Captcha;
    7. /* @var $this yii\web\View */
    8. /* @var $model app\models\Users */
    9. /* @var $form ActiveForm */
    10. ?>
    11. <div class="regist-reg">
    12.     <?php $form = ActiveForm::begin(['id' => 'users']); ?>
    13.  
    14.     <?= $form->field($model, 'name') ?>
    15.     <?= $form->field($model, 'email') ?>
    16.     <?= $form->field($model, 'password')->passwordInput() ?>
    17.     <?= $form->field($model, 'password2')->passwordInput() ?>
    18.     <?= //$form->field($model, 'isActive')->checkbox
    19.     (['class'=>'regActive'])->hint('Активен ли пользователь?') ?>
    20.  
    21.  
    22.        <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
    23.            'template' => '<div class="row"><div class="col-lg-3">{image}</div>
    24.      <div class="col-lg-6">{input}</div>
    25.      </div>',
    26.        ]) ?>
    27.  
    28.       <div class="form-group">
    29.           <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']) ?>
    30.       </div>
    31.       <?php ActiveForm::end(); ?>
    32.       </div>
    //
    Жду ответа...
     
    #10 roswww, 23 ноя 2016
    Последнее редактирование модератором: 23 ноя 2016
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    это тут причём? модель то Activerecord использует, а через debug панель не понятно как смотреть запросы в базу и историю запросов, чтобы смотреть и там запросы в базу?

    доходит то вызова save? если да, то что она возвращает?
     
  12. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    Во первых, попробуй сделать таким образом, вместо этого

    Код (Text):
    1. if ($model->load(Yii::$app->request->post())) {
    2.         //print_r($model);
    3.         if ($model->validate()) {
    4.            //  form inputs are valid, do something here
    5.             $model->save();
    Сделай
    Код (Text):
    1.  
    2.  
    3. if ( $model->load(Yii::$app->request->post()) && $model->validate() ){
    4.  //тут пиши все остальное, имею ввиду $model->save() ну или еще что нибудь. Если не поможет, попробуй сделать $model->save(false);
    5. // и на всякий пожарный в самой модели можно еще попробовать сделать все переменные полей формы публичными, имеется ввиду
    6.  public $password2;
    7.  public $verifyCode;
    8. public $name;
    9. public $phone; // и т.д. Но в самую последнюю очередь. Потом отпишись. Еще как вариант, если это все не поможет, то проверь ошибки при сохранении :
    10.  
    11.  
    12. if(!$model->save())
    13. print_r($model->errors);
    14.  
    15. }
     
    roswww и denis01 нравится это.
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    если включена debug панель, то можно в лог консоли добавить
    PHP:
    1. Yii::trace($model->save(), 'проверка save');
    потом смотрим в debug консоль Yii в раздел log, если там редирект, то в консоле есть история запросов, в ней ищем последний POST.
    можно ещё так
    PHP:
    1. var_dump($model->save());
    лучше пиши в тему свою
    --- Добавлено ---
    @roswww ещё модель формы регистрации покажи
    --- Добавлено ---
    если там yii\db\ActiveRecord то лучше удалить, оставить публичными только те поля, которые отсутствуют в базе, те что в базе их удалить из свойств класса, думаю так ему будет понятнее

    Вот пример модели для формы регистрации
    PHP:
    1. <?php
    2.  
    3. namespace app\models;
    4.  
    5. use Yii;
    6. use yii\db\ActiveRecord;
    7.  
    8. use app\models\Users;
    9.  
    10. class RegistrationForm extends ActiveRecord
    11. {
    12.     /**
    13.      * @inheritdoc
    14.      */
    15.     public static function tableName()
    16.     {
    17.         return '{{%users}}';
    18.     }
    19.  
    20.     /**
    21.      * @inheritdoc
    22.      */
    23.     public function rules()
    24.     {
    25.         return [
    26.             [['username', 'email', 'password'], 'required'],
    27.             [['username', 'email', 'password'], 'string', 'max' => 255],
    28.             [['email'], 'email'],
    29.             ['username', 'uniqUsername'],
    30.             ['email', 'uniqEmail'],
    31.         ];
    32.     }
    33.  
    34.     /**
    35.      * @inheritdoc
    36.      */
    37.     public function attributeLabels()
    38.     {
    39.         return [
    40.             'username' => 'Логин',
    41.             'email' => 'Email',
    42.             'password' => 'Пароль',
    43.         ];
    44.     }
    45.  
    46.     public function uniqUsername($attribute, $params)
    47.     {
    48.         if (!$this->hasErrors()) {
    49.             $user = (new Users)->findByUsername($this->username);
    50.  
    51.             if ($user) {
    52.                 $this->addError($attribute, 'Такой логин уже есть в системе.');
    53.             }
    54.         }
    55.     }
    56.     public function uniqEmail($attribute, $params)
    57.     {
    58.         if (!$this->hasErrors()) {
    59.             $user = (new Users)->findByEmail($this->email);
    60.  
    61.             if ($user) {
    62.                 $this->addError($attribute, 'Такой email уже есть в системе.');
    63.             }
    64.         }
    65.     }
    66.  
    67.     public function beforeSave($insert)
    68.     {
    69.         if (parent::beforeSave($insert)) {
    70.             $this->role = 'user';
    71.             return true;
    72.         } else {
    73.             return false;
    74.         }
    75.     }
    76. }
     
    roswww нравится это.
  14. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    как я понимаю модель формы это ,-Users.php,но есть ещё и такие файлы какой именно нужен?
    /basic/models/ContactForm.php
    /basic/models/LoginForm.php
    /basic/models/User.php
    /basic/models/UserReg.php
    /basic/models/UserRegSeach.php
    /basic/models/Users.php
    /basic/models/UsersSearch.php

    Б\Д начала записывать после того как в save добавил false,но пропускает одинаковые логины и емаилы,когда дописал в rules эти строк
    1. ['username', 'uniqUsername'],
    2. ['email', 'uniqEmail'],
    у меня должно выгледить так:
    ['username', 'uniqname']
    ['email', 'uniqеmail'],
    выдаёт:
    Exception 'ReflectionException' with message 'Class uniqUsername does not exist'
    //
    чтобы указать его через extends,его нужно создать или он уже есть в YII ,тогда какой путь?

     
  15. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    обычно модель форм регистрации и входа делают отдельно.

    uniqUsername это название метода в той же модели, я выше давал код, там есть пример
     
  16. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Cпасибо огромное за помощь.всё работает даже md5 с солью
    но сделал без методов
    вот так в rules прописал ['email', 'unique']
    а письмо на почту с подтверждением регист...не приходит потому что разработка на локальной машине или ещё какая причина может быть.?
     
  17. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    да, не настроено

    лучше использовать Yii::$app->getSecurity()->generatePasswordHash($this->password);

    пример
    PHP:
    1.     public function beforeSave($insert)
    2.     {
    3.         if (parent::beforeSave($insert)) {
    4.             $this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password);
    5.             $this->role = 'user';
    6.             return true;
    7.         } else {
    8.             return false;
    9.         }
    10.     }
    --- Добавлено ---
    config/web.php
    PHP:
    1.         'mailer' => [
    2.             'class' => 'yii\swiftmailer\Mailer',
    3.             // send all mails to a file by default. You have to set
    4.             // 'useFileTransport' to false and configure a transport
    5.             // for the mailer to send real emails.
    6.             'useFileTransport' => true,
    7.         ],
    письма будут в папке runtime/mail
     
  18. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    PHP:
    1. 'useFileTransport'=>true,
    да приходят в папку mail,но пользователям после регистрации не приходит на почту ссылка для подтвеждения и перехода использую такой код в контролере:
    PHP:
    1. public function actionReg()
    2. {
    3.     $model= new Users();
    4.    if ($model->load(Yii::$app->request->post())) {
    5.        if ($model->validate()) {
    6.             $model->save(false);
    7.  
    8.            Yii::$app->mailer->compose()
    9.               ->setTo($model->email)
    10.               ->setFrom(Yii::$app->params['adminEmail'])
    11.                ->setSubject('Registration')
    12.                ->setTextBody('Вы успешно зарегистрированы')
    13.                ->send();
    14.  
    15.           $this->redirect('/index.php?r=regist/post');
    16.         }
    17.     }
     
    #18 roswww, 25 ноя 2016
    Последнее редактирование модератором: 25 ноя 2016
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    так ставь
    PHP:
    1. 'useFileTransport' => false,
    и настраивай SwiftMailer, если локально стоит сервер, то простой способ отправлять через SMTP от gmail/yandex/mailru
     
  20. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    ok -попробую..
     
  21. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Настраивал SwiftMailer,но
    при отправки письма выдают ошибку
    http://joxi.ru/Y2L6LGQI9QRxVr
     
  22. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    undefined index AdminEmail строка 69 о чём говорит? это к Yii2 не относиться, а к PHP, просто нету такого ключа, может с регистром имени ключа напутал ты
     
  23. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    ))
    так и есть.спасибо.
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    [​IMG]
     
    denis01 нравится это.
  25. roswww

    roswww Активный пользователь

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь