Как реализован функционал тэгов на modstore?

В попытках сделать навигацию по тэгам облазил все поиски, вник в несколько предлагаемых вариантов «с бубном» и сторонними сниппетами, но так и не решился их воспроизвести, как-то не верится, что все так заморочено (по крайней мере для таких как я, не программистов, ну или просто не въехал). Тем паче, осваиваю minishop2 и в нем по косвенным признакам с тэгами все предусмотрено и должно как-то проще работать. Но в мануалах разобрал только, что с помощью msOptions можно вывести список тэгов товара. (Как-то так:
[[!msOptions?
    &options=`tags`
    &tpl=`@INLINE: 
    {foreach $options as $name => $values}
                {foreach $values as $value}
                    <span>{$value}</span>,
                {/foreach}
{/foreach}`
]]
). Хотел в демке minshop'а что-нибудь найти, но в шаблоны с чанками там не заглянуть. В общем, подумал, что на третий день поисков не грех и спросить, тем более что идеальный вариант того, что нужно, все время перед глазами — то как работают тэги в каталоге на сайте modstore — выводятся ссылками, группируются, фильтруются… Небось и облако тэгов собрать пару пустяков… В конечном счете хочется вот так же и реализовать навигацию по магазину — просто и функционально, по тэгам. В minishop ведь все вроде для этого есть? В мануале не видать…

Если это не страшная какая тайна, поделитесь, как на modstore сделано?
Алексей Яковлев
28 мая 2017, 17:29
modx.pro
5
1 367
0

Комментарии: 3

Алексей Яковлев
28 мая 2017, 23:03
0
Все же какой-никакой вариант оказывается был, проглядел, тут: https://modx.pro/help/10390/
    Василий Наумкин
    29 мая 2017, 08:56
    4
    +3
    В modstore.pro всё как раз сделано через теги 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 есть, но реализацию работы с ними на сайте я оставляю на совести разработчика.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3