Перейти к содержимому
Русский язык для 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

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

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

 

Например, есть шаблон myTemplate

<ips:template parameters="$param" />

 

Добавляете новый параметр

<ips:template parameters="$param, $new" />

 

Ищите, где шаблон вызывается

$param = true;
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('group', 'app')->myTemplate($param);

 

Добавляете параметр

$param = true;
$new = 'test';
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('group', 'app')->myTemplate($param, $new);

  • Автор

С подключением разобрался, а запрос мне где выполнять, там в самом начале файла где шаблон подключается или в самой функции? Только в самой функции вроде не работает. Если там выполнить запрос, а потом переменную вставить в функцию, будет работать?

а запрос мне где выполнять,

В php.

  • Автор

Вот я объявил новые переменные в manage (копия из функции addpvpgn) так же не правильно? Можно в одном месте использовать, потом вставлять по всему файлу, только я не знаю как. Ну и даже так не работает почему-то ((((

 

	protected function manage()
{
	$db = \IPS\sharedstats\DB::get();
	$accountPvPGN = $db::i('stats')->select('COUNT(*)', 'stats_forum_connections', [['member_id=?', \IPS\Member::loggedIn()->member_id], ['server=?', 'Server.WC3.Games']])->first() != 0;
	\IPS\Output::i()->title = \IPS\Member::loggedIn() ->language() ->addToStack('menu__sharedstats_connected_accounts');
	\IPS\Output::i()->breadcrumb[] = array( NULL, \IPS\Output::i()->title
	);
	\IPS\Output::i()->output = \IPS\Theme::i()
		->getTemplate('bnet', 'sharedstats')
		->accountView(\IPS\Member::loggedIn(),$accountPvPGN);
}

Покажите код шаблона accountView

  • Автор
<ips:template parameters="$member, $accountPvPGN" />

<div class="ipsPad ipsType_pageTitle">{lang="sharedstats_bnetacc_title"}</div>

<ul class="ipsToolList ipsToolList_horizontal ipsClearfix ipsSpacer_both">
 <li>
 <a href='{url="app=sharedstats&module=stats&controller=BNetAccount&do=add" seoTemplate="sharedstats_bnetaccount_add" csrf="1"}'
    class="ipsButton ipsButton_positive ipsPos_right"
    data-ipsdialog="" data-ipsdialog-modal="true" data-ipsdialog-title="{lang='sharedstats_bnetacc_add'}">
     <i class="fa fa-plus"></i>  {lang="sharedstats_bnetacc_add"}
 </a>
 </li>
 {{if \IPS\Settings::i()->pvpgn_enabled OR !$accountPvPGN }}
   <li class="ipsToolList_primaryAction">
   <a href='{url="app=sharedstats&module=stats&controller=BNetAccount&do=addpvpgn" seoTemplate="sharedstats_bnetaccount_addpvpgn" csrf="1"}'
      class="ipsButton ipsButton_positive ipsPos_right"
      data-ipsdialog="" data-ipsdialog-modal="true" data-ipsdialog-title="{lang='sharedstats_pvpgn_account_add'}">
       <i class="fa fa-plus"></i>  {lang="sharedstats_pvpgn_account_add"}
   </a>
   </li>
 {{endif}}
</ul>

<div class="ipsClearfix"></div>

{{if $member->connected_accounts['connected'] === 0}}
   <p class="ipsType_light ipsType_center">{lang="sharedstats_bnetacc_no_connection"}</p>
{{else}}
 <div class="ipsPad ipsSpacer_top">
   <ol class='ipsDataList' itemscope itemtype="http://schema.org/ItemList">
     <meta itemprop="itemListOrder" content="Descending">
     {{foreach $member->connected_accounts['accounts'] as $k => $acc}}
       <li class="ipsDataItem {{if $acc['status'] === 'pending'}}ipsDataItem_warning{{endif}}" itemprop="itemListElement">
         <dl class="ipsDataItem_stats ipsDataItem_size1 ipsPos_left">
           {{if $acc['active']}}
             <strong data-ipstooltip="" title="{lang='active'}" class='ipsOnlineStatus ipsOnlineStatus_online'><i class='fa fa-circle'></i></strong>
           {{else}}
             <strong data-ipstooltip="" title="{lang='inactive'}" class='ipsOnlineStatus ipsOnlineStatus_offline'><i class='fa fa-circle'></i></strong>
           {{endif}}
         </dl>

         <dl class='ipsDataItem_stats ipsDataItem_size9 ipsPos_left'>
           <dt class='ipsType_left ipsDataItem_stats_number'>{$acc['name']}</dt>
           <dd class='ipsType_left ipsDataItem_stats_type'>{$acc['server']}</dd>
         </dl>

         <dl class='ipsDataItem_stats ipsPos_left'>
           <dt class='ipsType_left ipsDataItem_stats_number ipsType_minorHeading'>
             {{if $acc['status'] === 'pending'}}Pending{{else}}Confirmed{{endif}}
           </dt>
           <dd class='ipsType_left ipsDataItem_stats_type'>Status</dd>
         </dl>
         <dl class='ipsDataItem_stats ipsPos_right'>
           {{if $acc['status'] === 'pending'}}
             <a href='{url="app=sharedstats&module=stats&controller=BNetAccount&do=verify&id={$acc['id']}" seoTemplate="sharedstats_bnetaccount_verify"}'
                class="ipsButton ipsButton_tiny ipsButton_light" data-ipstooltip="" title="{lang='verify'}"
                data-ipsdialog="" data-ipsdialog-modal="" data-ipsdialog-title="{lang='sharedstats_bnetacc_verify'}">
               <i class="fa fa-check"></i>
             </a>
             <a href='{url="app=sharedstats&module=stats&controller=BNetAccount&do=cancel&id={$acc['id']}"}'
                data-confirm
                class="ipsButton ipsButton_tiny ipsButton_light" data-ipstooltip="" title="{lang='cancel_acc_connection'}">
               <i class="fa fa-times"></i>
             </a>
           {{endif}}
         </dl>
         <div class="ipsClearfix"></div>
       </li>
     {{endforeach}}
   </ol>
 </div>
{{endif}}

  {{if \IPS\Settings::i()->pvpgn_enabled OR !$accountPvPGN }}

должно быть AND

  {{if \IPS\Settings::i()->pvpgn_enabled AND !$accountPvPGN }}

  • Автор

ой, точно. А то, что, один и тот же код в двух местах вызван, это норм?

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

ой, точно. А то, что, один и тот же код в двух местах вызван, это норм?

Создайте метод

У Вас там где-то был класс, расширяющий \IPS\Member

Добавьте туда метод

public function someName()
{
// Код
}

 

После используйте \IPS\Member::loggedIn()->someName()

  • Автор

Что не так?

post-60255-0-48162000-1534513591_thumb.png

post-60255-0-47036200-1534513595_thumb.png

Ваша функция должна возвращать true или false и нужно использовать return

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

Аккаунт

Навигация

Поиск

Поиск

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

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