Перейти к содержимому
Русский язык для Invision Community 5

Правильно ли сделан код?

Здравствуйте. Я создал функцию регистрации на игровом сервере через сайт. Пожалуйста, посмотрите код, правильно ли всё реализовано, функция рабочая, интересует на сколько кривой код получился.

 

	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

Рекомендованные сообщения

Не пойму, как идет проверка на наличие логина в базе данных. В файле \applications\core\modules\front\system\register.php вроде нету, а подключение core.front.system.register только в нем и одном js файле.

 

Вам оно зачем, если Ваши поля не связаны с именами юзеров?

  • Автор

Я хочу сделать проверку логина в своей внешней базе (игрового ника).

Я хочу сделать проверку логина в своей внешней базе (игрового ника).
Пишите подробнее, где и что должно быть.
  • Автор

Вот код модуля по регистрации игрового ника во внешней базе денных, функция addpvpgn.

Я хочу сделать чтобы при вводе логина (игровой ник во внешней БД) проверялось его наличие, и в случае нахождения выдавало ошибку как на скрине.

BNetAccount.php

post-60255-0-26952400-1534401448_thumb.png

Я хочу сделать чтобы при вводе логина (игровой ник во внешней БД) проверялось его наличие, и в случае нахождения выдавало ошибку как на скрине.

Без нажатия на кнопку? Ввел и получил результат?

Если так, то там используется 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) {

  • Автор

Не, не для моих это мозгов. Я думал будет что-то примерно:

 

$form->add( new \IPS\Helpers\Form\Text( 'username', NULL, TRUE, array( 'accountUsername' => $переменная, в которой записан результат выборки из БД ) ) );

'accountUsername' => $переменная, в которой записан результат выборки из БД
Забудьте про accountUsername
Не, не для моих это мозгов
Сделайте на submit. Юзер отправил форму -> идет проверка на ник.

 

$form->add( new \IPS\Helpers\Form\Text( 
'username', 
NULL, 
TRUE, 
array(),
function ($value)
{
	$nick = false; // Проверяете игровой ник во внешней БД

	if (!$nick)
	{
		throw new \DomainException('Указанного ника не существует');
	}
}		
) );

Кстати, у Вас там еще пароли фигурируют, которые тоже должны проверяться.

  • Автор

Большое спасибо, работает. А нельзя сделать, чтобы форма не перезагружалась на отдельную страницу?

 

		$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('Такой игровой логин уже зарегистрирован, выберите другой.');
	        }
	    });

post-60255-0-93134000-1534413762_thumb.png

  • Автор

Кстати, у Вас там еще пароли фигурируют, которые тоже должны проверяться.

 

Проверяться на что?

А нельзя сделать, чтобы форма не перезагружалась на отдельную страницу?

ajax или открывайте форму в попап-окне

 

Проверяться на что?
На корректность. Если я знаю ник, то смогу его добавить, введя любой пароль.
  • Автор

На корректность. Если я знаю ник, то смогу его добавить, введя любой пароль.

 

Не понял )

  • Автор

Подскажите пожалуйста, как вывести результат вот этого запроса в шаблонpost-60255-0-54764600-1534414876_thumb.png, чтобы скрыть эту кнопкуpost-60255-0-11947000-1534414889_thumb.png.

Не понял )

		$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 ) ) );

Что это за пароль? Для чего он нужен?

 

Подскажите пожалуйста, как вывести результат вот этого запроса в шаблон, чтобы скрыть эту кнопку.

 

Я же писал, ищите шаблон, где выводится кнопка и добавьте новый параметр.

  • Автор

		$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

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.