Наверх

Плагин для переключения контекстов при отсутствии нужного URL в текущем контексте

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

Прописывать везде ссылки типа [[~30 &context=`catalog`]] не хочется, да и не всегда возможно, поэтому я написал плагинчик switchContext на событие OnHandleRequest, который сам переключает контекст, если нужной страницы нет в текущем контексте:
<?php
if ($modx->event->name != "OnHandleRequest"
    || $modx->context->key == 'mgr') {
       return;
    }

if ($_SERVER['REQUEST_URI'] != '/') {
    $uri = substr($_SERVER['REQUEST_URI'],1);
    if (substr($uri,-5) != '.html' && substr($uri,-1) != '/') {
      $uri .= '/';
    }
    $resource = $modx->getObject('modResource', array('uri' => $uri));
    if (!empty($resource)) {
        $ctx = $resource->get('context_key');
    } else{
        return '';
    }
} else {
    $ctx = 'web';
}

if ($ctx != $modx->context->key){
	$modx->switchContext($ctx);
}

Теперь я прописываю ссылки так: [[~31]], а если надо переключить контекст, плагин сам сделает всю работу. G+


2 комментария

  1. Максим Кузнецов 03 декабря 2015, 23:29(Комментарий был изменён) # 0
    Здравствуйте. Подскажите, пожалуйста, в чем может быть причина проблемы:

    На сайте все адреса представлены в виде site.ru/name/ (со '/' на конце).
    Страница 404 находится в отличном от web контексте.

    По вашему примеру реализовал плагин вида:
    <?php
    	if ($modx->event->name != "OnHandleRequest" || $modx->context->key == 'mgr') {
    		return;
    	}
    	
    	if ($_SERVER['REQUEST_URI'] != '/') {
    		$uri = strtok(substr($_SERVER['REQUEST_URI'], 1), '?');
    
    		if (substr($uri,-1) != '/') {
    			$uri .= '/';
    		}
    
    		$resource = $modx->getObject('modResource', array('uri' => $uri));
    		
    		if (!empty($resource)) {
    			$ctx = $resource->get('context_key');
    		}
    	}
    	else {
    		$ctx = 'web';
    	}
    
    	if (!empty($ctx)) {
    		if ($ctx != $modx->context->key){
    			$modx->switchContext($ctx);
    		}
    	}
    	else {
    		$error_id = intval($modx->getOption('error_page'));
    
    		if ($error_id > 0) {
    			$error_page = $modx->makeUrl($error_id);
    			$resource = $modx->getObject('modResource', array('id' => $error_id));
    
    			$modx->sendRedirect($error_page);
    		}
    	}
    Теперь переключение контекстов работает исправно, но при заходе на любую страницу в лог пишется запись:
    (ERROR @ /index.php) Could not retrieve data to cache for resource (айди)
    Изначально плагин не имел условия внутри $error_id > 0, но тогда при заходе на несуществующую страницу в лог сыпалась схожая ошибка, но с id страницы 404.

    Подскажите, пожалуйста, в чем причина засорения лога? Заранее спасибо.
    1. Олег 04 апреля 2019, 09:43 # 0
      Использовал приведенный в топике код, но у меня страницы каталога сделанные через Minishop2 не грузятся — кидает на 404. Подскажите что может быть не так?

      Авторизация

      через сервис Loginza:


      Шаблоны MODX

      1 2 Дальше »

      Объектная
      модель
      MODX