Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
TemKa_SD

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

Recommended Posts

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

 

	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 by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

 

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

 

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

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

			$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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Ну вот так в данный момент выглядет форма
И в чем проблема?

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

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

 

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

 

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

 

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

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...