Максим Кузнецов

Максим Кузнецов

Был в сети 04 августа 2021, 21:51
Заказы принимаю
1. Создаете общую страницу для списка пользователей (users)
2. С помощью
кастомной маршрутизации на событие OnPageNotFound перехватываете запрос пользователя и, если он подходит под формат страницы пользователя (/users/$username), то подменяете страницу:
$tmp = explode('/', $request);
	
if (end($tmp) == '') {
	array_pop($tmp);
}
if (count($tmp) >= 2) {
	switch ($tmp[0]) {
		//Профиль пользователя
		case 'users':
			//манипуляции с именем пользователя:
			//1. ищете подходящего пользования
			//2. если он не существует - возвращаем 404, если существует - идем дальше
			//3. приводим адресную строку к единому формату ('имя, Имя, ИМЯ' -> 'Имя')
			//4. Заносите в плейсхолдер (user_id, user_name) значение пользователя
			//5. подменяете страницу при помощи sendForward на страницу users

			//опционально: здесь же можно проверять наличие 3-ей и более подстрок запроса
			//(posts, comments, favorites и тд) 
	...

3. На странице users проверяете наличие соответствующих плейсхолдеров (user_id, user_name) — если они есть, то отображаете шаблон страницы пользователя, если их нет — общую страницу пользователей
ms|vendor:country
Данная структура передает параметры в виде «кодовое_имя_таблицы/поле: фильтр» (
документация).

Из коробки (помимо прочих) доступен фильтр vendors, а фильтр country — нет. Поэтому, если вы хотите отфильтровать товары по стране производителя, вам необходимо расширить класс фильтрации, дописав в нем соответствующую логику.
Если вы о том, как приджоинить voteforms к вызову (pdoTools), то так:
[[!pdoResources?
	&loadModels=`voteforms`
	&leftJoin=`{
		"VoteFormThread": {
			"class": "VoteFormThread",
			"on": "modResource.id = VoteFormThread.resource AND VoteFormThread.form = 1"
		}
	}`
	&select=`{
		"modResource": "*",
		"VoteFormThread": "rating AS rating"
	}`
	...
	//айди формы и желаемые поля для выборки указать под себя

Если вас интересует, как именно реализовать это в связке с getProducts/другим сниппетом, не поддерживающим возможность присоединения таблиц, то потребуется отредактировать сниппет voteforms и при изменении рейтинга дублировать необходимое вам значение в тв-поле ресурса.

В противном случае — сниппет внутри сниппета, но это так себе вариант: лучше перейти на pdoTools.
1251 — однобайтовая кодировка, UTF-8 — 2-6 байтовая (для русских символов — 2).

Другое дело, что разница на большинстве типичных проектов совершенно незначительна (если у вас проект размеров вконтакта — тогда другой разговор), а уж экономить на названии чанков — что-то совсем сродни паранойи.
UPD: также в дополнении выводятся форматы дат в разном виде (для свежесозданных документов — в timestamp, для уже созданных в формате даты), из-за чего в одном из случаев дата возвращается в виде 1970 года.

Решение:
— перед строкой
$LastModified = gmdate("D, d M Y H:i:s \G\M\T", $lmimsDate);

-добавить:
if (!is_numeric($lmimsDate)) {
	$lmimsDate = strtotime($lmimsDate);
}
Небольшая сводка информации по работе lmims:
1. Дополнение работает с https, а вот представленный здесь сервис проверки
last-modified.com/ru/ — нет. (рабочая альтернатива)
2. Дополнение перестает отдавать актуальную информацию, если на сайте используется MinifyX или любые сниппеты, возвращающие случайные переменные, как то:
— плейсхолдеры вида [^t^]
— любые функции рандома
— капча
— …

Способ решения проблемы:
— Заключаем актуальную информацию (без перечисленных элементов из пункта 2) в тег main:
<main role="main"></main>

— В плагине lmims заменяем строку
$hash = sha1($html);
на строку:
preg_match("'<main role=\"main\">(.*?)</main>'si", $html, $html_clear);
    
    if (strlen($html_clear[1]) > 0) {
    	$hash = sha1($html_clear[1]);
    }
    else {
    	$hash = sha1($html);
    }

3. Вероятно, у плагина есть проблемы с возвращением результата при 404/403 ошибки.