Pull to refresh

Comments 28

Господи… Зачем прямой запрос в БД? xPDO в MODx Revo не зря вставлен! Если не понять сам принцип xPDO то лучше с MODx Revo вобще дел не иметь.

Так вы же небось ещё и вставляли свой код в index.php?
ИМХО, надо всё-таки как-то так:
<?php
if($modx->context->key!="mgr")
{
	$contexts = $modx->getCollection('modContext');
	foreach($contexts as $context)
	{
		$currentContextSettings = $modx->getCollection('modContextSetting', array('context_key' => $context->get("key")));
		$multisiteHttpHost=NULL;
		foreach($currentContextSettings as $currentContextSetting)
		{
			if($currentContextSetting->get('key')=="multisite_http_host")
			{
				$multisiteHttpHost=$currentContextSetting->get('value');
				break;
			}
		}	
		if($multisiteHttpHost!=NULL && $modx->getOption('http_host')==$multisiteHttpHost)
		{
			$modx->switchContext($context->get("key"));
			break;
		}
	}
}

Текст плагина OnHandleRequest. В свойстве контекста multisite_http_host как раз и хранится домен, к которому привязан контекст.
И то я почти уверен что это всё тоже можно оптимизировать — просто пока что не заморачивался.
Возможно можно оптимизировать примерно так, не пробовал:
$object = $modx->getObject('modContextSetting', array('key' = 'multisite_http_host', 'value' = $modx->getOption('http_host')));
if ($object) $context = $object->get('context');

Идея появилась на форуме MODx
Ошибся, конечно же вот так:
<?php
if($modx->context->key!="mgr")
{
	$object = $modx->getObject('modContextSetting', array('key' => 'multisite_http_host', 'value' => $modx->getOption('http_host')));
	if ($object) $modx->switchContext($object->get('context_key'));
}


Проверенный рабочий код. Всё в том же плагине OnHandleRequest размещаете.
PS: спасибо, что заставили поработать над собой и оптимизировать то, что я наваял первым комментом. :)
Хм, странно. У меня почему-то нечто подобное не работало. Наверное я немного дятел %)
Не знаю как у вас, я столкнулся на старом modx с проблемой, что почему-то не срабатывал site_start. После обновления до 2.2.4 и создании нового контекста всё заработало.
Кстати, глупый вопрос: а зачем при этом использовать параметр multisite_http_host? Почему нельзя использовать поле http_host?
Я хотел в будущем сделать мод с соответствующим namespace-ом. Да и чтобы не пересекалось ничего нигде, ведь system settings замещаются context settings-ами, а те в свою очередь user settings-ами. То есть таким образом мы бы затёрли оригинальный http_host. Конечно, в данном примере этого и незаметно, но если делать wildcard-поиск (может быть, я хочу чтобы одним контекстом обрабатывались не только домен, но и все его поддомены!), то это может составить проблему.
Боже мой, ну Вы и наворотили! О, о
Смысл прямого обращения к БД очень прост — экономия ресурсов. Представьте себе Ваш код, который отрабатывает на каждой странице. Я может быть чего-то не знаю об xPDO, но, ИМХО, Ваш код будет в разы дольше выполняться.
Для варианта «Предположим, что Вы пишете свой аналог livejournal.com» не подойдёт. Кстати, на тему языков у меня тоже были какие-то наработки, но там надо всё причесать. Быть может как нибудь выложу топик с парой встреченных фактов в MODx если кому интересно, впрочем там немного и всё равно говнокод)
К слову сказать. Вот здесь-то и может пригодиться xPDO.
Добавляете настройку http_host в контекст — и у вас разные домены.

Очень даже подойдет, только надо немного задействовать голову.
Это вариант с языками. Его можно реализовать и без контекстов. Банально к каждому материалу добавляем доп.поле заголовка и доп.поле контента. Ну, это я пока что эмпирически сказал :)
Смысл контекстов в том, чтобы указывать для них разные настройки.

Любые настройки, включая http_host, что и позволяет реализовывать разные сайты на одном движке.

У меня пример для мультиязычного сайта с одним доменным именем, но ничто не мешает добавить разные домены.

То что вы написали — жуткий велосипед: «ничего не понимаю, пишу запросы, как привык в Evolution».
Далеко вы так не продвинетесь.
Перечитал еще два раза и вот мое мнение: от таких статей MODX один вред.

Вы не разобрались в теме, написали кашу с прямыми запросами в БД вместо простого $modx->switchContext(), и это не смотря на официальную документацию.

Если вы думаете, что кому то помогли, то я вас разочарую. Вы наоборот, отпугнете потенциальных юзеров MODX Revolution своим бредом.
Не стану с Вами спорить. Давайте проще — напишите свою статью об этом. А то захожу я на «хабрахабр», ищу что-то подобное, да не нахожу. И приведите, пожалуйста, в своей статье рабочее решение, позволяющее управлять мультидоменным и мультиязычным сайтом.
По-моему вполне нормальный вариант (последний код). $modx->switchContext() нужен, если это плагин, а если править index.php, то $modx->initialize(). Если переключать контекст через плагин, получается сначала инициализируется один контекст, потом переключается на другой. Зачем лишняя работа? И xPDO в данном случае бесполезен.
Единственное я не понял зачем там второй if(....
Затем что первый раз мы проверяем, выполнен ли запрос вообще, второй раз — вернул ли результат хотя бы один ряд.
Зачем, зачем править index.php?

Насколько я помню, править его (или добавлять директории со своим index.php) нужно только при адресах типа domain.ru/ru/ domain.ru/en/

Если же адреса типа sub1.domain.ru sub2.domain.ru, то все делается простейшим плагином:
<?php
if ($modx->context->get('key') == 'mgr') {return;}
if (strstr($_SERVER['HTTP_HOST'], 'sub2.domain.ru') != false) {
  $modx->switchContext('sub2');
}


На всякий случай, вот черновик плагина для перовго случая, даже без редактирования index.php и создания директорий:
if ($modx->event->name == 'OnHandleRequest') {
    if ($modx->context->get('key') == 'mgr') {return;}

if (preg_match('/^\/en/i', $_SERVER['REQUEST_URI']) {
        $modx->switchContext('en');
        $context = 'en';
        $uri = preg_replace('/^\/en\//i', '', $_SERVER['REQUEST_URI']);
    }
    else {
        $context = 'web';
        $uri = preg_replace('/^\/ru\//i', '', $_SERVER['REQUEST_URI']);
    }

    if ($res = $modx->getObject('modResource', array('context_key' => $context, 'uri' => $uri))) {
        $modx->sendForward($res->get('id'));
    }
}


Эту тему мы обсуждали тут, довольно бурно =)
Забыл сказать, что для первого случая контексты и не нужны, обычно.

Достаточно просто создать в дереве 2 контейнера ru и en и вносить туда ресурсы на этих языках. Плагин я набросал просто для примера, что все можно сделать без редактирования системных файлов.

Истинное назначение контекстов, на мой взгляд — это разные домены. Тут все работает с полпинка с плагином в 3-4 строки. Конечно, не нужно забывать про настройки контекста (см. скриншот для примера)
Простите, будет грубо, зато правда. Ваши изречения напоминают точку зрения ортодоксального программиста-процедурника. Вот ему обязательно надо запихнуть каждый чих в begin-end или фигурные скобки — кому как милее; написать программу уровня Hello-World на .NET Framework, притом последней версии. А ч0, это же удобно! Его не заботит тот факт, что каждый лищний ret — это лишние такты процессора. Ему важнее «кошерность» кода. Да, я из тех, кто знает цену ассемблерным вставкам в программах, написанных на языках высокого уровня.

Да, я в своём решении обращался напрямую к БД. Зато меньше процессорного времени тратится при таком подходе. Ладно у меня на сайте с посещаемостью порядка 10 человек в квартал. А на проектах с высокой степенью нагрузки? Особенно если на дешёвом хостинге/оборудовании. Там каждый процессорный такт на счету. А теперь просто представьте себе, что каждая страница выполняет код с обращением к xPDO, получением через него объектов, переключением контекстов вместо простой прямой инициализации нужного контекста, полученного прямым запросом к БД через резидентно выполняемый на сервере процессор MySQL.

Не, а ч0, давайте использовать возможности современных серверов на полную катушку! Авось не заблокируют за CPU Overload на хостинге.
Зачем вам MODX Нет, не так. Зачем вам CMS? Или даже PHP?

Вы или трусы наденьте, или крестик снимите. А то городите какую то херь на готовом движке, не самом быстром, кстати, и философствуете о процессорных тактах. Высокая посещаемость и дешевый хостинг.

Вас тут уже двое таких. Удачи и вам.
Спасибо за пожелание :)

.оО( Интересно, если бы каждое такое пожелание сбывалось, насколько я бы был удачлив?.. )
Sign up to leave a comment.

Articles