modRelation - Похожие товары для minishop2 и pdoTools
В общем кратенькая заметка, но думаю некоторым поможет, нужно было реализовать правильную перелинковку сайта, а заказчик никак не хотел вручную делать связи, пришлось написать вот такой «Умный» сниппет, который при правильном заполнении каталога вполне неплохо себе справляется с подбором похожих ресурсов, если я ни для кого америку не открыл, то сорян, а если открыл, то могу собрать пакет с этим сниппетом и выложить в modstore бесплатно для более легкой установки :)

ОБНОВЛЕНО:
Компонент доступен для загрузки в modstore
Описание работы:
Сниппет разделяет по словам поле, которое вы укажите в field (по умолчанию pagetitle), выбирает рандомное слово из массива слов и выполянет поиск по базе ресурсов с похожими словами
Сниппет:
Принимает на вход:
Примеры вызова:
Простой вызов для msProducts

ОБНОВЛЕНО:
Компонент доступен для загрузки в modstore
Описание работы:
Сниппет разделяет по словам поле, которое вы укажите в field (по умолчанию pagetitle), выбирает рандомное слово из массива слов и выполянет поиск по базе ресурсов с похожими словами
Сниппет:
<?php
if (empty($field)) {
$field = 'pagetitle';
}
if (empty($separator)) {
$separator = ' ';
}
if (empty($element)) {
$element = 'pdoResources';
}
if (empty($limitWord)) {
$limitWord = 3;
} else {
$limitWord = intval($limitWord);
}
$pagetitle = $modx->resource->get($field);
if (!$pagetitle) {
return ;
}
$arr = explode($separator, $pagetitle);
$rand = array_rand($arr, 1);
while (iconv_strlen($arr[$rand]) < $limitWord):
$rand = array_rand($arr, 1);
endwhile;
$rand_pt = $arr[$rand];
$where = array('where' => array(
$field.':LIKE' => '%'.$rand_pt.'%',
'id:!=' => $modx->resource->id
));
$scriptProperties = array_merge($where, $scriptProperties);
$pdoTools = $modx->getService('pdoTools');
return $pdoTools->runSnippet($element, $scriptProperties);Внимание, код устаревший, используйте версию из modstoreПринимает на вход:
- field — поле по которому будут искаться похожие ресурсы, можно использовать любые поля ресурса, если это не тв параметры по умолчанию pagetitle
- separator — разделитель по которому будет делиться объекты для поиска по умолчанию пробел
- limitWord — минимальная длина слова для поиска похожих ресурсов, по умолчанию 3
- element — сниппет для вывода результатов, по умолчанию pdoResource
Примеры вызова:
Простой вызов для msProducts
[[!modRelation?
&element=`msProducts`
&parents=`0`
&sortby=`RAND()`
]]Со всеми параметрами:[[!modRelation?
&field=`pagetitle`
&separator=` `
&limitWord=`3`
&element=`msProducts`
&parents=`0`
&tpl=`tpl_product_row`
&sortby=`RAND()`
]]Пример использования для статей и обычных ресурсов:[[!modRelation?
&parents=`0`
&sortby=`RAND()`
&tpl=`@INLINE [[+pagetitle]]`
]]Сниппет работает как с продуктами minishop2 так и с обычными ресурсами Комментарии: 40
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Раньше пользовался для этих целей getRelated, твоё решение мне больше нравится простотой и интеграцией с pdoTools!
Можно и в пакет запаковать ))
В данном случае «похожие товары», скорее всего, будут выводиться только на странице самого товара.
Плюс, с fenom-ом кол-во запросов к бд сокращается минимум на 1..)
К слову, по поводу разделения: логику разбивания и выборки случайного слова из заголовка можно вынести в модификатор.
I am so sorry, I don't speak Russian.
— Google Translate:
Могу ли я использовать этот плагин, как GetRelated для Modx? Это работает со статьями?
Мне очень жаль, я не говорю по-русски.
Do you think is it possible to display a default chunck or result if result is empty?
I just have 2 questions:
— What can I use for &field?
— is it necessary to call the plugin uncached?
Мне надо чтобы похожие шины выводил по ширине, высоте и радиусу.
У меня в товаре есть кастомное поле где я прописываю параметры товара и нужно выводить похожие по этому полю, указываю его в field но ничего не выводит.
Вывожу так:
Выводит через раз, то сразу, то после нескольких обновлений страницы
Это вывод случайных товаров для minishop2
Если подходящих результатов нет, то выведет случайные товары через pdo
Кто то еще ловил это?