[Помогите] вывести категории в карточку товара

Тема в разделе "OpenCart", создана пользователем Beard, 7 ноя 2015.

  1. Beard

    Beard

    Регистрация:
    7 ноя 2015
    Сообщения:
    2
    Симпатии:
    0
    Необходимо в карточку товара добавить вывод категорий, в которых товар находится. 2.0.3.1, стоит Journal 2.6.5. Гуглил и пробовал способы для Opencart 1.5... - ничего не получается. Может решение для 2.0 чем-то отличается? Или просто руки кривые. Помогите.
     
  2. iga

    iga

    Регистрация:
    6 фев 2014
    Сообщения:
    285
    Симпатии:
    53
  3. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    catalog/model/catalog/product.php
    находим строку:
    Код:
    public function getCategories($product_id) {
    перед ней добавляем:
    Код:
    public function getCategoryNames($product_id) {     
            $query = $this->db->query("SELECT cd.name
                            FROM " . DB_PREFIX . "category_description cd
                            LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p2c.category_id = cd.category_id)
                                WHERE p2c.product_id = '" . (int)$product_id . "'
                                AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "'");     
            return $query->rows;
        }
    далее... идем к catalog/controller/product/product.php
    находим строку:
    Код:
    $data['points'] = $product_info['points'];
    после неё добавляем:
    Код:
    //add_cat_list_baco 
            $data['cat_list'] = $this->model_catalog_product->getCategoryNames($product_id);
    //EOF_add_cat_list_baco
    и на финал:
    catalog/view/theme/ВАША_ТЕМА/template/product/product.tpl
    находим:
    Код:
    <?php if ($tax) { ?>
    перед этой строкой, добавляем:
    Код:
    <?php if ($cat_list) { ?>
                    <?php foreach ($cat_list as $cat_name) { ?>
                        <li><?php echo $cat_name['name']; ?></li>
                    <?php } ?>
    <?php } ?>
    готово...
     
    CTPAHnick, mike69, Beard и ещё 1-му нравится это.
  4. Beard

    Beard

    Регистрация:
    7 ноя 2015
    Сообщения:
    2
    Симпатии:
    0
    все так сделал - ругается
    Notice: Undefined variable: cat_list in /home/konstruk/public_html/catalog/view/theme/journal2/template/product/product.tpl on line 331
    --- Добавлено, 8 ноя 2015 ---
    именно категории в карточку товара
    Спасибо! Разобрался - очистил кэш модификаторов и обновил.
     
    Последнее редактирование: 8 ноя 2015
  5. mike69

    mike69

    Регистрация:
    18 ноя 2015
    Сообщения:
    3
    Симпатии:
    0
    Гуглил и пробовал варианты часов 5 и наконец-то нашел здесь более-менее рабочее решение для моего случая) в основном все ответы для старых опенкарт, и для новых версий адаптировать не удалось.

    Вывожу категорию в карточке товара, когда товаров на странице несколько. Конкретно, модуль futured (рекомендуемые товары). В дальнейшем и в каталоге хотел бы вывести.
    Но появилась проблема - выводится одинаковая категория для всех товаров (сами товары относятся к разным категориям - а выводится одна и та же у всех). Видимо надо поместить код внутрь массива, который выведет каждому товару его категорию.. но сделать это никак не удалось. Не могли бы вы мне помочь? opencart 2

    PS
    в идеале, если это не слишком сложно, хотелось бы чтобы название категории было еще ссылкой на эту категорию, а не просто текстом.

    заранее благодарю..
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Нужно обработку делать в том же цикле, в котором формируется массив товаров для вывода в шаблон, а вы, вероятно, это делаете после цикла, потому туда попадает только категория из последнего товара в цикле, которая осталась в переменной.
    Посмотрите, как выводится, например, название товара и всё поймёте.
     
    mike69 нравится это.
  7. mike69

    mike69

    Регистрация:
    18 ноя 2015
    Сообщения:
    3
    Симпатии:
    0
    возможно с моей будет наглостью просить конкретно пример кода, но иначе никак не получается, совсем не программист :(

    featured.php
    Код:
    <?php
    class ControllerModuleFeatured extends Controller {
        public function index($setting) {
            $this->load->language('module/featured');
            $this->document->addScript('catalog/view/javascript/jquery/owl-carousel/owl.carousel.min.js');
           
            $data['heading_title'] = $setting['name'];
    
            $data['text_alt'] = $this->language->get('text_alt');
           
            $data['button_cart'] = $this->language->get('button_cart');
            $data['button_wishlist'] = $this->language->get('button_wishlist');
            $data['button_compare'] = $this->language->get('button_compare');
    
            $this->load->model('catalog/product');
    
            $this->load->model('tool/image');
    
            $data['products'] = array();
    
            if (!$setting['limit']) {
                $setting['limit'] = 100;
            }
    
            if (!empty($setting['product'])) {
                $products = array_slice($setting['product'], 0, (int)$setting['limit']);
    
                foreach ($products as $product_id) {
                    $product_info = $this->model_catalog_product->getProduct($product_id);
    
                    if ($product_info) {
                        if ($product_info['image']) {
                            $image = $this->model_tool_image->resize($product_info['image'], $setting['width'], $setting['height']);
                        } else {
                            $image = $this->model_tool_image->resize('placeholder.png', $setting['width'], $setting['height']);
                        }
    
                        if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
                            $price = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
                        } else {
                            $price = false;
                        }
    
                        if ((float)$product_info['special']) {
                            $special = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')));
                        } else {
                            $special = false;
                        }
    
                        if ($this->config->get('config_tax')) {
                            $tax = $this->currency->format((float)$product_info['special'] ? $product_info['special'] : $product_info['price']);
                        } else {
                            $tax = false;
                        }
    
                        if ($this->config->get('config_review_status')) {
                            $rating = $product_info['rating'];
                        } else {
                            $rating = false;
                        }
    
                        $imgs = $this->model_catalog_product->getProductImages($product_info['product_id']);
                        $imgt = array();
                        foreach ($imgs as $imgi) {
                            $imgt[0] = array(
                                'thumb' => $this->model_tool_image->resize($imgi['image'], $setting['width'], $setting['height'])
                            );
                        }
    
                        $data['products'][] = array(
                            'images'      => $imgt,
                            'product_id'  => $product_info['product_id'],
                            'thumb'       => $image,
                            'name'        => $product_info['name'],
                            'price'       => $price,
                            'special'     => $special,
                            'tax'         => $tax,
                            'rating'      => $rating,
                            'href'        => $this->url->link('product/product', 'product_id=' . $product_info['product_id'])
                        );
                    }
                }
            }
    
            if ($data['products']) {
                if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/featured.tpl')) {
                    return $this->load->view($this->config->get('config_template') . '/template/module/featured.tpl', $data);
                } else {
                    return $this->load->view('default/template/module/featured.tpl', $data);
                }
            }
        }
    }
    повторюсь, представленное здесь решение сделано для страницы товара и все работает, а на странице с несколькими товарами - категория повторяется. не получилось сформировать категорию и ссылку на категорию, чтобы потом вывести их в цикле где формируется название и прочее)
    --- Добавлено, 19 ноя 2015 ---
    http://cartopen.ru/kategorii-v-kartochku-tovara тут нашел пример с категорией и ссылкой на категорию, но тоже для страницы товара. впрочем наверное версия OpCa другая и потому не работает вовсе
     
  8. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Я в этом коде вообще не вижу никакого вывода категорий.

    Чтоб вывести категорию для товара в этом модуле, добавьте её вывод сюда:
    PHP:
    $data['products'][] = array(
                            
    'images'      => $imgt,
                            
    'product_id'  => $product_info['product_id'],
                            
    'thumb'       => $image,
                            
    'name'        => $product_info['name'],
                            
    'price'       => $price,
                            
    'special'     => $special,
                            
    'tax'         => $tax,
                            
    'rating'      => $rating,
                            
    'href'        => $this->url->link('product/product''product_id=' $product_info['product_id']),

                            
    /* Вот так: */
                            
    'product_category' => $product_category
                        
    );
    Соответственно, заранее нужно подготовить переменную $product_category и сделать это прямо перед массивом, куда вы её выводите. Для этого сойдёт инструкция, которая по вашей ссылке (та часть, которая относится к контроллеру), она актуальна и для ОК 2. Только у вас вместо $product_id будет $product_info['product_id'].
     
    mike69 нравится это.
  9. mike69

    mike69

    Регистрация:
    18 ноя 2015
    Сообщения:
    3
    Симпатии:
    0
    имел ввиду решение от Baco.

    Спасибо за подсказку, разобрался, сделал. Насчет качества кода не знаю, но работает.

    подготовка переменной в контроллере
    PHP:
    $querycats $this->model_catalog_product->getCategories($product_id);
    $categories = array();
    foreach( 
    $querycats as $item ) {
                
    $categ $this->model_catalog_category->getCategory($item['category_id']);
                
    $catinfo['id'] = $item['category_id'];
                
    $catinfo['href'] = $this->url->link('product/category''path=' $item['category_id']);
                
    $catinfo['name'] = $categ['name'];
                
    $categories[] = $catinfo;
    }
    а дальше, как вы показали - 'product_category' => $product_category в нужном месте

    потом вывод в шаблоне:
    PHP:
    <div class="product-category">
    <?php foreach ($product['categories'] as $category) { ?>
        <a href="<?php echo $category['href']; ?>" rel="nofollow"><?php echo $category['name']; ?></a>
    <?php ?>
    </div>
    и остается лишь оформить в css, чтобы была запятая или промежуток между категориями (если у товара более 1 категории).

    надеюсь много лишней нагрузки такой код не принесет.
     
    Lasted edited by : 23 ноя 2015
  10. starlin

    starlin

    Регистрация:
    8 фев 2013
    Сообщения:
    4
    Симпатии:
    2
    Все по приведенному примеру работает в 2.0

    там минимальные правки -
    Код:
        <file path="catalog/controller/product/product.php">
            <operation>
                <search trim="true"><![CDATA[$this->document->setDescription($product_info['meta_description']);]]></search>
                <add trim="true" position="replace"><![CDATA[
                $this->document->setDescription($product_info['meta_description']);
    //
              $this->load->model('catalog/category');
             
              $catprod = array();
             
              $product_category = $this->model_catalog_product->getCategories($product_id);
             
              foreach ($product_category as $prodcat) {
             
              $category_info = $this->model_catalog_category->getCategory($prodcat['category_id']);
             
              if ($category_info) {
             
              $data['catprod'][] = array(
              'name'     => $category_info['name'],
              'href'     => $this->url->link('product/category', 'path=' . $category_info['category_id'])
              );
              }
              }
             //
    
        ]]></add>
            </operation>
        </file>
    И выводит все назначенные товару категории