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

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

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

Здравствуйте. Есть ли возможность изменять скин в зависимости от времени (допустим суток)? Я понимаю, что такая возможность в самом 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: подменять нужную таблицу стилей в зависимости от времени.

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

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