Как вывести теги товара в списке товаров?

Думал как создать доп. лейблы а-ля “снято с производства” и решил использовать теги.
Внутри карточки товара лейблы сделал, а вот со списком товаров проблема. По умолчанию в списке товаров не выводятся теги.

Стал искать в модуле tags что либо. Нашел вот такой frontend хук внутри /app/addons/tags/controllers/frontend/products.post.php:

if ($mode == 'view' && Registry::get('addons.tags.tags_for_products') == 'Y') {
$product = Tygh::$app['view']->getTemplateVars('product');

list($tags) = fn_get_tags(array(
    'object_type' => 'P',
    'object_id' => $product['product_id'],
    'status' => array('A')
));

$product['tags'] = $tags;

Tygh::$app['view']->assign('product', $product);

}

Если я правильно понял - массив данных продукта наполняется элементом tags. Но почему тогда нет данных в карточке товара?

Искать внутри /app/controllers/frontend/products.php? Ведь в нем все функции, которые отвечают за вывод данных о товаре?

а как сделали у себя для списка товаров? Там ведь надо вытягивать массив $products - и в цикле к каждому вытягивать тэги

Внутри карточки товара вывожу вот так в /design/themes/site_name/templates/common/product_data.tpl:

  {* Ярлык [Снято с производства] *}
  {foreach from=$product.tags item="tag" name="tags"}
    {if $tag.tag == "Снято с производства"}
      {include
        file="views/products/components/product_label.tpl"
        label_meta="product__label--outofproduction"
        label_text=__("out_of_production")
        label_mini=$product_labels_mini
        label_static=$product_labels_static
        label_rounded=$product_labels_rounded
      }
    {/if}
  {/foreach}

И это работает так как в карточке $product.tags имеет значения. А вот в категории $product.tags пуст.

в шаблоне понятно, шаблон выводит полученные данные.
контроллеры - фронтенд - categories.php
мод view, у меня строка 105

list($products, $search) = fn_get_products($params, Registry::get('settings.Appearance.products_per_page'), CART_LANGUAGE);

здесь получается массив products с товарами
то есть надо сделать categories.post.php
что-то типа

if ($mode == 'view' && Registry::get('addons.tags.tags_for_products') == 'Y') {
$products = Tygh::$app['view']->getTemplateVars('products');

foreach ($products as &$product) {
list($tags) = fn_get_tags(array(
    'object_type' => 'P',
    'object_id' => $product['product_id'],
    'status' => array('A')
));

$product['tags'] = $tags;
}
Tygh::$app['view']->assign('products', $products);

надо свериться с форматом массива products только, это я как пример набросал

1 лайк

Большое спасибо! Все получилось.

Я пытался сначала сделать по аналогии с /var/www/html/seversb.ru/app/addons/tags/controllers/frontend/products.post.php, но там используется $product. Так как это один товар, а не множество, как в списке товаров. А надо было брать переменную $products.

Создал отдельный модуль. В нем файл /app/addons/module_name/controllers/frontend/categories.post.php

В него Ваш код:

use Tygh\Registry;
if (!defined('BOOTSTRAP')) { die('Access denied'); }

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    return;
}

if ($mode == 'view' && Registry::get('addons.tags.tags_for_products') == 'Y') {
    $products = Tygh::$app['view']->getTemplateVars('products');

    foreach ($products as &$product) {
    list($tags) = fn_get_tags(array(
        'object_type' => 'P',
        'object_id' => $product['product_id'],
        'status' => array('A')
    ));

    $product['tags'] = $tags;
}
Tygh::$app['view']->assign('products', $products);
}
3 лайка