Допустим у Вас в компании на каждый большой проект был создан отдельный сайт, а сейчас вы решили объединить это в один большой портал. При том желательно, чтобы отдельные сайты работали как сами по себе, так и через единый центр. Не каждый пользователь знает, где эта адресная строка и сможет набрать там незвучное название сайта да еще на английском. Также дело может обстоять с объединением обычных сервисов.
Какие проблемы нас поджидают на нашем пути?
У каждого сайта есть свой центр, свое меню. А здесь получается это меню должно будет стать подменю с другим центром. И желательно – если мы получаем имя пользователя на главном портале – не искать его повторно на внутренних.
Самое простое, что приходит в голову – iframe. Действительно – просто – делаем отдельный сайт с содержанием в виде iframe. В каждом из которых находится наш сайт и всего делов. Только такой метод не удовлетворяет единой системе ссылок.
Ладно. Не делаем iframe (за редким исключением). А как тогда? Очевидно – внутренняя часть должна генериться тем самым побочным сайтом и возвращаться без начальных тегов head и title. Хорошо. Уже кое что. При этом самый главный портал должен передавать побочному сайту страницу обращения пользователя, съедая первую часть, по которой он и узнал что речь идет именно об этом побочном портале.
file_get_contents(http://subsite1.ru/{$parametres}), либо include.
Легко. В главном файле заводим переменную
$is_portal=true;
А в файле побочном – проверяем ее
if (empty($is_portal))Мы обращаемся напрямую;
Отлично. Теперь мы можем завести вспомогательный шаблон для случая обращения через внешний портал.
Хорошо. Да не очень. Мы пишем инклуд, а все остальные инклуды идут относительно папки вызываемой. Ну это лечится очень просто, нужно лишь поменять базовый каталог на время вызываемого файла и вернуть его обратно. А в самом файле сделать
return $Smarty->fetch();
Чтобы он не был выведен раньше времени.
Пишем следующий код
$dir=getcwd(); chdir('/subsite1.ru/html/'); $data=include('index.php'); chdir($dir);
Теперь на время выполнения – директория переключается туда и обратно.
Передаем наш путь при помощи сопряжения. Мы можем разбить все параметры строки и передать в качестве аргумента до вызова нашего сайта. Для него это будет словно манна небесная. И на нем может и не быть ЧПУ, но в момент сопряжения мы его передаем. Этим и занимается контролер.
По схеме описанной ранее – мы легко можем опираться на переменные и создать данный блок.
Что делать с тегом base, ведь для каждого сайта он был указана, ведущим на основную директорию. Делаем просто. Пишем, общий тег base, в который включаем наш текущий проект и выборную директорию с проектом. Для основного меню – ставим перед ссылками /link.php, а у побочных проектов этого не делаем и компьютер сам поймет, что нужно стучаться по ним.
Все общие JS и CSS лучше свалить в отдельную папку и инклудить один раз. Остальные, относящиеся к каждому побочному проекту – инклудить с указанием прямых путей.
Для главного меню делаем какой-нибудь редкий тег, желательно с ссылкой на id. #topmenu например.
Остается вопрос с ajax и побочными вызываемыми файлами. Придется опираться на вызов основного домена. Можно для этого в JSсоздать переменную и опираться на нее. В остальном – этого должно хватить. Используйте разные пространства имен по возможности namespace.