[СДЕЛАЙ САМ] Контексты для регионов в интернет-магазине.

Задача: сделать максимально простое добавление новых контекстов на сайт для создания региональных копий с собственными ресурсами, robots.txt и sitemap.xml, уникальными для каждого региона ресурсами и ценами на некоторые товарные позиции.

Проблемы:
1. Вывод галереи изображений товаров
2. Добавление дополнительных категорий к товарам в новом контексте.
3. Связывание товаров.

Решение:
1. Настраиваем редирект со всех поддоменов на основной домен (как это сделать уточняйте у хостера или в Google);
2. Подключаем плагин для переключения контекстов:
<?php
// Работаем только на фронтенде
if ($modx->event->name != 'OnHandleRequest' || $modx->context->key == 'mgr') {return;}

// Определяем запрашиваемый хост
$host = $_SERVER['HTTP_HOST'];
$ctx = $modx->getObject('modContextSetting', array('key' => 'http_host', 'value' => $host)); 

if($ctx->get('context_key') != 'web'){
    $modx->switchContext($ctx->get('context_key'));
}

Логика такая: определяем по url какой контекст запросили, если это не основной контекст (web), то переключаем контекст на запрошенный, в противном случае смотрим есть ли в $_COOKIE город, если нет, то устанавливаем $_COOKIE['curCity'], проверяем есть ли в списке контекстов запрошенный, если есть, то переключаем, если нет остаемся на основном контексте. На фронте этим управляет вот такой код
let btns = document.querySelectorAll('.jsChooseBtn'), // это кнопки подтверждения ДА и НЕТ
        tooltip = document.querySelector('.jsCityTooltip'); // это само окно с вопросом "ЭТО ВАШ ГОРОД"
    for(let i = 0; i < btns.length; i++){
        btns[i].addEventListener('click', function(e){
            tooltip.classList.add('d-none');
            if(e.target.classList.contains('jsCityConfirm')){ // если нажали да
               document.cookie = 'curCity='+ e.target.dataset.city + '; path=/;domain=ecodecking.ru'; 
            }
        });
    }
    if(document.cookie.indexOf('curCity') != -1){ // проверяем есть ли город в куках
        tooltip.classList.add('d-none'); 
    }


2.1 если кому интересно город я определяю через сайт DaData.Код сниппета detectRegion тут.
<?php
$url = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address';
$siteIsAvaliable = $modx->runSnippet('isSiteAvailible', array('url' => $url));
if($siteIsAvaliable){
    $token = $modx->getOption('dadata_api_key');
    $ip = $_SERVER['REMOTE_ADDR'];
    $headers = array(
    	'Accept: application/json',
    	'Authorization: Token ' . $token
    );
    $ch = curl_init($url.'?ip='.$ip);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $result = json_decode(curl_exec($ch),1);
    curl_close($ch);
    $region = $result['location']['data']['city'];
    return  $region;
}else{
    $modx->log(1, 'detectRegion: Не возможно определить регион. Сервис DaData недоступен');
    return false;
}

3. Подключаем плагин для создания настроек контекста, при копировании или создании нового.
Артур
07 апреля 2021, 19:51
modx.pro
2
190
+3

Проверка доступности стороннего сайта для запроса по api

Сниппет называется isSiteAvailible, написал его не я, автора не помню, но говорят штука полезная, чтобы твой сайт работал, даже если чужой, куда ты шлешь запросы, лежит.
<?php
if(!$url){return false;}
// Проверка правильности URL
if(!filter_var($url, FILTER_VALIDATE_URL)){
    return false;
}

// Инициализация cURL
$curlInit = curl_init($url);

// Установка параметров запроса
curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,1);
curl_setopt($curlInit,CURLOPT_HEADER,true);
curl_setopt($curlInit,CURLOPT_NOBODY,true);
curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);

// Получение ответа
$response = curl_exec($curlInit);

// закрываем CURL
curl_close($curlInit);

return $response ? true : false;
Вопрос в том нужно ли это делать и если да, но насколько верен предложенный способ?
Артур
09 апреля 2021, 23:31
modx.pro
187
-2

Чтобы страница 404 возвращал 404 ответ. Возможно ли?

В MODX 404 страница возвращает ответ 200.
А можно как-нибудь сделать, чтобы она 404 возвращала?
Может плагин на какое-нибудь событие или еще как-то
Павел
19 февраля 2021, 21:37
modx.pro
184
0

Обновление для автоустановщика шаблонов BELISSIMO до версии 0.2.


Самое весомое что добавлено это новый каталог шаблонов с сайта https://html5up.net там их не много, но вдруг добавят новые.
Так же поскольку я придурок в прошлой статье я написал про возможность обновления, но её не добавил…
Точнее как: обновления он криво косо проверял, но при нажатии на кнопку установку ничего не делал.
Обновление я починил, и так же пофиксил уведомление о новой версии.
Илья
19 марта 2021, 14:41
modx.pro
179
+2

Магазин на 500 000+ товаров

Добрый день.
Есть задача сделать магазин на 570 000 товраов.
Товары простые — у них почти нет свойств, кроме изображения, описания и цены.

Первая проблема — это напролнение.
Модуль Импорт/Экспорт вешается. По моим расчетам ему надо 3-4 недели чтобы все загрузить )))

Это решилось импортом напрямую через запрос в БД. Слава mysql и после импорта 4 таблиц все товары на месте примерно за 15-20 минут.

Но начинается новый прикол, что до 300 000 товаров сайт еще более-менее живой и время отклика «около вменяемое» порядка 1000-1500 м/сек.

Но как только мы переваливаем за 400 тыс, время отклика уходит в 3-5 м/сек, а после 500 000 товаров доходит до 7 м/сек.
А в некоторых случаях сайт просто начинает отдавать 500 ошибку прямо с главной страницы.

Как быть с таким количеством наименований?
это просто магазин крепежа — куча разных винтиков разного размера и разной фасовки.

Тут нет модификаций, нет связей, один товар — одна категория.
yuri
19 марта 2021, 13:41
modx.pro
1
178
0

Как сделать прозрачный фон у Webp фоток товара в минишопе?

Есть исходные png с прозрачным фоном. Заливаю их в минишоп последней версии, и генерируются png с белым или любым цветом какой укажешь в bg. А как сохранить прозрачность?
Семен Морозов
07 марта 2021, 20:31
modx.pro
173
0

Динамическая карта изображённый сайта

Добрый день!
Как сделать динамическую карту изображений сайта на modx revolution?? Статическую смогла сообразить через доп реверсы, но нужна динамическая
Заранее всем спасибо!
Анна
02 марта 2021, 18:28
modx.pro
168
0

Не получается вывести картинку TV image в категории статей

{'!pdoMenu' | snippet : [

'parents' => '',
'tpl' => 'articleTpl',
'showHidden' => '1',
'includeTVs' => 'image, namevideo',

	'leftJoin' => '{
		"localizator" : {
			"class" : "localizatorContent",
			"alias" : "localizator",
			"on" : "localizator.resource_id = modResource.id"
		}
	}',
	'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
        'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
]}
чанк articleTpl:
<div class="product-thumb col-5 col-xs-5 col-sm-3 col-lg-3 col-md-3">
 <a href="[[~[[+id]]]]"> [[+tv.namevideo:!empty=`<div class="ytpu-container">`]]
          <div class="youtube_back">
 <img src="[[+tv.image:phpthumbof=`w=300&h=180&zc=1`]]" class="img-responsive thumb-img">
         </div>
         [[+tv.namevideo:!empty=`</div>`]]
 <h5 class="text-center">[[+pagetitle]] </a></h5>   

</div>
выводится только блоки с названием статей, но картинки не выводит.
Игорь
18 февраля 2021, 08:34
modx.pro
165
0

Как вызвать сниппет в конкретном шаблоне?

Привет!

Есть сниппет, нужно чтобы он вызывался только в определенных шаблонах, например в шаблонах с id = 1,2,3.

Подскажите пожалуйста, как это можно сделать через условие?
Денис
15 февраля 2021, 15:34
modx.pro
164
0

Неверно выводится описание на страницах каталога, SeoFilter

Всем привет.
Создаю правила в SeoFilter. В SEO-шаблоне заполняю поля h1, описание и содержимое. В коде шаблона страницы нужно вывести описание (либо описание категории, в которой находимся, либо описание этой же категории с выбранным фильтром), прописываю следующее:
Кристина
03 марта 2021, 19:55
modx.pro
164
0