Aleksandr Huz

Aleksandr Huz

Был в сети 04 ноября 2025, 21:25
Заказы принимаю
Можно делать переадрессацию на любую страницу с get параметрами или без, в зависимости от условий, и так показывать определенный контент.

Но показывать ссылку, тоже хорошая идея, добавлю в TODO список.
1. HTTP HOST нужно заполнить без http://
2. Для переключения контекстов, я использую плагин с событием OnHandleRequest
Код плагина:
<?php
// Работаем только на фронтенде и только с friendly urls
if ($modx->event->name != 'OnHandleRequest' || $modx->context->key == 'mgr' || !$modx->getOption('friendly_urls')) {return;}

// Получаем запрашиваемый url
$alias = $modx->getOption('request_param_alias', null, 'alias', true);
$request = &$_REQUEST[$alias];

// Выбираем контексты с настройкой base_url
$q = $modx->newQuery('modContextSetting', array('key' => 'base_url', 'value:!=' => ''));
$q->select('context_key,value');

$contexts = array();
$tstart = microtime(true);
if ($q->prepare() && $q->stmt->execute()) {
	// Учитываем наш запрос в БД
	$modx->queryTime += microtime(true) - $tstart;
	$modx->executedQueries++;
	// Разбираем результаты
	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
		$base_url = trim($row['value'], '/');
		$context = $row['context_key'];
		// Если запрос начинается с base_url какого-то контекста
		if (preg_match('/^('.$base_url.')\//i', $request)) {
			// То переключаемся на этот контекст
			// Web инициализируется в index.php - на него переключаться не нужно
			if ($context != 'web') {
				$modx->switchContext($context);
			}
			// Вырезаем base_url из запроса, чтобы MODX нашел ресурс по uri
			$request = preg_replace('/^'.$base_url.'\//', '', $request);
			// Дело сделано - выходим из цикла
			break;
		}
	}
}
include подключает кусок кода и видит переменные только текущего шаблона, там где он вызывается.
Вариантов несколько:
  1. Назначить переменные в самом шаблоне перед всеми include
  2. Передать переменные в include:
    {include "head" id=$id parent=$parent}
  3. Использовать тег insert вместо include(не проверял, но должно работать)
Моих знаний не достаточно, чтобы точно ответить на вопрос.
Но давайте попробуем разобраться вместе))

1. Как сделать условие OR в выборке?
'where' => '{"tv.tags:LiKE":"%для ребенка%", "OR:tv.tags:":"%детский%"}',

2. Почему если вместо optionFilters использовать where, то не срабатывает выборка вообще?
Думаю, что optionFilters фильтрует полученный данные, а where задает условия для выборки.

3. Если я теги категории разбиваю через split {set $tag_category = $_modx->resource.category_tags|split:'|'}, то получаю массив
'where' => '{"tv.tags:LiKE":"%'~$tag_category[0]~'%", "OR:tv.tags:":"%'~$tag_category[1]~'"%}',
Или
'where' => $array | json_endode
где $array — массив условий