• Шаблоны для вашего сайта
  • Сделать сайт
  • Реклама
  • Berry CSS
  • Albireo Framework
  • Бесплатный HTML-курс
  • Telegram-канал
  • Обратная связь
MaxSite.org
О создании сайтов и не только
Создание сайтов под ключ (Украина) →
Вход
×
или зарегистрироваться

Сайт на нескольких CMS одновременно

Landing PageПросмотров: 8116Комментарии: 017 января 2016 г.

Необычная задача. В результате можно добиться того, чтобы какие-то страницы сайта создавались разными CMS. У меня стояла задача обеспечить одновременную работу LPF и MaxSite CMS. То есть был установлен сайт на MaxSite CMS, который замечательно работает. LPF нужно было использовать только для главной страницы и нескольких других (произвольных).

Таким образом задача состоит в том, чтобы загружать только реально созданные LPF-страницы, во всех остальных случаях должна работать MaxSite CMS.

Как правило, такие вещи делаются «в лоб»: вторая система устанавливается в отдельный каталог сайта. Но тогда приходится мириться с дополнительным сегментом в адресе страниц. Ну и в этом способе сложно обеспечить работу главной.

Как правило CMS подключается через корневой index.php. Если сайт использует ЧПУ, то первоначальная настройка URL-запроса происходит в .htaccess. Входящий запрос обрабатывается и в «скрытом» виде подключается index.php, который уже дальше сам рулит как ему нужно.

Очевидно, что для одновременной работы нескольких CMS потребуется переименовать index.php. Например для MaxSite CMS это будет index-mso.php, а для LPF — index-lpf.php. Таким образом на сервере будут два корневых файла разных систем.

Что касается других одноименных файлов/каталогов. Очевидно, что они не должны пересекаться. Если этого добиться не получается, значит одновременная работа систем будет невозможна.

Теперь, очевидно, что нам нужен некий диспетчер, который будет выполнять подключение (через require) нужного index-файла. Диспетчер нужно разместить в новом index.php. Таким образом у нас получается:

  • index.php — диспетчер
  • index-mso.php — MaxSite CMS
  • index-lpf.php — LPF

Но у нас есть еще .htaccess в котором формируется нужный URL-запрос.

Если открыть эти файлы, то различие по сути будет только в правилах RewriteRule.

MaxSite CMS
RewriteRule ^(.*)$ /index.php/$1 [L,QSA]
 
LPF 
RewriteRule ^(.*)$ /index.php?page=$1 [QSA]

Если открыть другие CMS, то их правила будут другими. Здесь главное определить какое правило оставить (или даже переписать), чтобы обе системы нормально работали. В нашем случае должен остаться .htaccess от LPF, поскольку он формирует более сложный GET-запрос (добавляет page=...).

Дальше следует определить какие именно GET-запросы после прохождения .htaccess сформировались. Это довольно просто увидеть в php-переменной $_SERVER['QUERY_STRING'], которую можно вывести в диспетчере.

Вот именно на определенном $_SERVER['QUERY_STRING'] и должен подключаться соответствующий index-файл.

Самый простой способ прописать адреса вручную.

if (
	$_SERVER['QUERY_STRING'] == '' or
	$_SERVER['QUERY_STRING'] == 'page=hello'
	)
	require 'index-lpf.php';
else
	require 'index-mso.php';

В данном примере главная страница и /hello отдаст LPF, а все остальные страницы — MaxSite CMS. Обратите внимание, что GET-запрос от LPF формируется с page=, поскольку так работает .htaccess.

Мне хотелось, чтобы LPF отдавал все свои страницы. Поскольку страницы в LPF — это каталоги в lpf-content/pages/, то достаточно автоматом их получить и после проверять на вхождение в get-запрос.

Привожу готовый рабочий код index.php (диспетчер).

<?php
$lpf_pages = _directory_map(dirname(realpath(__FILE__)) . '/lpf-content/pages/', 1);
$lpf_pages = array_map('_add_route', $lpf_pages);
 
if (
	$_SERVER['QUERY_STRING'] == '' or // главная идет от LPF 
	in_array($_SERVER['QUERY_STRING'], $lpf_pages)
	)
	require 'index-lpf.php';
else
	require 'index-mso.php';
 
 
function _add_route($s)
{
	return 'page=' . $s;
}
 
function _directory_map($source_dir, $directory_depth = 0, $hidden = FALSE)
{
	if ($fp = @opendir($source_dir))
	{
		$filedata	= array();
		$new_depth	= $directory_depth - 1;
		$source_dir	= rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
 
		while (FALSE !== ($file = readdir($fp)))
		{
			if (!trim($file, '.') OR ($hidden == FALSE && $file[0] == '.')) continue;
 
			if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file))
				$filedata[$file] = _directory_map($source_dir . $file . DIRECTORY_SEPARATOR, $new_depth, $hidden);
			else
				$filedata[] = $file;
		}
 
		closedir($fp);
		return $filedata;
	}
 
	return FALSE;
}
 
# end of flie

Функция _directory_map — это хелпер из CodeIgniter. Функция _add_route добавляет к имени каталога page=, чтобы уже без ухищрений использовать в условии in_array.

Данный подход универсальный к любым CMS, главное подобрать get-запрос в .htaccess, который будет работать на этих системах.


Создание сайтов (Украина) →
Почему Яндекс идёт против вебмастеров или как вебмастеру выжить в кризис
Примеры верстки с UniCSS.Builder
twitter.com facebook.com
Другие записи сайта
Mixin в LESS бывают разные
Mixin в LESS бывают разные
34 отличия блогера от колхозника или Тут есть кто живой?
34 отличия блогера от колхозника или Тут есть кто живой?
Взаимодействие между Alpine-компонентами
Взаимодействие между Alpine-компонентами
Попробовал Linux
Попробовал Linux
FastCGI и CodeIgniter, мой новый сайт и секрет небольшой памяти
FastCGI и CodeIgniter, мой новый сайт и секрет небольшой памяти
Сравнение IDE для PHP - 2022
Сравнение IDE для PHP - 2022
Оставьте комментарий!

Комментарий будет опубликован после проверки. Вы соглашаетесь с правилами сайта.

(обязательно)

Навигация
  • Шаблоны для MaxSite CMS 22
  • jQuery и JavaScript 6
  • Java и Android 5
  • PHP/ООП 25
  • SQL 17
  • Albireo Framework 11
  • Berry CSS 7
  • CSS, HTML, LESS, SASS 23
  • PHP 37
  • Тайм-менеджмент 9
  • Софт 37
  • SEO 13
  • Git. GitHub 3
  • CodeIgniter 5
  • Landing Page 3
  • Alpine.js 14
  • Фильмы 2
  • Дневник 55

Здесь можно заказать создание сайта (только Украина), шаблона или лендинга. Также вы можете выбрать готовые шаблоны для MaxSite CMS по небольшой цене. Также можно купить отдельные модули, компоненты для вашего сайта.

MaxSite.org
Как создать свой сайт

Услуги по созданию сайтов, блогов, лендингов
Обратная связь • Реклама на сайте
Карта сайта
Мои проекты
  • Шаблоны для вашего сайта
  • Заказать создание сайта
  • MaxSite CMS
  • Berry CSS (CSS Utilities)
  • Albireo Framework
  • UniCSS (Universal Atomic CSS)
  • Landing Page Framework
  • Бесплатные НТML-курсы
Ссылки
  • Telegram-канал
  • Github
  • Twitter
  • Telegram-бот
  • RSS
© MaxSite.org, 2006-2022. Работает на MaxSite CMS | Время: 0.2807 | SQL: 20 | Память: 4.6MB | Вход