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 так и с обычными ресурсами
Поблагодарить автора
Отправить деньги
Комментарии: 39
Сегодня же воткну на сайт, спасибо
Интересное решение!
Раньше пользовался для этих целей getRelated, твоё решение мне больше нравится простотой и интеграцией с pdoTools!
Можно и в пакет запаковать ))
Раньше пользовался для этих целей getRelated, твоё решение мне больше нравится простотой и интеграцией с pdoTools!
Можно и в пакет запаковать ))
На fenom-е посимпатичнее будет:
{foreach $_modx->resource.pagetitle | split : ' ' as $pagetitle_word}
{if $pagetitle_word | length > 3}
{var $words[] = $pagetitle_word}
{/if}
{/foreach}
{set $random_word_position = rand(1, $words| length)}
{set $random_word = $words[$random_word_position - 1]}
{$_modx->runSnippet('!msProducts', [
'parent' => $_modx->resource.parent,
'resources' => -$_modx->resource.id,
'where' => '{
"pagetitle:LIKE": "%' ~ $random_word ~ '%"
}',
...
])}
Вкусовщина конечно, но не хотел бы я чтобы мне попался проект где вот таких вот сниппетов в шаблоне с десяток) Все таки надо разделять верстку и программирование, вы же не пишите все операции в одном файле, а резделяете на функции/классы, хоть их вызов и отнимает больше времени, но лайк однозначно поставлю!)
*пожал плечами* Для больших объемов или многократно повторяющихся вызовов — пожалуй.
В данном случае «похожие товары», скорее всего, будут выводиться только на странице самого товара.
Плюс, с fenom-ом кол-во запросов к бд сокращается минимум на 1..)
К слову, по поводу разделения: логику разбивания и выборки случайного слова из заголовка можно вынести в модификатор.
В данном случае «похожие товары», скорее всего, будут выводиться только на странице самого товара.
Плюс, с fenom-ом кол-во запросов к бд сокращается минимум на 1..)
К слову, по поводу разделения: логику разбивания и выборки случайного слова из заголовка можно вынести в модификатор.
Обновление: Раз сниппет оказался много кому нужен, собрал транспортный пакет и допилил его вид до более универсального
Как только опубликуют в modstore допилю похожесть по полям цвета и размера, эти поля хранят не строку, а массив
Приветствую. Еще не реализовано?
Can I use this plugin like GetRelated for Modx? Does it work with Articles?
I am so sorry, I don't speak Russian.
— Google Translate:
Могу ли я использовать этот плагин, как GetRelated для Modx? Это работает со статьями?
Мне очень жаль, я не говорю по-русски.
I am so sorry, I don't speak Russian.
— Google Translate:
Могу ли я использовать этот плагин, как GetRelated для Modx? Это работает со статьями?
Мне очень жаль, я не говорю по-русски.
Sure, simple example for use:
[[!modRelation?
&parents=`0`
&element=`pdoResources`
&tpl=`@INLINE [[+pagetitle]]
`
]]
Thank you! I will try that!
Hi Pavel, I am trying to implement your code
[[!modRelation?
&parents=`3,157,158,159`
&limit=`3`
&element=`pdoResources`
&includeTVs=`featureimage`
&tpl=`modrelationchunck`
&wrapIfEmpty=`modrelationchunck`
]]
Do you think is it possible to display a default chunck or result if result is empty?
It is ok, I managed to do it with
I just have 2 questions:
— What can I use for &field?
— is it necessary to call the plugin uncached?
[[!modRelation:default=``?
.I just have 2 questions:
— What can I use for &field?
— is it necessary to call the plugin uncached?
А как быть с опциями товаров?
Мне надо чтобы похожие шины выводил по ширине, высоте и радиусу.
Мне надо чтобы похожие шины выводил по ширине, высоте и радиусу.
Пока что нет такого функционала, нет времени и желания (да и желающих на него тоже нет), возможно вы хотите проспонсировать разработку, тогда добро пожаловать в личные сообщения :)
c Tickets не работает чтоли? При вызове снипета — выводится пустая страница
Покажи вызов сниппета
[[!modRelation?
&parents=`0`
&sortby=`RAND()`
&includeTVs=`image`
&tpl=`tpl-side-bar-articles`
&element=`getTickets`
]]
Только что проверил скопировав твой вызов все нормально отрабатывает, если можешь прислать доступы в личку, пришли гляну
с
&element=`pdoResources`
тоже самое — пустая страница. Вызов на странице тикета
А как сделать чтобы не выводились записи рандомно при каждом обновлении страницы
<div class="modrelation">
<div class="modrelation_title">Похожие темы</div>
{$_modx->runSnippet('!modRelation',[
'field' => 'pagetitle',
'parents' => '0',
'element' => 'msProducts',
'tpl' => '@FILE chunks/products/item-catalog.tpl',
])}
</div>
Сделай сниппет некешируемый, убрав восклицательный знак в вызове, тогда результаты будут сгенерированы только один раз
Подскажите, вывожу сниппет, наглухо вешает страницу. В результате 504 ошибка. Что может быть?
{'!modRelation' | snippet : [
'element' => 'msProducts',
'parents' => 2,
'sortby' => 'RAND()',
'limit' => 3,
]}
Такая же проблема. Удалось решить?
Удалось решить?
А как в field указать свое кастомное поле из minishop?
У меня в товаре есть кастомное поле где я прописываю параметры товара и нужно выводить похожие по этому полю, указываю его в field но ничего не выводит.
У меня в товаре есть кастомное поле где я прописываю параметры товара и нужно выводить похожие по этому полю, указываю его в field но ничего не выводит.
Почему-то дополнение modRelation не найдено в магазине приложений.
Вчера установил, остался доволен, Павел молодец
Здравствуйте, не обнаружил дополнение в репозитории (( вы случайно не удалили его от туда?
Прошу прощения, из установщика пакетов действительно не видит.
Максимальная версия стояла 2.6, исправил
Добрый день. Возник вопрос с выводом.
Вывожу так:
Вывожу так:
[[!modRelation?
&element=`msProducts`
&field=`pagetitle`
&separator=` `
&limit=`10`
&parents=`0`
&tpl=`TestminipProductTpl`
]]
Выводит через раз, то сразу, то после нескольких обновлений страницы
Та же самая проблема! опробывал на 3х боевых интернет-магазинах. Везде выводит через раз, непонятно с чем связано… Сделал вызов с кешированием, помогло ровно на день. Обновлял до посинения все работало, потом опять перестало работать
Вы бы хоть принцип работы читали бы… Если ничего не вывело значит не нашло для конкретного сочитания похожие ресурсы, делайте логику обработки пустых выводов, например так:
{set $relations = '!modRelation' | snippet: [...]}
{if $relations}
{$relations}
{else}
...Ваш вывод, например рандомные статьи....
{/if}
Выводит через раз, зашел в товар, похожих товаров нет. Через 5 секунд обновил они появились
поробовал вывод больше 30 товаров лимита, хостинг заругался, нагрузка слишком высокая
Кто ни будь делал вывод похожих товаров по значению опции в минишопе?
а почему по значению TV нельзя сделать вывод?
Еще давно писал, что выводит некорректно. Если выводить через феном, то все работает отлично!
Это вывод случайных товаров для minishop2
Если подходящих результатов нет, то выведет случайные товары через pdo
Это вывод случайных товаров для minishop2
Если подходящих результатов нет, то выведет случайные товары через pdo
{set $relations = '!modRelation' | snippet: [
'parents' => 2,
'element' => 'msProducts',
'field' => 'pagetitle',
'limitWord' => 5,
'limit' => 8,
'sortby' => 'RAND()',
'tpl' => 'tpl.catalog-rand',
'substr' => '-3'
]}
{if $relations}
{$relations}
{else}
{'!pdoPage' | snippet : [
'parents' => $_modx->resource.parent,
'element' => 'msProducts',
'sortby' => 'RAND()',
'tpl' => 'tpl.catalog-rand',
'sortby' => 'RAND()',
'optionFilters' => ['square:>' =>'4']
]}
{/if}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.