TemKa_SD Posted August 15, 2018 Share Posted August 15, 2018 (edited) Здравствуйте. Я создал функцию регистрации на игровом сервере через сайт. Пожалуйста, посмотрите код, правильно ли всё реализовано, функция рабочая, интересует на сколько кривой код получился. 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 то отображать кнопку и форму не нужно. Edited August 15, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 Чтобы не плодить темы, задам сюда. Как в форме добавить валидацию для пароля? Необходимо максимальное значение, с минимальным разобрался. $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 ) ) ); Link to comment Share on other sites More sharing options...
newbie Posted August 15, 2018 Share Posted August 15, 2018 Я создал функцию регистрации на игровом сервере через сайт.Возвращайте ошибку, а не 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. Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 (edited) Найти шаблон и добавить новый параметр в <ips:template parameters="...." />Это пробовал, не работало. Указывал $account_pvpgn и выводил в шаблоне {$account_pvpgn} писало что не определена переменная, попробую еще сейчас. 'minimumStrength' => 3 Это не минимальное значение. Минимальное значение, см скрин. Ой, сразу спрошу, уже искал так и не нашел. Как у кнопки SAVE изменить название? Edited August 15, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
newbie Posted August 15, 2018 Share Posted August 15, 2018 Это пробовал, не работало. Указывал $account_pvpgn и выводил в шаблоне {$account_pvpgn} писало что не определена переменная, попробую еще сейчас. Нужно еще в php-файле добавить, где этот шаблон вызывается Минимальное значение, см скрин.Это мин. кол-во символовminimumStrength - мин. значение "силометра" Ой, сразу спрошу, уже искал так и не нашел. Как у кнопки SAVE изменить название?$form = new \IPS\Helpers\Form('form', 'Отправить'); Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 Расскажите пожалуйста про параметры, в регистрации форума подтверждение пароля загорается зеленым, если пароли совпадают, перенес значения из регистрации форума себе в форму, у меня так не работает ((( $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 Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 Т.е через else форму выводить? Ну да, так по лучше будет. Link to comment Share on other sites More sharing options...
newbie Posted August 15, 2018 Share Posted August 15, 2018 перенес значения из регистрации форума себе в форму, у меня так не работает (((Так у Вас одно поле для пароля. Что с чем должно сравниваться? '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); } Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 Так у Вас одно поле для пароля. Что с чем должно сравниваться? Блин, добавил сюда одно. Ну вот так в данный момент выглядет форма. Щас буду копать как проверить логин у себя в игровой БД ))) 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; } } Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 И еще, на счет ошибки. Я понял, только мне она вообще не нужна. Если аккаунт уже есть на сервере, мне просто нужно убрать форму с сайта и заменить её на изменение пароля например. Link to comment Share on other sites More sharing options...
newbie Posted August 15, 2018 Share Posted August 15, 2018 Ну вот так в данный момент выглядет формаИ в чем проблема?Укажите 2 разных пароля, отправьте форму и посмотрите результат Щас буду копать как проверить логин у себя в игровой БД )))У Вас же в коде есть $form->error = 'Такой игровой логин уже существует, выберите другой.'; Значит, где-то должны выбрасываться исключение. Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 (edited) И в чем проблема?Укажите 2 разных пароля, отправьте форму и посмотрите результатВы не поняли, я хочу зелененькое поле как на скрине. У Вас же в коде есть $form->error = 'Такой игровой логин уже существует, выберите другой.'; Значит, где-то должны выбрасываться исключение. Так это если ошибка MYSQL вылазит 1062, а я про проверку формы, когда вводишь логин, чтобы проверялось наличие в БД. ...................... Или подождите, может всё это не работает в форме, а только при полной регистрации? Edited August 15, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 (edited) Разобрался, здесь идет подключение JS по name="". Как лучше делать? Копировать JS код в мой компонент и изменять идентификаторы, или использовать идентификаторы IPS? Edited August 15, 2018 by TemKa_SD Link to comment Share on other sites More sharing options...
TemKa_SD Posted August 15, 2018 Author Share Posted August 15, 2018 Не хочет. Надо же подключать валидацию через стили, Как на скрине выше? Link to comment Share on other sites More sharing options...
newbie Posted August 15, 2018 Share Posted August 15, 2018 Нужно добавить контроллер 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 ) ) ); Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now