Опубликовано: 15 августа 20187 г Здравствуйте. Я создал функцию регистрации на игровом сервере через сайт. Пожалуйста, посмотрите код, правильно ли всё реализовано, функция рабочая, интересует на сколько кривой код получился. 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 августа 20187 г пользователем TemKa_SD
Опубликовано: 16 августа 20187 г Не пойму, как идет проверка на наличие логина в базе данных. В файле \applications\core\modules\front\system\register.php вроде нету, а подключение core.front.system.register только в нем и одном js файле. Вам оно зачем, если Ваши поля не связаны с именами юзеров?
Опубликовано: 16 августа 20187 г Автор Я хочу сделать проверку логина в своей внешней базе (игрового ника).
Опубликовано: 16 августа 20187 г Я хочу сделать проверку логина в своей внешней базе (игрового ника).Пишите подробнее, где и что должно быть.
Опубликовано: 16 августа 20187 г Автор Вот код модуля по регистрации игрового ника во внешней базе денных, функция addpvpgn.Я хочу сделать чтобы при вводе логина (игровой ник во внешней БД) проверялось его наличие, и в случае нахождения выдавало ошибку как на скрине.BNetAccount.php
Опубликовано: 16 августа 20187 г Я хочу сделать чтобы при вводе логина (игровой ник во внешней БД) проверялось его наличие, и в случае нахождения выдавало ошибку как на скрине.Без нажатия на кнопку? Ввел и получил результат?Если так, то там используется ajax. См. /** * Fires an ajax request to check whether the username is already in use * Updates the result element depending on the result * * @returns {void} */ _doCheck: function (type, field) {
Опубликовано: 16 августа 20187 г Автор Не, не для моих это мозгов. Я думал будет что-то примерно: $form->add( new \IPS\Helpers\Form\Text( 'username', NULL, TRUE, array( 'accountUsername' => $переменная, в которой записан результат выборки из БД ) ) );
Опубликовано: 16 августа 20187 г 'accountUsername' => $переменная, в которой записан результат выборки из БДЗабудьте про accountUsernameНе, не для моих это мозговСделайте на submit. Юзер отправил форму -> идет проверка на ник. $form->add( new \IPS\Helpers\Form\Text( 'username', NULL, TRUE, array(), function ($value) { $nick = false; // Проверяете игровой ник во внешней БД if (!$nick) { throw new \DomainException('Указанного ника не существует'); } } ) );
Опубликовано: 16 августа 20187 г Кстати, у Вас там еще пароли фигурируют, которые тоже должны проверяться.
Опубликовано: 16 августа 20187 г Автор Большое спасибо, работает. А нельзя сделать, чтобы форма не перезагружалась на отдельную страницу? $form->addHeader('sharedstats_pvpgn_account_add', NULL, TRUE, array(), function ($value) { $nick = $db::i('pvpgn')->select('username', 'pvpgn_BNET', [['username=?', $value]]); if ($nick) { throw new \DomainException('Такой игровой логин уже зарегистрирован, выберите другой.'); } });
Опубликовано: 16 августа 20187 г Автор Кстати, у Вас там еще пароли фигурируют, которые тоже должны проверяться. Проверяться на что?
Опубликовано: 16 августа 20187 г А нельзя сделать, чтобы форма не перезагружалась на отдельную страницу?ajax или открывайте форму в попап-окне Проверяться на что? На корректность. Если я знаю ник, то смогу его добавить, введя любой пароль.
Опубликовано: 16 августа 20187 г Автор На корректность. Если я знаю ник, то смогу его добавить, введя любой пароль. Не понял )
Опубликовано: 16 августа 20187 г Автор Подскажите пожалуйста, как вывести результат вот этого запроса в шаблон, чтобы скрыть эту кнопку.
Опубликовано: 16 августа 20187 г Не понял ) $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 ) ) ); Что это за пароль? Для чего он нужен? Подскажите пожалуйста, как вывести результат вот этого запроса в шаблон, чтобы скрыть эту кнопку. Я же писал, ищите шаблон, где выводится кнопка и добавьте новый параметр.
Опубликовано: 16 августа 20187 г Автор $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 ) ) ); Что это за пароль? Для чего он нужен? Ну это от игрового сервера, он идет в базу с отдельным методом хеширования паролей и вводится в игре. Я же писал, ищите шаблон, где выводится кнопка и добавьте новый параметр. Missing argument 2 for IPS\Theme\theme_sharedstats_front_bnet_accountView(), called in /var/www/dev/data/www/dev.wc3.games/system/Theme/Dev/Template.php on line 171 and defined
Здравствуйте. Я создал функцию регистрации на игровом сервере через сайт. Пожалуйста, посмотрите код, правильно ли всё реализовано, функция рабочая, интересует на сколько кривой код получился.
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 то отображать кнопку и форму не нужно.
Изменено пользователем TemKa_SD