[update] Общая база товаров для разных контекстов
        Очень долго не получалось заставить работать товары minishop2 на других контекстах, с выводом через сниппет нет проблем, а вот с ссылками и корзиной беда.
Использовал sendForward, с ним куча гемороя, но случайно наткнулся на вот это:
В итоге вот что получилось:
Плагин SwitchProduct (вешаем на OnPageNotFound) для поиска товара по ссылке с других контекстов (site.ru/catalog/product/ имет дубликат по ссылке test.site.ru/catalog/product/)
к товарам создан tv brand, те которые будут выводиться на test имеют запись test в tv
Создаем в web:
catalog (msCategory) (id 3)
с контентом/содержимым
— product web 2 (tv.brand = пусто)
— product web + test 3 (tv.brand = test)
— product web + test 4 (tv.brand = test)
Создаем в test:
catalog (msCategory)
с контентом/содержимым
Должно быть включено ЧПУ, проверка на дублирование в контекстах = нет
В итоге: товары работают полностью во всех контекстах, добавление в корзину не вызывает проблем как и оформление заказа.
    
    
                                                                                
            Использовал sendForward, с ним куча гемороя, но случайно наткнулся на вот это:
$modx->resource = $modx->getObject('modResource', $id);
$modx->request->prepareResponse();
exit();В итоге вот что получилось:
Плагин SwitchProduct (вешаем на OnPageNotFound) для поиска товара по ссылке с других контекстов (site.ru/catalog/product/ имет дубликат по ссылке test.site.ru/catalog/product/)
<?php
if ($modx->event->name == 'OnPageNotFound') {
	$alias = $modx->context->getOption('request_param_alias', 'q');
	if (!isset($_REQUEST[$alias])) {return false;}
	$request = $_REQUEST[$alias];
	$tmp = explode('/', $request); // получаем ссылку
	$test = $modx->findResource(end($tmp));
	$document = $modx->getObject('msProduct', array('alias' => end($tmp))); // ищем товар по алиасу, последний кусок из /catalog/category/product-alias
	if($document){
		$modx->resource = $document;
		$modx->request->prepareResponse(); // рендерим товар миную контексты!
		exit();
	}
}На моем примере сайт разделен на 2 контекста, web (site.ru) и test (test.site.ru)к товарам создан tv brand, те которые будут выводиться на test имеют запись test в tv
Создаем в web:
catalog (msCategory) (id 3)
с контентом/содержимым
[[!msProducts]] — product web 1 (tv.brand = пусто)— product web 2 (tv.brand = пусто)
— product web + test 3 (tv.brand = test)
— product web + test 4 (tv.brand = test)
Создаем в test:
catalog (msCategory)
с контентом/содержимым
[[!msProducts? &parents=`3` &includeTVs=`brand` &where=`{"brand":"test"}`]]Структура каталогов у контекстов должна быть идентична, иначе посыпятся 404 ошибки.Должно быть включено ЧПУ, проверка на дублирование в контекстах = нет
В итоге: товары работают полностью во всех контекстах, добавление в корзину не вызывает проблем как и оформление заказа.
Комментарии: 21
                Спасибо! Очень нужная вещь! Очень часто нужна одна общая база для многих контекстов (или например языков).            
                    
                тестировал, обнаружил проблемы, в итоге все переписал, хватило одного плагина. тикет обновил.            
                    
                А для мультиязычного сайта этот плагин не подойдёт? Но сайты не на разных доменах, а в подпапках:
                    ру - /
англ - /en/Как для такой структуры сделать общую базу товаров?            
                Проглядел, ниже пример, он разбивает url на массив и ищет по последнему (т.е. алиасу). Тоже самое можно сделать и на /en/            
                    
                Дополнение от Никиты, если вы используете .html в своих URL
                    <?php
if ($modx->event->name == 'OnPageNotFound' && $modx->context->key != 'mgr' && $modx->context->key != 'web'){
    
    $alias = $modx->getOption('request_param_alias', null, 'alias', true);
    $request = &$_REQUEST[$alias];
    $tmp = explode('/', $request); // получаем ссылку
    $product_alias = str_replace(".html", "", end($tmp));
    $resource = $modx->getObject('modResource', array('alias' => $product_alias));
    
    print_r($resource->id); 
    
    
    
    if($resource){
        if($content) $resource->set('content', $content);
        $modx->resource = $resource;
		$modx->request->prepareResponse(); 
		exit();
    }
}            
                Добавил плагин, создал в контекст с каталогом, в другом контексте создал аналогичные категории. Вывожу товары одной из категорий вот так:
                    [[!pdoPage?
                    	&element=`msProducts`
                    	&depth=`1`
			&context=`catalog`
                    	&tpl=`tpl.msProducts.row1`
                    	&sortby=`RAND()`
                    	&ajaxMode=`scroll`
                    ]]Но в ресурсе данного контекста же нет товаров, только пустые категории, соответственно он товаров не видит.            
                Смысл в том, что товары выводятся из основного контекста.
            
                    
                то есть каталог с товарами оставить в контексте web?            
                    
                Да, заполняете web товарами.
В новый контекст дублируете иерархию web и пр выводе указываете parent из web
                    В новый контекст дублируете иерархию web и пр выводе указываете parent из web
                Вопрос — а как мне в шаблоне, вот тут
                    [[!pdoPage?
                    	&element=`msProducts`
                    	&depth=`1`
                    	&tpl=`tpl.msProducts.row1`
                    	&sortby=`RAND()`
                    	&ajaxMode=`scroll`
                    ]]указать родителем ресурс из другого контекста?            
                &parent=`__id категории__` 
или же можно завести tv поле «родитель» и в нем выбирать основную категорию, и выводить
&parent=`__tv_roditel__`
                    или же можно завести tv поле «родитель» и в нем выбирать основную категорию, и выводить
&parent=`__tv_roditel__`
                попробую через ТВ
            
                    
                ок. спасибо. буду пробовать.            
                    
                Получилось сделать?            
                    
                А какой у вас геморрой был с sendForward? Немного подправил код, запросов к БД стало меньше. У вас есть строчка неиспользуемая:
По замерам получается так:

            
                    $test = $modx->findResource(end($tmp));Вот я на базе неё и сделал так:<?php
if ($modx->event->name == 'OnPageNotFound') {
	$alias = $modx->context->getOption('request_param_alias', 'q');
	if (!isset($_REQUEST[$alias])) {return false;}
	$request = $_REQUEST[$alias];
	$tmp = explode('/', $request); // получаем ссылку
	$document = $modx->findResource(end($tmp), 'web'); //ищем в том контексте, в котором общие товары, ищем товар по алиасу, последний кусок из /catalog/category/product-alias
	if($document){
		$modx->sendForward($document);
		exit();
	}
}Только для форвардинга нужно в настройках включить опцию allow_forward_across_contextsПо замерам получается так:

            
                Вроде получилось таким способом, но вот при клике на товар идёт смена контекста, как с этим быть?            
                    
                Удалось решить проблему?            
                    
                При клике на товар идёт смена контекста, как это можно исправить?            
                    
                Для ссылок
                    {$id | url | preg_replace : '~^https?://~' : '' | preg_replace : '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i' : ''}Плагин для подмены ресурса<?php
if ($modx->event->name == 'OnPageNotFound') {
	$alias = $modx->context->getOption('request_param_alias', 'q');
	if (!isset($_REQUEST[$alias])) {return false;}
	$request = $_REQUEST[$alias];
	$tmp = explode('/', $request); // получаем ссылку
	$document = $modx->getObject('msProduct', array('alias' => end($tmp))); // ищем товар по алиасу, последний кусок из /catalog/category/product-alias
	if($document){
		$modx->resource = $document;
		$modx->request->prepareResponse(); // рендерим товар миную контексты!
		exit();
	}
}В настройках сниппетов PDO проставьте {$_modx->context.key}            
                Добрый день!
Понимаю, что очень старая запись. Но все же сейчас может помочь.
А как быть, когда доменное имя содержит символ "-"?
Сейчас этот код:
Было:
site-name.ru/katalog/mebel/krovati/
Стало:
spb.site-name.ru/site-/katalog/mebel/krovati/
Нужно:
spb.site-name.ru/katalog/mebel/krovati/
Может кто-то подскажет?
                    Понимаю, что очень старая запись. Но все же сейчас может помочь.
А как быть, когда доменное имя содержит символ "-"?
Сейчас этот код:
{$id | url | preg_replace : '~^https?://~' : '' | preg_replace : '/\w+\..{2,3}(?:\..{2,3})?(?:$|(?=\/))/i' : ''}Отрабатывает вот так:Было:
site-name.ru/katalog/mebel/krovati/
Стало:
spb.site-name.ru/site-/katalog/mebel/krovati/
Нужно:
spb.site-name.ru/katalog/mebel/krovati/
Может кто-то подскажет?
                Всем добрый день. Может не совсем в тему, но проблема следующая:
1. Есть контекст web — обычные текстовые страницы
2. Есть контекст catalog — категории и товары Minishop2
Так вот, если удалить .html из типа содержимого, товары отдают 404 ошибку
Все остальные страницы и даже категории товаров работают, в упор не понимаю почему так
                    1. Есть контекст web — обычные текстовые страницы
2. Есть контекст catalog — категории и товары Minishop2
Так вот, если удалить .html из типа содержимого, товары отдают 404 ошибку
Все остальные страницы и даже категории товаров работают, в упор не понимаю почему так
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.