Re: Форма входа
Ну вот значит всё работает. openpass записывается Ваш созданный пароль который генерируется.
Вам осталось проверить ещё на приходящую из запроса Вашу галочку. Что у Вас не работает?
Форум ReadyScript Вопросы по работе с системой Форма входа
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Ну вот значит всё работает. openpass записывается Ваш созданный пароль который генерируется.
Вам осталось проверить ещё на приходящую из запроса Вашу галочку. Что у Вас не работает?
Ну вот значит всё работает. openpass записывается Ваш созданный пароль который генерируется.
Вам осталось проверить ещё на приходящую из запроса Вашу галочку. Что у Вас не работает?
А для чего проверять на это галочку?
А на каком же тогда этапе пароль должен записываться в поле pass?
Не понимаю что то я
А для чего проверять на это галочку?
Потому, что запись в пользователя в БД может происходить и через админку. Вот представьте вы создаёте в админ панели пользователя указываете у него пароль. А он потом не подходит. Для этого и нужна проверка на галочку. Или программно создаёте пользователя, хотите присвоить ему пароль и никак не получается. Проверьте на параметр в посте.
А на каком же тогда этапе пароль должен записываться в поле pass?
Не понимаю что то я
На этом этапе Вы и передаёте пароль для записи. Просто генерируете его самостоятельно. Ведь Вы же так хотели.
Да именно так, но если смотреть в var_dump то
["pass"]=>
NULL
в базу ничего не передается, почему?
значит мне в форму регистрации нужно вставить данный код?
а что тогда использовать вместо? <input type="checkbox" name="reg_autologin" {if $order.reg_autologin}checked{/if} value="1" id="reg-autologin">
<tr>
<td class="key">Пароль:</td>
<td class="value">
<input type="checkbox" name="reg_autologin" {if $order.reg_autologin}checked{/if} value="1" id="reg-autologin">
<label for="reg-autologin">Получить автоматически на e-mail</label>
<div class="help">Нужен для проверки статуса заказа, обращения в поддержку, входа в кабинет</div>
<div id="manual-login" {if $order.reg_autologin}style="display:none"{/if}>
<div class="inline f">
{$order.__reg_openpass->formView(['form'])}
<div class="help">Пароль</div>
</div>
<div class="inline">
{$order.__reg_pass2->formView()}
<div class="help">Повтор пароля</div>
</div>
<div class="inline">
<div class="form-error">{$order->getErrorsByForm('reg_openpass', ', ')}</div>
</div>
</div>
</td>
</tr>
Потому что в объектах используются функции beforeWrite(перед записью в БД) и afterWrite(После записи в БД) в которых и происходят все дейтсвия. Если вы откроете класс \Users\Model\Orm\User (/modules/users/model/orm/user.inc.php) и посмотрите в метод
beforeWrite.
То там задаётся сам пароль вот так:
if (!empty($this['openpass'])) {
$this['pass'] = self::cryptPass($this['openpass']);
}
Т.е. если задан openpass, что Вы и делаете в хуке, то pass будет сформирован из него.
Мы не храним в открытом виде пароли в БД.
значит мне в форму регистрации нужно вставить данный код?
а что тогда использовать вместо? <input type="checkbox" name="reg_autologin" {if $order.reg_autologin}checked{/if} value="1" id="reg-autologin">
Да, только проверка там не нужна на if ведь объекта $order просто в том шаблоне у Вас не существует. И сделайте name другой например просто my_autologin, чтобы не пересеклось ни где. А потом в хуке на него и проверите.
Вставляю следующий код в свою форму но пароль не записывается в бд. где искать ошибку
<tr>
<td class="key">Пароль:</td>
<td class="value">
<input type="checkbox" name="my_autologin" checked value="1" id="my-autologin">
<label for="my-autologin">Получить автоматически на e-mail</label>
<div class="help">Нужен для проверки статуса заказа, обращения в поддержку, входа в кабинет</div>
<div id="manual-login" style="display:none">
<div class="inline f">
<input name="openpass" value="" maxlength="70" size="18" type="password" />
<div class="help">Пароль</div>
</div>
<div class="inline">
<input name="openpass_confirm" value="" maxlength="70" size="18" type="password" />
<div class="help">Повтор пароля</div>
</div>
</div>
</td>
</tr>
Попробуйте в Вашем хуке beforeWrite выполнить сразу после установки openpass
/**
* Действия перед записью объекта пользователя
*
* @param array $data - Массив с данными
*/
public static function ormBeforeWriteUsersUser($data){
/**
* @var \User\Model\Orm\User
*/
$user = $data['orm'];
$flag = $data['flag']; //Флаг insert или update
if ($flag==$user::INSERT_FLAG){ //Делаем только на создание (insert)
$my_autologin = \RS\Http\Request::commonInstance()->request('my_autologin', TYPE_INTEGER, false); //Получаем флаг из запроса
if ($my_autologin){ //Если флаг стоит
$user['pass'] = $user::cryptPass(\RS\Helper\Tools::generatePassword(6));
}
}
}
Я думаю, тогда 100% всё будет как надо.
Попробуйте в Вашем хуке beforeWrite выполнить сразу после установки openpass
/** * Действия перед записью объекта пользователя * * @param array $data - Массив с данными */ public static function ormBeforeWriteUsersUser($data){ /** * @var \User\Model\Orm\User */ $user = $data['orm']; $flag = $data['flag']; //Флаг insert или update if ($flag==$user::INSERT_FLAG){ //Делаем только на создание (insert) $my_autologin = \RS\Http\Request::commonInstance()->request('my_autologin', TYPE_INTEGER, false); //Получаем флаг из запроса if ($my_autologin){ //Если флаг стоит $user['pass'] = $user::cryptPass(\RS\Helper\Tools::generatePassword(6)); } } }
Я думаю, тогда 100% всё будет как надо.
Вот сейчас пароль записывается в БД, но на почту поле пароль приходит пустое.
Что же получается нужен хук после записи обьекта?Вот я его создал, но допустил ошибку и выдает ошибку 500 при регистрации
/**
* Действия после записи объекта
*
* @param string $flag - insert или update
*/
public static function ormAfterWriteUsersUser($data){
/**
* @var \User\Model\Orm\User
*/
$user = $data['orm'];
$flag = $data['flag']; //Флаг insert или update
if ($flag == self::INSERT_FLAG && \Setup::$INSTALLED && !$this['no_send_notice']) {
// Уведомление пользователю
$user = new \Users\Model\Notice\UserRegisterUser;
$user->init($this, $this['openpass']);
\Alerts\Model\Manager::send($user);
}
}
Чтобы видеть ошибки, а не 500-ю включите отображение ошибок:
http://readyscript.ru/faq/#faq-errors
$user = $data['orm'];
$flag = $data['flag']; //Флаг insert или update
if ($flag == self::INSERT_FLAG && \Setup::$INSTALLED && !$this['no_send_notice']) {
// Уведомление пользователю
$user = new \Users\Model\Notice\UserRegisterUser;
$user->init($this, $this['openpass']);
\Alerts\Model\Manager::send($user);
Что касается уведомления, то Вы переприсвоили переменной $user, объект самого уведомления и передали объект самого себя, а не пользователя. Зачем?
Вам в Уведомдение нужно передать объект пользователя который вы получаете из объекта $data выше.
Нужно же так:)
$user = $data['orm'];
$flag = $data['flag']; //Флаг insert или update
if ($flag == $user::INSERT_FLAG && \Setup::$INSTALLED && !$user['no_send_notice']) {
// Уведомление пользователю
$user_notice = new \Users\Model\Notice\UserRegisterUser;
$user_notice->init($user, $user['openpass']);
\Alerts\Model\Manager::send($user_notice);
Не помогло, все равно не показывает пароль. Единственное что стало, так это два письма приходить
Можно конечно сделать так, но им тогда хеш будет зашифрованный пароль присылаться.
Какой еще есть вариант?
$user['openpass'] = $user['pass'] = $user::cryptPass(\RS\Helper\Tools::generatePassword(6));
Да точно! здесь же у нас идёт на прямую запись. Я думаю Вот так поможет.
изменить
$user['pass'] = $user::cryptPass(\RS\Helper\Tools::generatePassword(6));
на
$user['openpass'] = \RS\Helper\Tools::generatePassword(6);
$user['pass'] = $user::cryptPass();
Ато у нас получается [b]openpass[/b] поэтому и пустой, что нигде не присваивается.
Да, так работает И сразу же исчесла проблема с переадрисацией на страницу регистрации. Теперь все как надо, сразу авторизовывает.
Только почему то регистрация работает, если только заккоментирована вот эта строчка из user.inc.php
Checker' => array(array(__CLASS__, 'checkOpenPassword'), '')
Не хватает какой то проверки?
Он вызывает из этого же класса функцию checkOpenPassword, посмотрите что в ней.
Заметил следующий баг. Если выйти из профиля и попытатся зайти, пишет неверный e-mail или пароль. А если не вводить пароль то авторизовывает. И это только с теми аккаунтами, которые зарегистрированы данным методом(автоматическим паролем)
Ну всё дело в том я так думаю, про то что я говорил, что нужно проверять на флажок приходящий из поста о том, что нужно генерировать пароль.
Вы можете свой код закомментировать и попробовать туже схему. Я думаю всё будет как надо. Т.е. Вам не хватает проверок на то, что именно сейчас делается с пользователем. Попробуйте завардампить объекты в Вашем коде и приходящий POST или GET запрос, чтобы проанализировать.
Ну всё дело в том я так думаю, про то что я говорил, что нужно проверять на флажок приходящий из поста о том, что нужно генерировать пароль.
Вы можете свой код закомментировать и попробовать туже схему. Я думаю всё будет как надо. Т.е. Вам не хватает проверок на то, что именно сейчас делается с пользователем. Попробуйте завардампить объекты в Вашем коде и приходящий POST или GET запрос, чтобы проанализировать.
Думаю я с этим уже не справлюсь. Давайте тогда по другому решим этот вопрос
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум ReadyScript Вопросы по работе с системой Форма входа