Доброго времени суток,пытаюсь реализовать регист... на фреймворке,вопрос с валидацией решил и она пропускает пароль и капчу ,но база не записывает нового пользователя,.. Подскажите где именно искать ошику ,если какой файл нужен для коректности я предоставлю... С уваж...
@roswww что-то мало что понятно в вопросе включи debug панель, можно добавить в config/web.php PHP: if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [ 'class' => 'yii\debug\Module', 'allowedIPs' => ['твой ip'] ]; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', 'allowedIPs' => ['твой ip'] ]; } что возвращает save() у модели пользователя при регистрации, если я правильно понял?
там в debug панели можно смотреть запросы которые в базу ушли, если у тебя там переадресация, то есть список последних запросов скрипта и уже в нём список запросов в базу можно смотреть
проверить результат validate() то же нужно если там внутри if($model->validate()) находиться save(), то false может не помочь @roswww ждём код контроллера в котором регистрация реализована и модель пользователей, модель формы регистрации + можно view регистрации
OC = Debian-"Jessie",временно работаю с индейцем. Происходит следующие при вводе log,pass,подтверждение pass,captcha. станичка перезагружается и я оказываюсь на главной ,появляется окно сохранить пароль. но Б/Д - не записывает данные нового пользователя, смотрел через DAO и phpmyadmin. Вот модель полностью. PHP: <?php namespace app\models; use Yii; /** * This is the model class for table "{{%users}}". * * @property integer $id * @property string $name * @property string $email * @property string $password * @property integer $isActive * @property string $create_at */ class Users extends \yii\db\ActiveRecord { public $password2; public $verifyCode; /** public $password2; * @inheritdoc */ public static function tableName() { return '{{%users}}'; } /** * @inheritdoc */ public function rules() { return [ [['name', 'email', 'password'], 'required'], [['isActive'], 'integer'], [['create_at'], 'safe'], [['name'], 'string', 'max' => 15], [['email', 'password'], 'string', 'max' => 50], [['email'], 'email'], [['password2'] ,'compare', 'compareAttribute'=>'password'], [['verifyCode'], 'captcha'], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => '#', 'name' => 'Имя', 'email' => 'E-mail', 'password' => 'Пароль', 'password2' => 'Повторите пароль', 'isActive' => 'Активен', 'create_at' => 'Дата обновление', 'verifyCode' => 'Введите код', ]; } } // После генирации модели GII сказал вписать в контролер код ,но я его дописал вот фрагмент... PHP: public function actionReg() { $model = new Users(); //print_r(Yii::$app->request->post()); if ($model->load(Yii::$app->request->post())) { //print_r($model); if ($model->validate()) { // form inputs are valid, do something here $model->save(); // Yii::$app->mailer->compose() // ->setTo($model->email) // ->setFrom(Yii::$app->params['admin-email']) // ->setSubject('Registration') // ->setTextBody('Вы успешно зарегистрированы') // ->send(); $this->redirect('/'); } } return $this->render('reg', [ 'model' => $model, ]); } // если раскоментировать выдаёт ошибку.. вот вьюшка ,но не совсем понимаю для чего она вам.... // PHP: <?php use app\components\TextWidget; use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\captcha\Captcha; /* @var $this yii\web\View */ /* @var $model app\models\Users */ /* @var $form ActiveForm */ ?> <div class="regist-reg"> <?php $form = ActiveForm::begin(['id' => 'users']); ?> <?= $form->field($model, 'name') ?> <?= $form->field($model, 'email') ?> <?= $form->field($model, 'password')->passwordInput() ?> <?= $form->field($model, 'password2')->passwordInput() ?> <?= //$form->field($model, 'isActive')->checkbox (['class'=>'regActive'])->hint('Активен ли пользователь?') ?> <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [ 'template' => '<div class="row"><div class="col-lg-3">{image}</div> <div class="col-lg-6">{input}</div> </div>', ]) ?> <div class="form-group"> <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?> </div> // Жду ответа...
это тут причём? модель то Activerecord использует, а через debug панель не понятно как смотреть запросы в базу и историю запросов, чтобы смотреть и там запросы в базу? доходит то вызова save? если да, то что она возвращает?
Во первых, попробуй сделать таким образом, вместо этого Код (Text): if ($model->load(Yii::$app->request->post())) { //print_r($model); if ($model->validate()) { // form inputs are valid, do something here $model->save(); Сделай Код (Text): if ( $model->load(Yii::$app->request->post()) && $model->validate() ){ //тут пиши все остальное, имею ввиду $model->save() ну или еще что нибудь. Если не поможет, попробуй сделать $model->save(false); // и на всякий пожарный в самой модели можно еще попробовать сделать все переменные полей формы публичными, имеется ввиду public $password2; public $verifyCode; public $name; public $phone; // и т.д. Но в самую последнюю очередь. Потом отпишись. Еще как вариант, если это все не поможет, то проверь ошибки при сохранении : if(!$model->save()) print_r($model->errors); }
если включена debug панель, то можно в лог консоли добавить PHP: Yii::trace($model->save(), 'проверка save'); потом смотрим в debug консоль Yii в раздел log, если там редирект, то в консоле есть история запросов, в ней ищем последний POST. можно ещё так PHP: var_dump($model->save()); exit; лучше пиши в тему свою --- Добавлено --- @roswww ещё модель формы регистрации покажи --- Добавлено --- если там yii\db\ActiveRecord то лучше удалить, оставить публичными только те поля, которые отсутствуют в базе, те что в базе их удалить из свойств класса, думаю так ему будет понятнее Вот пример модели для формы регистрации PHP: <?php namespace app\models; use Yii; use yii\db\ActiveRecord; use app\models\Users; class RegistrationForm extends ActiveRecord { /** * @inheritdoc */ public static function tableName() { return '{{%users}}'; } /** * @inheritdoc */ public function rules() { return [ [['username', 'email', 'password'], 'required'], [['username', 'email', 'password'], 'string', 'max' => 255], [['email'], 'email'], ['username', 'uniqUsername'], ['email', 'uniqEmail'], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'username' => 'Логин', 'email' => 'Email', 'password' => 'Пароль', ]; } public function uniqUsername($attribute, $params) { if (!$this->hasErrors()) { $user = (new Users)->findByUsername($this->username); if ($user) { $this->addError($attribute, 'Такой логин уже есть в системе.'); } } } public function uniqEmail($attribute, $params) { if (!$this->hasErrors()) { $user = (new Users)->findByEmail($this->email); if ($user) { $this->addError($attribute, 'Такой email уже есть в системе.'); } } } public function beforeSave($insert) { if (parent::beforeSave($insert)) { $this->role = 'user'; return true; } else { return false; } } }
как я понимаю модель формы это ,-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 эти строк ['username', 'uniqUsername'], ['email', 'uniqEmail'], у меня должно выгледить так: ['username', 'uniqname'] ['email', 'uniqеmail'], выдаёт: Exception 'ReflectionException' with message 'Class uniqUsername does not exist' // чтобы указать его через extends,его нужно создать или он уже есть в YII ,тогда какой путь?
обычно модель форм регистрации и входа делают отдельно. uniqUsername это название метода в той же модели, я выше давал код, там есть пример
Cпасибо огромное за помощь.всё работает даже md5 с солью но сделал без методов вот так в rules прописал ['email', 'unique'] а письмо на почту с подтверждением регист...не приходит потому что разработка на локальной машине или ещё какая причина может быть.?
да, не настроено лучше использовать Yii::$app->getSecurity()->generatePasswordHash($this->password); пример PHP: public function beforeSave($insert) { if (parent::beforeSave($insert)) { $this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password); $this->role = 'user'; return true; } else { return false; } } --- Добавлено --- config/web.php PHP: 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], письма будут в папке runtime/mail
PHP: 'useFileTransport'=>true, да приходят в папку mail,но пользователям после регистрации не приходит на почту ссылка для подтвеждения и перехода использую такой код в контролере: PHP: public function actionReg() { $model= new Users(); if ($model->load(Yii::$app->request->post())) { if ($model->validate()) { $model->save(false); Yii::$app->mailer->compose() ->setTo($model->email) ->setFrom(Yii::$app->params['adminEmail']) ->setSubject('Registration') ->setTextBody('Вы успешно зарегистрированы') ->send(); $this->redirect('/index.php?r=regist/post'); } }
так ставь PHP: 'useFileTransport' => false, и настраивай SwiftMailer, если локально стоит сервер, то простой способ отправлять через SMTP от gmail/yandex/mailru
undefined index AdminEmail строка 69 о чём говорит? это к Yii2 не относиться, а к PHP, просто нету такого ключа, может с регистром имени ключа напутал ты