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 Вопросы по работе с системой Форма входа