Перейти к содержимому
Русский язык для Invision Community 5

Изменение скина или элемента дизайна в зависимости от времени

Здравствуйте. Есть ли возможность изменять скин в зависимости от времени (допустим суток)? Я понимаю, что такая возможность в самом ipb не предусмотрена, но возможно есть контроллер который активирует тот или иной скин?

 

Или возможность внедрить код php непосредственно в шаблоны? но как? там ведь своя система макроопределений..

 

Одним словом за любые подсказки советы буду оч благодарен!

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

Есть возможность. Видела.

Но не умею, так как не просил никто и не пыталась сама.

Наверняка Ritsuka знает, как сделать.

  • Автор

Есть возможность. Видела.

Но не умею, так как не просил никто и не пыталась сама.

Наверняка Ritsuka знает, как сделать.

 

Спасибо! Спросил через приват

Если нужно менять именно скин, то смотрите этот вызов:

 

/admin/sources/classes/output/publicOutput.php

	/**
 * Fetch a skin based on user's incoming data (user-agent, URL) or via other params
 *
 * The priority chain goes like this:
 *
 * Incoming Gateway file (index.php / xml.php / rss.php, etc) filters out some skins, then:
 * - User Agent
 * - URL Remap
 * - App Specific
 * - Member specific
 * - Default skin
 *
 * @access	protected
 * @return	int			ID of skin to use
 */
protected function _fetchUserSkin()

 

В нем есть строка:

		foreach( array( '_fetchSkinByUserAgent', '_fetchSkinByURLMap', '_fetchSkinByApp', '_fetchSkinByMemberPrefs', '_fetchSkinByDefault' ) as $function )
	{
		$useSkinID = $this->$function();

		if ( $useSkinID !== FALSE )
		{
			break;
		}
	}

 

По очереди вызываются перечисленные в массиве функции, пока какая-то не вернет результат. Т.е. можете вмешаться на любом этапе. Оптимальным будет поправить функцию _fetchSkinByDefault, чтобы пользователи могли при желании отключить автосмену скина и остановиться на каком-то одном любимом.

 

Эта функция имеет вид:

	private function _fetchSkinByDefault()
{
	$useSkinID = FALSE;

	/* Got one set by default for this gateway? */
	foreach( $this->allSkins as $data )
	{
		/* Can use with this output format? */
		if ( $data['_gatewayExclude'] !== FALSE )
		{
			continue;
		}

		if ( $data['set_is_default'] )
		{
			$useSkinID = $data['set_id'];
			break;
		}
	}

	/* Did we get anything? */
	if ( $useSkinID === FALSE )
	{
		foreach( $this->allSkins as $data )
		{
			/* Can use with this output format? */
			if ( $data['_gatewayExclude'] !== FALSE )
			{
				continue;
			}

			/* Grab the first one */
			$useSkinID = $data['set_id'];
			break;
		}
	}

	IPSDebug::addMessage( "Skin set not found, setting default. Using set #" . $useSkinID );

	return $useSkinID;
}

 

Как видим, два раза просматривается набор шаблонов, сначала ищется отмеченный "по-умолчанию". Если находится - он и возвращается. Иначе снова осужествляется проход по скинам и выбирается самый первый. Вмешаться просто. Допустим, у вас есть 4 скина:

id 4 - Ночь

id 5 - Утро

id 6 - День

id 7 - Вечер

 

Просто замените код функции на:

	private function _fetchSkinByDefault()
{
               switch(intval(date("H")))
	{
		case 0: case 1: case 2: case 3: case 4: case 5:
			$useSkinID = 4; break;
		case 6: case 7: case 8: case 9: case 10: case 11:
			$useSkinID = 5; break;
		case 12: case 13: case 14: case 15: case 16: case 17:
			$useSkinID = 6; break;
		case 18: case 19: case 20: case 21: case 22: case 23:
			$useSkinID = 7; break;

	}
	return $useSkinID;
}

  • Автор

Фактически готовое решение! Большое спасибо!

  • Автор

Единственное замечу что так лучше делать времена года ))) Ведь время берётся сервера, хотя люди могут заходить из разных часовых поясов.

Мне кажется выходом может быть управление через JS: подменять нужную таблицу стилей в зависимости от времени.

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

Аккаунт

Навигация

Поиск

Поиск

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

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