TemKa_SD 9 08/15/18 08:48 (изменено) Здравствуйте. Я создал функцию регистрации на игровом сервере через сайт. Пожалуйста, посмотрите код, правильно ли всё реализовано, функция рабочая, интересует на сколько кривой код получился. protected function addpvpgn() { if(! \IPS\Settings::i()->pvpgn_enabled) { return NULL; } \IPS\Session::i()->csrfCheck(); $db = \IPS\sharedstats\DB::get(); $account_pvpgn = $db::i('stats')->select('id, status, name, active, server, created', 'stats_forum_connections', [ ['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games'] ]); if(count($account_pvpgn) == 0) { $form = new \IPS\Helpers\Form(); $form->addHeader('sharedstats_pvpgn_account_add'); $form->add(new \IPS\Helpers\Form\Text('sharedstats_pvpgn_account_add_name', null, true, array())); $form->add( new \IPS\Helpers\Form\Password( 'sharedstats_pvpgn_account_add_password', NULL, TRUE, array() ) ); $form->add( new \IPS\Helpers\Form\Password( 'sharedstats_pvpgn_account_add_password2', NULL, TRUE, array( 'confirm' => 'sharedstats_pvpgn_account_add_password' ) ) ); if ($values = $form->values()) { try { $pvpgn = new \IPS\sharedstats\Records\PvPGN\BNET; $pvpgnHash = new \IPS\sharedstats\DbIntegration\Hash; $friend = new \IPS\sharedstats\Records\PvPGN\friend; $profile = new \IPS\sharedstats\Records\PvPGN\profile; $Record = new \IPS\sharedstats\Records\PvPGN\Record; $pvpgn->uid = \IPS\Settings::i()->connect_master ? \IPS\Member::loggedIn()->member_id : \IPS\Member::loggedIn()->ipsconnect_id; $pvpgn->acct_username = $values['sharedstats_pvpgn_account_add_name']; $pvpgn->username = mb_strtolower($values['sharedstats_pvpgn_account_add_name']); $pvpgn->acct_userid = \IPS\Settings::i()->connect_master ? \IPS\Member::loggedIn()->member_id : \IPS\Member::loggedIn()->ipsconnect_id; $pvpgn->acct_passhash1 = $pvpgnHash->getHash($values['sharedstats_pvpgn_account_add_password']); $pvpgn->acct_email = \IPS\Member::loggedIn()->email; $pvpgn->save(); $friend->uid = \IPS\Member::loggedIn()->member_id; $friend->save(); $profile->uid = \IPS\Member::loggedIn()->member_id; $profile->save(); $Record->uid = \IPS\Member::loggedIn()->member_id; $Record->save(); $conn = new \IPS\sharedstats\Records\ForumConnection; $conn->name = mb_strtolower($values['sharedstats_pvpgn_account_add_name']); $conn->server = 'Server.WC3.Games'; $conn->member_id = \IPS\Member::loggedIn()->member_id; $conn->status = 'approved'; $conn->save(); \IPS\Output::i() ->redirect(\IPS\Http\Url::internal('app=sharedstats&module=stats&controller=BNetAccount', 'front') , 'sharedstats_pvpgn_account_add_added'); } catch(\IPS\Db\Exception $e) { if ($e->getCode() !== 1062) { throw $e; } $form->error = 'Такой игровой логин уже существует, выберите другой.'; } } /* Display */ \IPS\Output::i()->title = \IPS\Member::loggedIn() ->language() ->addToStack('sharedstats_pvpgn_account_add_name'); if (\IPS\Request::i()->isAjax()) { \IPS\Output::i()->output = $form->customTemplate(array( call_user_func_array(array( \IPS\Theme::i() , 'getTemplate' ) , array( 'forms', 'core' )) , 'popupTemplate' )); } else { \IPS\Output::i()->output = $form; } } } И еще вопрос, как вывести в шаблон результат переменной: $account_pvpgn = $db::i('stats')->select('id, status, name, active, server, created', 'stats_forum_connections', [ ['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games'] ]);Точнее, саму переменную, чтобы использовать условие if, если $account_pvpgn === 0 то отображать кнопку и форму не нужно. Изменено 15 августа 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 09:31 Чтобы не плодить темы, задам сюда. Как в форме добавить валидацию для пароля? Необходимо максимальное значение, с минимальным разобрался. $form->add( new \IPS\Helpers\Form\Password( 'sharedstats_pvpgn_account_add_password', '', TRUE, array( 'confirm' => 'sharedstats_pvpgn_account_add_password2', 'showMeter' => \IPS\Settings::i()->password_strength_meter, 'minimumStrength' => 3, 'bypassProfanity' => TRUE ) ) ); Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 09:51 Я создал функцию регистрации на игровом сервере через сайт.Возвращайте ошибку, а не null. Юзер должен знать почему у него нет доступа к форме. Это $account_pvpgn = $db::i('stats')->select('id, status, name, active, server, created', 'stats_forum_connections', [ ['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games'] ]); if(count($account_pvpgn) == 0)можно заменить на if($db::i('stats')->select('COUNT(*)', 'stats_forum_connections', [['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games']])->first() == 0) И вообще вынести его вышеif($db::i('stats')->select('COUNT(*)', 'stats_forum_connections', [['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games']])->first() != 0) { // Вывести ошибку } // Форма И еще вопрос, как вывести в шаблон результат переменнойНайти шаблон и добавить новый параметр в <ips:template parameters="...." /> Чтобы не плодить темы, задам сюда. Как в форме добавить валидацию для пароля? Необходимо максимальное значение, с минимальным разобрался. 'minimumStrength' => 3 Это не минимальное значение.Если нужны мин/макс символов, используйте 'minLength' => 1, // Minimum number of characters. NULL is no minimum. Default is NULL. 'maxLength' => 255, // Maximum number of characters. NULL is no maximum. Default is NULL. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 09:57 (изменено) Найти шаблон и добавить новый параметр в <ips:template parameters="...." />Это пробовал, не работало. Указывал $account_pvpgn и выводил в шаблоне {$account_pvpgn} писало что не определена переменная, попробую еще сейчас. 'minimumStrength' => 3 Это не минимальное значение. Минимальное значение, см скрин. Ой, сразу спрошу, уже искал так и не нашел. Как у кнопки SAVE изменить название? Изменено 15 августа 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 10:03 Это пробовал, не работало. Указывал $account_pvpgn и выводил в шаблоне {$account_pvpgn} писало что не определена переменная, попробую еще сейчас. Нужно еще в php-файле добавить, где этот шаблон вызывается Минимальное значение, см скрин.Это мин. кол-во символовminimumStrength - мин. значение "силометра" Ой, сразу спрошу, уже искал так и не нашел. Как у кнопки SAVE изменить название?$form = new \IPS\Helpers\Form('form', 'Отправить'); Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 10:21 Расскажите пожалуйста про параметры, в регистрации форума подтверждение пароля загорается зеленым, если пароли совпадают, перенес значения из регистрации форума себе в форму, у меня так не работает ((( $form = new \IPS\Helpers\Form( 'form', 'register_button', NULL, array( 'data-controller' => 'sharedstats.front.stats.BNetAccount') ); $form->addHeader('sharedstats_pvpgn_account_add'); $form->add( new \IPS\Helpers\Form\Text( 'sharedstats_pvpgn_account_add_name', NULL, TRUE, array( 'accountUsername' => TRUE ) ) ); $form->add( new \IPS\Helpers\Form\Password( 'sharedstats_pvpgn_account_add_password', '', TRUE, array( 'confirm' => 'sharedstats_pvpgn_account_add_password2', 'minLength' => 3, 'maxLength' => 15, 'bypassProfanity' => TRUE, 'checkStrength' => TRUE,'showMeter' => \IPS\Settings::i()->password_strength_meter ) ) ); Для чего используется вот это значения:'data-controller' => 'sharedstats.front.stats.BNetAccount''accountUsername' => TRUE'bypassProfanity' => TRUE Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 10:36 Т.е через else форму выводить? Ну да, так по лучше будет. Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 11:02 перенес значения из регистрации форума себе в форму, у меня так не работает (((Так у Вас одно поле для пароля. Что с чем должно сравниваться? 'data-controller' => 'sharedstats.front.stats.BNetAccount'Добавляется в форму атрибут data-controller со значением sharedstats.front.stats.BNetAccount'accountUsername' => TRUEВведенное значение будет проверяться на предмет существования имени юзера, и если юзер существует, то получите ошибку. Также проверяется на длину и запрещенные символы. 'bypassProfanity' => TRUEНе применять фильтры слов Т.е через else форму выводить? Ну да, так по лучше будет.Не нужно elseif($db::i('stats')->select('COUNT(*)', 'stats_forum_connections', [['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games']])->first() != 0) { \IPS\Output::i()->error('no_module_permission', 'Код_ошибки', 403); } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 11:09 Так у Вас одно поле для пароля. Что с чем должно сравниваться? Блин, добавил сюда одно. Ну вот так в данный момент выглядет форма. Щас буду копать как проверить логин у себя в игровой БД ))) protected function addpvpgn() { if(! \IPS\Settings::i()->pvpgn_enabled) { \IPS\Output::i()->error('no_module_permission', '123', 403); } \IPS\Session::i()->csrfCheck(); $db = \IPS\sharedstats\DB::get(); if($db::i('stats')->select('COUNT(*)', 'stats_forum_connections', [['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games']])->first() != 0) { \IPS\Output::i()->error('no_module_permission', '123', 403); } $form = new \IPS\Helpers\Form( 'form', 'register_button', NULL, array( 'data-controller' => 'sharedstats.front.stats.BNetAccount') ); $form->addHeader('sharedstats_pvpgn_account_add'); $form->add( new \IPS\Helpers\Form\Text( 'sharedstats_pvpgn_account_add_name', NULL, TRUE, array( 'accountUsername' => TRUE ) ) ); $form->add( new \IPS\Helpers\Form\Password( 'sharedstats_pvpgn_account_add_password', '', TRUE, array( 'confirm' => 'sharedstats_pvpgn_account_add_password2', 'minLength' => 3, 'maxLength' => 15 ) ) ); $form->add( new \IPS\Helpers\Form\Password( 'sharedstats_pvpgn_account_add_password2', '', TRUE, array( 'minLength' => 3, 'maxLength' => 15 ) ) ); if ($values = $form->values()) { try { $pvpgn = new \IPS\sharedstats\Records\PvPGN\BNET; $pvpgnHash = new \IPS\sharedstats\DbIntegration\Hash; $friend = new \IPS\sharedstats\Records\PvPGN\friend; $profile = new \IPS\sharedstats\Records\PvPGN\profile; $Record = new \IPS\sharedstats\Records\PvPGN\Record; $pvpgn->uid = \IPS\Settings::i()->connect_master ? \IPS\Member::loggedIn()->member_id : \IPS\Member::loggedIn()->ipsconnect_id; $pvpgn->acct_username = $values['sharedstats_pvpgn_account_add_name']; $pvpgn->username = mb_strtolower($values['sharedstats_pvpgn_account_add_name']); $pvpgn->acct_userid = \IPS\Settings::i()->connect_master ? \IPS\Member::loggedIn()->member_id : \IPS\Member::loggedIn()->ipsconnect_id; $pvpgn->acct_passhash1 = $pvpgnHash->getHash($values['sharedstats_pvpgn_account_add_password']); $pvpgn->acct_email = \IPS\Member::loggedIn()->email; $pvpgn->save(); $friend->uid = \IPS\Member::loggedIn()->member_id; $friend->save(); $profile->uid = \IPS\Member::loggedIn()->member_id; $profile->save(); $Record->uid = \IPS\Member::loggedIn()->member_id; $Record->save(); $conn = new \IPS\sharedstats\Records\ForumConnection; $conn->name = mb_strtolower($values['sharedstats_pvpgn_account_add_name']); $conn->server = 'Server.WC3.Games'; $conn->member_id = \IPS\Member::loggedIn()->member_id; $conn->status = 'approved'; $conn->save(); \IPS\Output::i() ->redirect(\IPS\Http\Url::internal('app=sharedstats&module=stats&controller=BNetAccount', 'front') , 'sharedstats_pvpgn_account_add_added'); } catch(\IPS\Db\Exception $e) { if ($e->getCode() !== 1062) { throw $e; } $form->error = 'Такой игровой логин уже существует, выберите другой.'; } } /* Display */ \IPS\Output::i()->title = \IPS\Member::loggedIn() ->language() ->addToStack('sharedstats_pvpgn_account_add_name'); if (\IPS\Request::i()->isAjax()) { \IPS\Output::i()->output = $form->customTemplate(array( call_user_func_array(array( \IPS\Theme::i() , 'getTemplate' ) , array( 'forms', 'core' )) , 'popupTemplate' )); } else { \IPS\Output::i()->output = $form; } } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 11:11 И еще, на счет ошибки. Я понял, только мне она вообще не нужна. Если аккаунт уже есть на сервере, мне просто нужно убрать форму с сайта и заменить её на изменение пароля например. Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 11:26 Ну вот так в данный момент выглядет формаИ в чем проблема?Укажите 2 разных пароля, отправьте форму и посмотрите результат Щас буду копать как проверить логин у себя в игровой БД )))У Вас же в коде есть $form->error = 'Такой игровой логин уже существует, выберите другой.'; Значит, где-то должны выбрасываться исключение. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 11:42 (изменено) И в чем проблема?Укажите 2 разных пароля, отправьте форму и посмотрите результатВы не поняли, я хочу зелененькое поле как на скрине. У Вас же в коде есть $form->error = 'Такой игровой логин уже существует, выберите другой.'; Значит, где-то должны выбрасываться исключение. Так это если ошибка MYSQL вылазит 1062, а я про проверку формы, когда вводишь логин, чтобы проверялось наличие в БД. ...................... Или подождите, может всё это не работает в форме, а только при полной регистрации? Изменено 15 августа 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 11:49 (изменено) Разобрался, здесь идет подключение JS по name="". Как лучше делать? Копировать JS код в мой компонент и изменять идентификаторы, или использовать идентификаторы IPS? Изменено 15 августа 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 08/15/18 12:09 Не хочет. Надо же подключать валидацию через стили, Как на скрине выше? Поделиться сообщением Ссылка на сообщение
newbie 1723 08/15/18 12:21 Нужно добавить контроллер core.front.system.register и поля должны называться password и password_confirm$form = new \IPS\Helpers\Form( 'form', 'register_button', NULL, array( 'data-controller' => 'core.front.system.register') ); $form->add( new \IPS\Helpers\Form\Password( 'password', '', TRUE, array( 'minLength' => 3, 'maxLength' => 15 ) ) ); $form->add( new \IPS\Helpers\Form\Password( 'password_confirm', '', TRUE, array( 'confirm' => 'password', 'minLength' => 3, 'maxLength' => 15 ) ) ); Поделиться сообщением Ссылка на сообщение