Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
TemKa_SD

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

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

08/15/18 08:48 (изменено)

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

 

	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.

Поделиться сообщением


Ссылка на сообщение
08/15/18 09:57 (изменено)

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

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

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

Поделиться сообщением


Ссылка на сообщение
08/15/18 11:42 (изменено)

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

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

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

 

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

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

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

 

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

 

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
08/15/18 11:49 (изменено)

Разобрался, здесь идет подключение 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 ) ) );

Поделиться сообщением


Ссылка на сообщение

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

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

×
×
  • Создать...