Разделы

MODx Revolution - Контексты (Многодоменность на одной инсталяции)

Контексты (Contexts) позволяют надстроить конфигурацию MODx, расширить, изолировать, или разделить между доменами, суб-доменами, под-сайтами, мульти-сайтами, регионозависимыми-подразделами, специфическими веб-приложениями и прочее.
[Комментарий] А проще и грубо говоря поддерживать много абсолютно разных сайтов через одну систему управления контентом[/Комментарий]
Контекст легко создаётся в пункте меню Contexts меню Tools. Контекст будет показан в вашем дереве ресурсов (документов). Ресурсы могут легко быть перенесены между контекстами.
Ресурсы наследуют конфигурационные настройки контекста.

Создание Контекcта
Для начала заходим в Contexts page, через System -> Contexts. Потом нажимаем«Создать новый» в таблице. У вас запросят идентификатор и описание. Потом правый клик по созданному контексту и жмём «Обновить контекст».

Это выведет окно с контекстом и пустой таблицей настроек. Здесь можно добавить контекстно-специфические настройки, которые заменят соответсвующие системные настройки.

Создаём субдомен из папки используя Virtual Hosts
Управление множеством субдоменов из одной инсталяции МОДх возможно используя механизм комнтекстов (Contexts). В данном примере будет рассмотрено создание субдомена на примере dev.modxcms.com

Создаём Контекст
Для начала идём в System -> Contexts и создаём там новый контекст, назвав его "dev".
Далее создадим документ "Dev Home" и поместим в созданный контекст "dev", также создадим документ "Dev Docs" с alias «documentation». Дерево будет выглядеть примерно так:

Правый клик по контексту "dev" в дереве, и нажмите «Update Context». Отобразится таблица Настроек Контекста. Вам нужно добавить пару настроек:
* site_start — меняем на ID «Dev Home».
* base_url — установить это на "/" (без кавычек) т.к. это становится root директорией.
* http_host — пропишем «dev.modxcms.com»
* site_url — сюда соответсвенно «dev.modxcms.com/». Не забываем про последний слэш, адрес строится по схеме (scheme+http_host+base_url).
Можно добавлять контекстно-специфические настройки, такие как error_page, unauthorized_pageи другие «по вкусу».
Note: If you're going to be linking back to the 'web' context from this context, you'll want to add those same Context Settings (with 'web'-specific values, of course) to the 'web' context. This allows MODx to know where to redirect 'web' context URLs back to.
[Комментарий]Какая-то каша получилась здесь, похоже для того чтобы потом из разных контекстов нормально строились ссылки на базовый контекст web — ему тоже нужно жестко прописать приведённые выше настройки контекста[/Комментарий]

После всего этого очистите кэш сайта.
Создаём Virtual Host
Теперь нужно немного пошаманить с Apache (Если вы не используете Apache, то вы по крайней мере поймёте идею требуемых действий). Откройте Apache's httpd.conf файл и добавьте следующие строки:
NameVirtualHost dev.modxcms.com
<VirtualHost dev.modxcms.com>
  ServerAdmin dev@modxcms.com
  DocumentRoot /home/modxcms.com/public_html/dev
  ServerName dev.modxcms.com
  ErrorLog logs/devmodxcms-error_log
  TransferLog logs/devmodxcms-access_log
</VirtualHost>	

Некоторые версии Apache предпочитают, что бы им вводили IP сервера в параметре VirtualHost и NameVirtualHost — и это нормально; Важное поле здесь — ServerName.

Конечно же создавая субдомен отличный от dev.modxcms.com вам нужно изменить этот адрес на свой.
Замечательно! Теперь перезагрузите свой сервер.

Файлы суб-домена
Теперь нужно создать реальные файлы для загрузки на суб-домен. Создайте папку "dev/" в /home/modxcms.com/public_html/ (в корневой директории вашего сервера).

Вам нужно скопировать 3 файла и корневой директории MODx Revolution's:
* index.php
* .htaccess
* config.core.php


Скопируйте их в папку dev/.
Теперь нужно отредактировать их.

index.php
В index.php, найдите эту линию:
$modx->initialize('web');

Измените 'web' на 'dev'. Сохраните и закройте.

.htaccess
Найдите эту строку:
RewriteBase /

Убедитесь, что там именно "/", а не что-либо ещё. Оно должно соответсвовать настройке контекста «base_url», которую вы ввели ранее.

Последние шаги
Очистите кэш снова, обновите дерево ресурсов и нажмите 'Preview' в документе "Dev Home". Теперь вам должена быть показана страница с URL — dev.modxcms.com/

Создайте ссылку [[~135]] к "Dev Docs" в документ "Dev Home". Перезагрузите страницу и увидите, что ссылка строится правильно — dev.modxcms.com/documentation.html

Вот собственно и всё!

Использование плагина одного шлюза для управления мультидоменной системой

У вас несколько вариантов для распределения одной БД и системы управления на несколько доменов. Можно выбрать чтобы главный фронтенд контекст (по умолчанию 'web') управлял всеми доменами или можно создать уникальный шлюз-файл для каждого домена для прямого управления его контекстом. Используя единый шлюз (первый случай) вам нужно применить плагин переключения контекстов, примерно следующий:
<?php
switch ($modx->getOption('http_host')) {
   case 'domain2.tld:80':
   case 'domain2.tld':
      // if the http_host is of a specific domain, switch the context
      $modx->switchContext('domain2.tld');
      break;
   default:
      // by default, don't do anything
      break;
}
?>

Во втором случае вам нужно создать копии файла index.php из контекста по-умолчанию web (вместе с файлами core.config.php и .htaccess для соответсвенного изменения правил чпу) в другой директории и изменить след. линию:
$modx->initialize('web');

на
$modx->initialize('aContextNameOfYourChoice');


Вы даже можете скопировать index.php в ту же самую директорию и переименовать его, но вы должны позаботиться, чтобы rewrite rules были достаточно продуманы, чтобы правильно передать запрос требуемому контексту.

[Комментарий]Осталось сделать себе плагин по парсингу РСС лент и можно приступать к клепанию сотни сплогов на одном движке :))) Вот такие чудеса и блага нам сулит новая версия[/Комментарий]

Компиляция из оригинальных доков http://svn.modxcms.com/docs/display/revolution/Contexts
  • +2
  • 25 июля 2009, 00:26
  • iJack

Комментарии (26)

RSS свернуть / развернуть
0
Ну думаю что если пользователей и реурсы можно будет запирать в рамках одного контекста будет вообще круто
avatar

bullder

  • 25 июля 2009, 00:36
0
А кстати про пользователей момент интересный. В документации о user permissions, roles прочем пока пусто :(
Но есть заготовка пункта Context Permissions тоесть можно предположить, что механизм распределения доступа пользователей по котекстам будет.
Вобще-то для разных случаев может понадобиться как единая база пользователей, так и разная для каждого контекста. Думаю разработчики это тоже понимают и предоставят нам, как всегда :), гибкий механизм.
avatar

iJack

  • 25 июля 2009, 01:47
+2
Кстати оказалось ещ полезно не только доки читать, но и руками по-трогать :))
Залез в админку Security -> Access Permissions , а там полный фарш.
Доступ группам пользователей можно задавать как по ресурсу, так и по контексту. Мало того можно делать Custom Access Policies, но блин… как обычно широкие возможности порождают то, что в них порой можно запутаться :))
avatar

iJack

  • 25 июля 2009, 02:05
0
Хмм… честно говоря получается весьма запутанная штука. Шаги с созданием папок, копированием файлов, правкой .htaccess и виртуал хостов…

Надеюсь, что потом целую пачку из этого автоматизируют, а точка входа будет единой, что позволит нам использовать алиас *.mydomen.ru, а пока половина хостингов подобной штукой пользоваться нам не дадут.

Интересно, а как выглядит ссылка на документ в другом контексте?
avatar

Carw

  • 30 июля 2009, 00:24
0
Всё сложно, потому что они сделали несколько способов реализации.
Для того, чтобы править ВиртуалХостс нужен свой сервер походу (я не видел ни одного обычного виртуального хотинга, который бы это позволял)

А ссылка на документ в другом контексте выглядит как ссылка на другой под-домен походу типа dev.modxcms.com?id=245, я не уверен, но раз всё в одной БД, то логично было было сделать сквозную нумерацию ID для всех контекстов (чтобы ИД не повторялись в разных контекстах, тогда можно не парясь использовать везде [~245] и парсер автоматом создаст правильную сылку).

И с ВируталХостс как я понял можно не париться. Просто создаёшь суб-домен (или аттачишь доп. домен) через CPanel, например, заливаешь в папку суб-домена * index.php .htaccess config.core.php (соответсвенно подправленные).
Как я понял — главное чтобы всё это находилось на одном сервере, потому что в config.core.php забит абсолютный адресс в файловой системе сервера до управляющего ядра МОДх.

Так что всё имхо более чем реально, на любом платном хостинге.
avatar

iJack

  • 30 июля 2009, 00:44
0
Сквозная нумерация действительно логична. Наверно так и работает.

А вот с этими виртуал-хостами надо будет разобраться подробнее, так как вполне возможно, что предложенный вариант по созданию под-домена не сработает. Допустим если где-то пути относительно индексного файла считаются. Если ядро, допустим, напрямую прицепится, а все остальное нет, то это будет не очень хорошо.
avatar

Carw

  • 30 июля 2009, 01:12
+1
Если контексты именовать по доменам, то мультисайтовость реализуется более изящно — добавлением одной строчки в index.php:
после:
/* Initialize the default 'web' context */
$modx->initialize("web");

добавить:
$modx->switchContext(str_replace("www.","",$modx->getOption('http_host')));


В конфиге апача можно новые домены прописать через ServerAlias.
avatar

nep

  • 20 ноября 2009, 10:25
0
Кстати, а настройки описаны верно?
Просто у меня такая проблема с контекстами: первый документ в контексте всегда создаётся вида «dev.modxcms.com/dev.modxcms.com», т.е. как пункт меню он пишется полностью, а должно было бы "/" и всё =/
И в метатег base подставляется без http://
Вот такие косяки пока что были мной замечены в общем-то. Хотя может и я что-то в настройках упустил, хотя вроде всё по инструкции сделал.
avatar

Pahom-ka

  • 1 октября 2010, 20:49
0
я настраивал как описано здесь yar-it.com/blog/modx-revolution-multi.html
avatar

yar-it

  • 1 октября 2010, 21:41
+1
yar-it, я позволю себе наглость и сделаю вам замечание:
Я не сомневаюсь в том, что вы прекрасно разбираетесь в MODx, и вы отличный программист, но ваше навязывание собственного сайта несколько раздражает, уж простите за прямоту.
По сабжу: На вашем сайте настройки не особо разнятся с этими, да и я уже сам экспериментировал с разными комбинациями, и всё равно остаётся эта противная ссылка «dev.modxcms.com/dev.modxcms.com» :(
avatar

Pahom-ka

  • 1 октября 2010, 22:29
0
мне помогло избежать столь кривой сслылки указание в начале ссылки «http://»
да и проверено мультисайтовость работает. вот вам наш «скромный» пример isot-rggu.1gb.ru
— сквозные ссылки с разных доменов
— копирование содержания страниц с основного контекста на остальные при необходимости.
— раздельная регистрация пользователей и разграничение прав на ресурсы.
avatar

Dronowar

  • 2 октября 2010, 00:25
0
— да и еще есть не задокументированный параметр &context у снипета getResource, тоже пригодилось…
avatar

Dronowar

  • 2 октября 2010, 00:30
0
мне помогло избежать столь кривой сслылки указание в начале ссылки «http://»

Можно этот момент поподробнее?
avatar

Pahom-ka

  • 2 октября 2010, 01:01
0
если бы внимательно прочитали «навязанную мною статью и сайт» то увидили бы настройки контекста, в которых явно описан параметр site_url | www.домен.ру
avatar

yar-it

  • 2 октября 2010, 10:19
0
* site_url — сюда соответсвенно «dev.modxcms.com/». Не забываем про последний слэш
В этой статье этот пункт есть…
А вот со слешем, без?
Кагбэ и с вашими настройками всё также, осталась эта противная ссылка :( конечно в тексте её можно «вылечить» подставив вначала «http://», но при генерации меню она всё равно получается кривой.
И не надо обижаться, пиар, я всё понимаю.
avatar

Pahom-ka

  • 2 октября 2010, 12:17
0
что за бред? какой пиар еще? у меня ТИЦ 1000, мне от этой ссылки плюсов ни каких, хотел сделать доброе дело, а тут «украина»…
avatar

yar-it

  • 2 октября 2010, 19:10
0
В параметре site_url нужно обязательно писать http:// в начале, мне помогло. Еще помудрите с baseurl в шаблоне.
avatar

Dronowar

  • 2 октября 2010, 18:39
0
Приветствую! Начал изучать контексты в modx и появился вопрос следующего плана.

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

1) Очевидно, что пользователь фирмы А не должен иметь какого-либо доступа к содержимому сайта фирмы Б. Это можно решить посредством прав доступа к контексту, правильно я понимаю?

2) У фирмы А — сайт-визитка, у фирмы Б — портал. Фирме Б требуются дополнительные плагины и функциональные возможности. Простейший пример: есть плагин, который в конце страницы выводит букву «Z». Вот для сайта фирмы Б этот плагин нужен, а вот в сайте фирмы А — нет. Но плагин у нас привязывается к системному событию. А возможно ли каким-либо образом «отключать» плагин для одного контекста (для одного домена) и «включать» для другого?

Этот же вопрос отнесу к остальным элементам: чанкам, сниппетам, TV, шаблонам. Ещё один пример для понимания сути задачи: продвинутому пользователю сайта Б нужно дать права на изменение шаблонов, сделанных для этого сайта. Но при этом он не должен видеть шаблоны сайта А.
avatar

Perceive

  • 16 октября 2010, 18:49
0
Решил сегодня настроить управление поддоменом из админки, почитал и начал делать все по инструкции.
Когда дошел до создания нового параметра контекста, то в появившемся окне отобразились поля: Ключ, Имя, Тип поля, Пространство имён, Запись словаря для раздела, Значение, Описание.
Куда вписывать http_host, site_url и др. параметры фигурирующие в инструкции так и не нашел. Может я что-то не так понял?
На этой картинке показано окно какое и высвечивается.
Полей с для http_host и site_url нет, но пишется, что их тоже надо заполнить.
Подскажите пожалуйста, так куда же, что и как надо прописать, чтобы правильно все настроилось?
avatar

wifr

  • 6 января 2012, 04:00
0
Проспался и разобрался, что надо несколько раз одну и ту же операцию провернуть. Все настроил по инструкции.

Но появилась другая проблема.
Поддомен сгенерировал через панель управления DirectAdmin.
Пока в директории поддомена находились родные файлы, то главная страница поддомена грузилась.
После очистки файлов из каталога поддомена и копирования туда файлов index.php, .htaccess и config.core.php и внесения изменений в них как написано выше поддомен стал выдавать ошибку 503.
Есть ли уже где-то готовый рецепт как это лечить?
avatar

wifr

  • 6 января 2012, 22:56
0
Присоединюсь к вопросу wifr, тоже 503 :(
avatar

asx

  • 11 января 2012, 23:39
0
То же было, 503

2 домена в одной папке (publik_html),
в /saite1.ru стоит modx.
3 файла перекинул в /saite2.ru и поправил, как написано,
создал 2-й контекст.
Вышла Error503, но поправил config.core.php в /sate2.ru
:1 define('MODX_CORE_PATH', dirname(__FILE__). '/core/');
на
:1 define('MODX_CORE_PATH', saite1.ru(__FILE__). '/core/');

и, 503 не стало, но saite2.ru всё равно не отражается…
хотя Шаблон и ресурс, повторяюсь, для 1-ой сраницы указаны.

Браузер показывает абсолютно пустую страницу.

Теперь бьюсь с этим…
avatar

oleg

  • 19 февраля 2012, 19:09
0
Удалось победить?
avatar

asx

  • 26 марта 2012, 00:28
+1
в папке поддомена, нужно всего поправить файл index.php (сменить конткст), и в файле config.core.php прописать полній путь до основной папки сайта core
avatar

valikras

  • 26 марта 2012, 01:39
0
Как всегда большое и искренее спасибо)
avatar

asx

  • 26 марта 2012, 01:43
0
Заработало!

1. Была опечатка в настройках контекста.
2. «дочерние» домены должны находится в папке основного, а не паралельно (или, тогда необходимы доп. настройки...)
avatar

oleg

  • 26 марта 2012, 14:23

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.