We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 49998
    • 9 Posts
    Создан контекст "new".

    Заданы параметры:
    base_url = /new/
    http_host = site.ru
    site_url = site.ru/new/
    site_start = [нужный id внутри new]
    error_page = [нужный id внутри new]

    Создан плагин switchCntx, который слушает OnHandleRequest:
    <?php
    if ($modx->context->key == 'mgr') {return;}
    
    elseif ($modx->event->name == 'OnHandleRequest') {
    	$var = $modx->getOption('request_param_alias', null, 'q');
    	$request = $_REQUEST[$var];
    	
    	if (strpos($request, 'new/') === 0) {
    		$modx->switchContext('new');
    		
    		$_REQUEST[$var] = substr($request, 8);
    	}
    }


    где "new" - имя контекста.

    После этого, при заходе на site.ru/new/ - открывается site_start, тут все ок. При заходе на остальные - открывается 404. В этом проблема.

    Почитав некоторые мануалы, создаю в корне папку new, туда копирую .htaccess, index.php и config.core.php:

    • .htaccess - оставляю как есть (RewriteEngine On, RewriteBase / + чпу)
    • index.php - меняю $modx->initialize('new');
    • config.core.php - если меняю на site.ru/new/core, то получаю 503, если не меняю - весь поддомен ссылает на error_page основного контекста

    Включены ЧПУ. Из всех опций включено все (да/нет).

    Как победить?
      • 49998
      • 9 Posts
      (как всегда, когда все перепробуешь и взываешь о помощи, появляется решение smiley)

      если заменить содержимое плагина на это:

      <?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;
      		}
      	}
      }


      и удалив папку /new/ со всем содержимым - все заработало как надо.

      источник