PrestaShop 1.7 - поиск товаров по тегу

Я заметил, что в PrestaShop 1.7 можно маркировать товары. Можно ли программно искать товары по их тегам?

Так, например, если я хочу найти продукты, которые содержат какой-либо из тегов ['madcow, crazydog, happyant'], как мне подойти к этому?

$this->context->getProducts('tag', ['madcow, crazydog, happyant']) ?

или, может быть

Product::getByAttribute('tag', ['madcow, crazydog, happyant'])

или похожие?

любая помощь очень ценится


person Novice Coder    schedule 31.01.2018    source источник


Ответы (2)


Вы можете получить активные продукты (идентификатор и имя) для каждого тега, выполнив следующие действия:

$tag = new Tag(null, "tag", $idlang);
$products = $tag->getProducts();

Конструктор тегов также Таким образом, ваш код может выглядеть примерно так:

$context = \Context::getContext();
$idlang = $context->language->id;

$tags = ['madcow', 'crazydog', 'happyant'];
$products = [];
foreach($tags as $t){
    $tag = new Tag(null, $t, $idlang);
    if($tag != null){
        $tag_products = $tag->getProducts();
        foreach($tag_products as $tg)
            $products[$tg['id_product']] = $tg['name'];
    }
}

РЕДАКТИРОВАТЬ: с учетом комментариев, возможно, было бы лучше получить все теги

$context = \Context::getContext();
$idlang = $context->language->id;

$tags = ['madcow', 'crazydog', 'happyant'];
$products = [];
foreach($tags as $t){
    $tag = new Tag(null, $t, $idlang);
    if($tag != null){
        $tag_products = $tag->getProducts();
        foreach($tag_products as $tg) {
            if(!isset($products[$tg['id_product']])) {
                 $products[$tg['id_product']] = [];
            }
            $products[$tg['id_product']][] = $tg['name'];
        }
    }
}

Затем, если вы хотите отсортировать по количеству найденных тегов, вы можете сделать что-то вроде:

usort($product, function($a, $b) { return count($b) - count($a); });

Отказ от ответственности: не тестировалось, пожалуйста, дайте мне знать, если вы обнаружите какую-либо ошибку.

person sadlyblue    schedule 31.01.2018
comment
Надеюсь, @sadlyblue увидит этот вопрос. Мне нужен этот код для моего веба, но я совершенно не понимаю последнюю строку, почему вы хотите перезаписать id_product названием продукта? - person Germán; 16.12.2019
comment
@Germán Я использовал этот массив, чтобы получить id_product и имя тега, ответственные за его поиск. Конечно, это не будет работать правильно, если несколько тегов найдут один и тот же продукт, будет возвращен только последний. Я попытаюсь отредактировать код, чтобы добавить несколько тегов, тогда вы даже сможете сортировать по релевантности. - person sadlyblue; 16.12.2019

Вы можете использовать этот фрагмент:

$array_tags = implode(',',['one','two','three']);

$id_lang = $this->context->language->id;

$products = Db::getInstance()->executeS('
    SELECT pl.id_product
    FROM `'._DB_PREFIX_.'product` p
    LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.id_product = pl.id_product'.Shop::addSqlRestrictionOnLang('pl').'
    '.Shop::addSqlAssociation('product', 'p').'
    WHERE pl.id_lang = '.(int) $id_lang.'
    AND product_shop.active = 1 
    AND p.id_product IN (SELECT pt.id_product FROM `'._DB_PREFIX_.'product_tag` pt WHERE pt.name IN ('.pSQL($array_tags).'))
    ORDER BY pl.name');
person Matt Loye    schedule 31.01.2018