Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

 

	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

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

Опубликовано:
  • Автор

Чтобы не плодить темы, задам сюда. Как в форме добавить валидацию для пароля? Необходимо максимальное значение, с минимальным разобрался.

 

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

Опубликовано:

Я создал функцию регистрации на игровом сервере через сайт.

Возвращайте ошибку, а не 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.

Опубликовано:
  • Автор

Найти шаблон и добавить новый параметр в

<ips:template parameters="...." />

Это пробовал, не работало. Указывал $account_pvpgn и выводил в шаблоне {$account_pvpgn} писало что не определена переменная, попробую еще сейчас.

 

'minimumStrength' => 3 Это не минимальное значение.

 

Минимальное значение, см скрин.

 

Ой, сразу спрошу, уже искал так и не нашел. Как у кнопки SAVE изменить название?

post-60255-0-08888100-1534327041_thumb.png

Изменено пользователем TemKa_SD

Опубликовано:

Это пробовал, не работало. Указывал $account_pvpgn и выводил в шаблоне {$account_pvpgn} писало что не определена переменная, попробую еще сейчас.

 

Нужно еще в php-файле добавить, где этот шаблон вызывается

 

Минимальное значение, см скрин.
Это мин. кол-во символов

minimumStrength - мин. значение "силометра"

 

Ой, сразу спрошу, уже искал так и не нашел. Как у кнопки SAVE изменить название?

$form = new \IPS\Helpers\Form('form', 'Отправить');

Опубликовано:
  • Автор

Расскажите пожалуйста про параметры, в регистрации форума подтверждение пароля загорается зеленым, если пароли совпадают, перенес значения из регистрации форума себе в форму, у меня так не работает (((

 

			$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

Опубликовано:
  • Автор

Т.е через else форму выводить? Ну да, так по лучше будет.

post-60255-0-65037600-1534329366_thumb.png

Опубликовано:

перенес значения из регистрации форума себе в форму, у меня так не работает (((

Так у Вас одно поле для пароля. Что с чем должно сравниваться?

 

'data-controller' => 'sharedstats.front.stats.BNetAccount'

Добавляется в форму атрибут data-controller со значением sharedstats.front.stats.BNetAccount

'accountUsername' => TRUE

Введенное значение будет проверяться на предмет существования имени юзера, и если юзер существует, то получите ошибку. Также проверяется на длину и запрещенные символы.

 

'bypassProfanity' => TRUE

Не применять фильтры слов

 

Т.е через else форму выводить? Ну да, так по лучше будет.

Не нужно else

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', 'Код_ошибки', 403);
}

Опубликовано:
  • Автор

Так у Вас одно поле для пароля. Что с чем должно сравниваться?

 

Блин, добавил сюда одно. Ну вот так в данный момент выглядет форма. Щас буду копать как проверить логин у себя в игровой БД )))

 

	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;
	}
}

Опубликовано:
  • Автор

И еще, на счет ошибки. Я понял, только мне она вообще не нужна. Если аккаунт уже есть на сервере, мне просто нужно убрать форму с сайта и заменить её на изменение пароля например.

Опубликовано:
Ну вот так в данный момент выглядет форма
И в чем проблема?

Укажите 2 разных пароля, отправьте форму и посмотрите результат

 

Щас буду копать как проверить логин у себя в игровой БД )))
У Вас же в коде есть
$form->error = 'Такой игровой логин уже существует, выберите другой.';

Значит, где-то должны выбрасываться исключение.

Опубликовано:
  • Автор

И в чем проблема?

Укажите 2 разных пароля, отправьте форму и посмотрите результат

Вы не поняли, я хочу зелененькое поле как на скрине.

 

У Вас же в коде есть

$form->error = 'Такой игровой логин уже существует, выберите другой.';

Значит, где-то должны выбрасываться исключение.

 

Так это если ошибка MYSQL вылазит 1062, а я про проверку формы, когда вводишь логин, чтобы проверялось наличие в БД.

 

......................

 

Или подождите, может всё это не работает в форме, а только при полной регистрации?

post-60255-0-07118400-1534333238_thumb.png

Изменено пользователем TemKa_SD

Опубликовано:
  • Автор

Разобрался, здесь идет подключение JS по name="". Как лучше делать? Копировать JS код в мой компонент и изменять идентификаторы, или использовать идентификаторы IPS?

post-60255-0-00736600-1534333903_thumb.png

Изменено пользователем TemKa_SD

Опубликовано:
  • Автор

Не хочет. Надо же подключать валидацию через стили, Как на скрине выше?

Опубликовано:

Нужно добавить контроллер 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 ) ) );

Опубликовано:
  • Автор

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

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

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.