Как реализован функционал тэгов на modstore?
В попытках сделать навигацию по тэгам облазил все поиски, вник в несколько предлагаемых вариантов «с бубном» и сторонними сниппетами, но так и не решился их воспроизвести, как-то не верится, что все так заморочено (по крайней мере для таких как я, не программистов, ну или просто не въехал). Тем паче, осваиваю minishop2 и в нем по косвенным признакам с тэгами все предусмотрено и должно как-то проще работать. Но в мануалах разобрал только, что с помощью msOptions можно вывести список тэгов товара. (Как-то так:
Если это не страшная какая тайна, поделитесь, как на modstore сделано?
[[!msOptions?
&options=`tags`
&tpl=`@INLINE:
{foreach $options as $name => $values}
{foreach $values as $value}
<span>{$value}</span>,
{/foreach}
{/foreach}`
]]
). Хотел в демке minshop'а что-нибудь найти, но в шаблоны с чанками там не заглянуть. В общем, подумал, что на третий день поисков не грех и спросить, тем более что идеальный вариант того, что нужно, все время перед глазами — то как работают тэги в каталоге на сайте modstore — выводятся ссылками, группируются, фильтруются… Небось и облако тэгов собрать пару пустяков… В конечном счете хочется вот так же и реализовать навигацию по магазину — просто и функционально, по тэгам. В minishop ведь все вроде для этого есть? В мануале не видать…Если это не страшная какая тайна, поделитесь, как на modstore сделано?
Комментарии: 3
Все же какой-никакой вариант оказывается был, проглядел, тут: https://modx.pro/help/10390/
В modstore.pro всё как раз сделано через теги miniShop2.
Вывод тегов товара в чанке:
При клике юзер переходит по ссылке /packages/tag/любойтег, для которой должен сработать плагин OnPageNotFound, проверяющий наличие секции tag в адресе:
Дальше идёт загрузка страницы с выводом каталога, на которой вызывается mFilter2, где в &element указан не msProducts, а специальный сниппет-обёртка extraProducts. Он смотрит наличие выставленного плейсхолдера extras_tag, и вызывает уже msProducts:
Так что да, теги в miniShop2 есть, но реализацию работы с ними на сайте я оставляю на совести разработчика.
Вывод тегов товара в чанке:
{if count($product.tags)}
<div class="tags">
{foreach $product.tags as $tag}
<a href="{$packages_url}/tag/{$tag}">{$tag}</a>
{/foreach}
</div>
{/if}
При клике юзер переходит по ссылке /packages/tag/любойтег, для которой должен сработать плагин OnPageNotFound, проверяющий наличие секции tag в адресе:
$uri = trim(urldecode($_SERVER['REQUEST_URI']), '/');
$tmp = explode('/', preg_replace('#\?.*#', '', $uri));
if (count($tmp) == 3 && $tmp[1] == 'tag') {
$value = preg_replace('#[^\w\s\.-]#u', '', $this->modx->stripTags(urldecode($tmp[2])));
if (!empty($value)) {
$this->modx->setPlaceholder('extras_tag', $value);
$this->modx->resource = $this->modx->request->getResource('id', $this->modx->config['packages_id']);
if ($this->modx->resource) {
$this->modx->resource->set('longtitle', $this->modx->resource->longtitle . " ($value)");
$this->modx->resource->set('pagetitle', $this->modx->resource->pagetitle . " ($value)");
}
$this->modx->sendForward($this->modx->config['packages_id'], ['merge' => true]);
}
}
Дальше идёт загрузка страницы с выводом каталога, на которой вызывается mFilter2, где в &element указан не msProducts, а специальный сниппет-обёртка extraProducts. Он смотрит наличие выставленного плейсхолдера extras_tag, и вызывает уже msProducts:
if ($tag = $modx->getPlaceholder('extras_tag')) {
$table = $modx->getTableName('msProductOption');
$c = $modx->prepare("SELECT COUNT(product_id) FROM {$table} WHERE `key` = 'tags' AND `value` = '{$tag}'");
if ($c->execute() && !$c->fetchColumn()) {
$modx->sendRedirect($modx->makeUrl($modx->resource->id));
}
$scriptProperties['innerJoin']['Tag'] = [
'alias' => 'Tag',
'class' => 'msProductOption',
'on' => 'Tag.key="tags" AND Tag.product_id = msProduct.id AND Tag.value = "' . $tag . '"',
];
}
return $modx->runSnippet('msProducts', $scriptProperties);
Так что да, теги в miniShop2 есть, но реализацию работы с ними на сайте я оставляю на совести разработчика.
Спасибо большое!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.