Перейти к публикации
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.

Undefined index в widget configuration

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

Здравствуйте. Восстанавливаю приложение, подзабил на разработку, а тут вышла 4.4.

 

Ошибка:

 

Whoops\Exception\ErrorException: Undefined index: ActiveGamesWidgetType (8)

 

Функции в виджете:

 

	public function configuration( &$form=null )
{
		if ( $form === null )
	{
 		$form = new \IPS\Helpers\Form;
		}


	$form->add( new \IPS\Helpers\Form\Radio( 'ActiveGamesWidgetType', isset( $this->configuration['ActiveGamesWidgetType'] ) ? $this->configuration['ActiveGamesWidgetType'] : '', TRUE, array( 'options' => array(
		-1	=> 'Лобби && Игры',
		0	=> 'Игры',
		1	=> 'Лобби',
	) ) ) );

		return $form;
	} 

 

	public function render()
{
	$games = \IPS\wc3\ActiveGames\ActiveGames::getGamelist(
		$this->configuration['ActiveGamesWidgetType']);

	return $this->output(
		$games
}

 

Я так понимаю, нужно ISSET добавить, но он добавлен, что не так?

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

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

Все верно, требуется isset в указанной строке

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

Что не так?

 

Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

 

isset( implode(",", $this->configuration['ActiveGamesWidgetBots']) ) ? implode(",", $this->configuration['ActiveGamesWidgetBots']) : '*',

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

Нельзя использовать выражение в isset. Аргумент она принимает только переменную.

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

Блин, в 3.6 не было ошибок вообще.

 

        if ( count( $ids ) )
       {
           foreach( $ids as $id )
           {
               $botIds = array_filter( $ids, 'intval' );
           }

           if ( count( $botIds ) )
           {
               $where[] = array( \IPS\Db::i()->in( 'botid', array_filter( $botIds ) ) );
           }
       }

 

Whoops\Exception\ErrorException: You have used a function (count) that should be called from the root namespace for performance reasons

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

Нужно указать что count из глобальной области, а не из какого нибудь пространство имен (добавить обратный слеш перед функцией)

 

\count( $var )

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

Там еще несколько ф-й IPS проверяют в 4.4 при включенном режиме разработчика. Если не хотите ставить слеш, то можно добавить в constants.php

define( 'IN_DEV_STRICT_MODE', FALSE );

Либо использовать какой-нибудь автоматический инструмент, который добавит слеши по всему коду.

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

Спасибо, лучше ручками слеш поставлю, если так нужно делать )

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

Что не так?

 

           foreach( static::getUsers($g->getUsernames()) as $realm )
           {
               isset( $realms ) ? $realms[ $realm['realm'] ]++ : '';
           }

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

Что не так?

А что не так?

 

           $realms = array();
           foreach( static::getUsers($g->getUsernames()) as $realm )
           {
               isset( $realms[ $realm['realm'] ] ) ? $realms[ $realm['realm'] ]++ : $realms[ $realm['realm'] ] = 1;
           }

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

Переменную в виде массива во всех случаях объявлять нужно? Ну всмысле там, где она используется в виде массива.

 

isset( $realms[ $realm['realm'] ] ) ? $realms[ $realm['realm'] ]++ : $realms[ $realm['realm'] ] = 1;

 

Это понятно, если существует $realms[ $realm['realm'] ] то выбрать $realms[ $realm['realm'] ]++ иначе $realms[ $realm['realm'] ] = 1. Зачем тут 1?

 

И не правильно выбрались данные: http://prntscr.com/mlvepl

 

Убрал:

 

$realms = array();

Опубликовано:
Переменную в виде массива во всех случаях объявлять нужно? Ну всмысле там, где она используется в виде массива.

Не только массив.

 

Зачем тут 1?

А что должно быть? Если еще нет $realms[ $realm['realm'] ], то создаем и присваиваем 1. Иначе количество для каждого индекса будет на единицу меньше

foreach (array(1,2,3,4,5,1,5,5) as $i)
{
isset($realms[$i]) ? $realms[$i]++ : $realms[$i] = 1;
}

две единицы

одна двойка

одна тройка

одна четверка

три пятерки

 

На выходе

    [1] => 2
   [2] => 1
   [3] => 1
   [4] => 1
   [5] => 3

 

И не правильно выбрались данные: http://prntscr.com/mlvepl

Вам виднее. У вас там вообще цикл в цикле.
Опубликовано:
  • Автор

Не работает оно. Если в игре 0 игроков, т.е срабатывает именно $realms[ $realm['realm'] ] = 1 то ошибка Invalid argument supplied for foreach().

 

Хотя, это наверно в count надо оборачивать? Если count есть, то выводить данные.

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

Я правильно сделал?

 

http://prntscr.com/mlwkdv

 

{{if $stats['players']}}

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

В php 7 не знаю какой ревизии есть такая штука как ?? (объединения с null)

 

               $realms[ $realm['realm'] ] = $realms[ $realm['realm'] ] ?? 0;
               $realms[ $realm['realm'] ]++;

Или по старинке

 

                $realms[ $realm['realm'] ] = isset( $realms[ $realm['realm'] ] ) ? $realms[ $realm['realm'] ] + 1 : 1;

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

Здравствуйте, чем оно отличается от этого?

 

isset( $realms[ $realm['realm'] ] ) ? $realms[ $realm['realm'] ]++ : $realms[ $realm['realm'] ] = 1;

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

Сейчас на странице 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.