[Help] Товары из одной категории

Тема в разделе "Модули и дополнения", создана пользователем DiMoss, 7 мар 2016.

  1. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Приветствую Всех!

    Возможно уже есть готовый модуль. Если нет, то прошу Вас помочь мне его сделать.

    Требуется следующий функционал...
    На страничке продукта, необходимо вывести товары, которые принадлежат к той же группе, что и тот товар, на страничке которого мы находимся.
     
  2. Ален

    Ален Эксперт

    Сообщения:
    2.056
    Симпатии:
    640
    Начинайте. Будут вопросы пишите тут.

    Платные модули есть, бесплатных не видел.
     
  3. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.569
    Симпатии:
    432
    К группе чего, категории?
     
  4. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Есть n-ое количество товаров в Категории 1.
    Заходим в карточку товара из Категории 1, и надо чтобы в этой карточке формировался список товаров, которые принадлежат к Категории 1.

    Имеет место непонимание того, что кого определяет. Например мы определили что какие либо товары принадлежат конкретной категории. Когда мы заходим в эту категорию, то категория определяет какие товары необходимо отображать или товары определяют в какой категории отображаться?

    На данный момент, независимо от того, откуда я захожу в карточку товара, система определяет к какой категории он принадлежит.
    Снимок.PNG

    Я вот только не знаю, это "из коробки" такой функционал или это последствия установки мода для формирования полного пути хлебных крошек.

    По идее можно ведь позаимствовать уже имеющийся функционал формирования списка товаров в той или иной категории?!?
     
  5. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.569
    Симпатии:
    432
    Да можно позаимствовать, считай все готово, просто тупа copy paste
     
  6. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Из контроллера категорий? То есть надо смотреть как формируется переменная products? А она проходит через фильтры.... И вот я поднимаюсь вверх от массива products и в голову приходит мысль о том, что в контроллер карточки продукта нужно скопипастить практически весь контроллер категорий.
     
  7. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.569
    Симпатии:
    432
    Вы посмотрите как выглядит модуль категории. Вам остается просто добавить вывод продуктов.
     
    DiMoss нравится это.
  8. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    В модуле категорий (module/category.php) ведь парсятся все существующие категории, а мне надо получить id той, в которой находится товар

    В контролере категорий (product/category.php) я вижу такой запрос
    Код:
    $results = $this->model_catalog_category->getCategories($category_id);
    где $category_id принимает значение данных запросов
    Код:
    $parts = explode('_', (string)$this->request->get['path']);
    $category_id = (int)array_pop($parts);
    По сути то надо всего лишь выловить id категории чтобы он выступал в качестве фильтра для формирования списка товаров???
     
  9. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.569
    Симпатии:
    432
    По сути, да. Вот переменная, это id .В category.php - в каталоге, работает.
    PHP:
    $category_id
     
  10. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Вот эта конструкция выводит на экран например цифру 2 если адрес продукта .....product&path=1_2&product_id=1.....
    Код:
    $parts = explode('_', (string)$this->request->get['path']);
    $category_id = (int)array_pop($parts);   
    $results = $this->model_catalog_category->getCategories($category_id);
    
    $data['products_variant'] = array();
    
     $data['products_variant'][] = array(
       'path_id' => $category_id
      );
    
    Как я понял мне удалось выловить id
     
  11. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Вот такая конструкция выводит всего один товар(!!!ИСПРАВЛЕНО!!!! - выводит все товары из категории) из той же категории, в которой находится тот товар, в карточке которого мы находимся....

    PHP:
    $parts explode('_', (string)$this->request->get['path']);

    $category_id = (int)array_pop($parts);

    $filter_data = array(
      
    'filter_category_id' => $category_id
    );

    $data['products_variant'] = array();

    $results $this->model_catalog_product->getProducts($filter_data);

    foreach (
    $results as $result) {
      if (
    $result['image']) {
        
    $image $this->model_tool_image->resize($result['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
      } else {
        
    $image $this->model_tool_image->resize('placeholder.png'$this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
      }

      
    $data['products_variant'][] = array(
        
    'thumb' => $image,
        
    'href'  => $this->url->link('product/product''path=' $this->request->get['path'] . '&product_id=' $result['product_id'] . $url)
      );
    }
    Вывожу в шаблон вот таким образом...
    PHP:
    <?php if ($products_variant) { ?>
      <h3 class="col-color-list"><?php echo $text_color_list?></h3>
      <div class="row">
        <?php foreach ($products_variant as $product_variant) { ?>
          <div class="col-lg-2 col-sm-3 col-xs-6">
            <a href="<?php echo $product_variant['href']; ?>">
              <img src="<?php echo $product_variant['thumb']; ?>" alt="" title="" class="img-responsive" />
           </a>
         </div>
        <?php ?> 
      </div>
    <?php ?>
    С выводом вроде проблем не должно быть! Что то в контроллере надо допиливать!
     
    Последнее редактирование: 9 мар 2016
  12. Romans

    Romans Administrator Команда форума

    Сообщения:
    1.434
    Симпатии:
    780
    потому что должно быть, как то так так как вы не дописали, т.е не сформировали массив с товарами.
    Пример в \catalog\controller\product\category.php
    PHP:
                foreach ($results as $result) {
                    if (
    $result['image']) {
                        
    $image $this->model_tool_image->resize($result['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
                    } else {
                        
    $image $this->model_tool_image->resize('placeholder.png'$this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
                    }

                    if ((
    $this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) {
                        
    $price $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')));
                    } else {
                        
    $price false;
                    }

                    if ((float)
    $result['special']) {
                        
    $special $this->currency->format($this->tax->calculate($result['special'], $result['tax_class_id'], $this->config->get('config_tax')));
                    } else {
                        
    $special false;
                    }

                    if (
    $this->config->get('config_tax')) {
                        
    $tax $this->currency->format((float)$result['special'] ? $result['special'] : $result['price']);
                    } else {
                        
    $tax false;
                    }

                    if (
    $this->config->get('config_review_status')) {
                        
    $rating = (int)$result['rating'];
                    } else {
                        
    $rating false;
                    }

                    
    $data['products'][] = array(
                        
    'product_id'  => $result['product_id'],
                        
    'thumb'       => $image,
                        
    'name'        => $result['name'],
                        
    'description' => utf8_substr(strip_tags(html_entity_decode($result['description'], ENT_QUOTES'UTF-8')), 0$this->config->get('config_product_description_length')) . '..',
                        
    'price'       => $price,
                        
    'special'     => $special,
                        
    'tax'         => $tax,
                        
    'minimum'     => $result['minimum'] > $result['minimum'] : 1,
                        
    'rating'      => $result['rating'],
                        
    'href'        => $this->url->link('product/product''path=' $this->request->get['path'] . '&product_id=' $result['product_id'] . $url)
                    );
                }
     
    DiMoss нравится это.
  13. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Понял свою ошибку! Исправил код выше! Суть ошибки заключалась в том, что массив продукта был за пределами цикла. Поэтому и показывался только один товар. Теперь выводит весь товар из той категории, в которой находится товар, в котором находимся мы.
    С представленным выше кодом вывода в шаблон выглядит вот так....
    Снимок.PNG

    Добавлю ещё вывод остатка и модель (в моём случае номер цвета).

    По клику на миниатюру переходит на страницу товара.

    Теперь надо сделать так чтобы цикл не выводил миниатюру того товара на странице которого мы находимся! Вот думаю как лучше это сделать - править код в контроллере или фильтровать данные цикла в коде шаблона!?!?
     
    Последнее редактирование: 8 мар 2016
  14. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    В итоге вышло как то так...
    Снимок.PNG Снимок_2.PNG
    Если у кого то есть интерес к данной функции - выложу код контроллера и вывод в шаблон!

    Благодарю за помощь, друзья!
     
  15. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    в принципе без разницы, как вам проще.

    конечно есть, для того и создавался форум, чтобы было как можно больше полезных решений, а не решений "как нажать кнопку" :)
     
  16. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Тогда всё по порядку!

    1) Зачем и почему я делал этот функционал!?
    Весь товар в магазине имеет цветовые вариации. А посему, необходимо, чтобы все цветовые вариации, которые по сути являются отдельными товарами, находились в одном месте. Нужно это для того, чтобы покупатель мог видеть всю цветовую гамму модели!

    В общем то у меня они и без того находятся в одной категории! Однако если покупатель переходит например из поисковика, либо с главной страницы, или же ещё каким-либо способом на страницу товара, то увидит он там шиш)))) То бишь все один товар!

    2) Немного о проблеме
    В общем имеем n-ое количество товара(все цветовые варианты) в Категории #1.
    Снимок.JPG

    Это категория. Не обращайте внимание на таблицу свойств и производителя. Я сам их сюда вывел.

    Каждый товар имеет свою страницу (карточку товара), на которой собственно, помимо того товара, на странице которого мы находимся, необходимо отобразить остальные товары всё из той же категории.
    Снимок.JPG
    А отобразить мне необходимо было:
    -фотографию товара;
    -остаток;
    -модель (в моём случае номер цвета);

    3) Приступаем к решению проблемы
    В файле catalog\controller\product\product.php например перед строчкой $data['products'] = array(); вставляем код
    PHP:
    //Вывод дочерних товаров
    $parts explode('_', (string)$this->request->get['path']);

    $category_id = (int)array_pop($parts);
       
    $filter_data = array(
      
    'filter_category_id' => $category_id
    );

    $data['products_variant'] = array();

    $results $this->model_catalog_product->getProducts($filter_data);

    foreach (
    $results as $result) {
      if (
    $result['image']) {
        
    $image $this->model_tool_image->resize($result['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
      } else {
        
    $image $this->model_tool_image->resize('placeholder.png'$this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
      }     

      
    $stock $this->language->get('text_stock') . ' ';
      if (
    $result['quantity'] <= 0) {
        
    $stock .= $result['stock_status'];
      } elseif (
    $this->config->get('config_stock_display')) {
        
    $stock .= $result['quantity'];
      } else {
        
    $stock .= $this->language->get('text_instock');
      }
      
    $stock_qty $result['quantity']; 

      
    $data['products_variant'][] = array(
        
    'thumb'     => $image,
        
    'model'     => $result['model'],
        
    'stock'     => $stock,
        
    'stock_qty' => $stock_qty,
        
    'href'      => $this->url->link('product/product''path=' $this->request->get['path'] . '&product_id=' $result['product_id'] . $url)
      );
    }
    //Конец вывода дочерних товаров
    Немного о переменной
    PHP:
    $stock_qty $result['quantity'];
    Зачем и почему она нужна мне! Данная переменная содержит количество товара на складе и никак не привязана к условиям присваивания значений переменной $stock. А нужна она мне для того, чтобы я мог в шаблоне задать условие
    PHP:
    if ($stock_qty 0)
    В данном моде я использую это условие для того чтобы раздавать товарам id
    PHP:
    <?php foreach ($products as $product) { ?>
      <?php if ($product['stock_qty'] > 0) {
        
    $stock_id "instock";
      } else {
        
    $stock_id "nostock";
       } 
    ?>
        <div id="<?php echo $stock_id?>".........
    И необходимо это для того, чтобы работали кнопки В наличии или Все. То есть если Вам это не нужно, то можете удалить данную переменную из кода контроллера. Если Вам необходим функционал отображения или скрытие товара которого нет в наличии, то об этом чуть позже!

    4) Выводим товар в шаблон (файл catalog/view/theme/default/template/product/product.tpl)
    HTML:
    <?php if ($products_variant) { ?>
      <div class="col-xs-12" >
        <div class="row">
          <h3 class="col-sm-10 col-xs-7 col-color-list"><i class="fa fa-th"></i> <?php echo $text_color_list; ?></h3>
          <div id="category-options">             
            <button type="button" id="view-instock-variant" class="btn btn-default" data-toggle="tooltip" title="<?php echo $button_instock; ?>"><i class="fa fa-eye-slash fa-2x"></i></button>
            <button type="button" id="view-all-variant" class="btn btn-default active" data-toggle="tooltip" title="<?php echo $button_all; ?>"><i class="fa fa-eye fa-2x"></i></i></button>
          </div>
        </div>
      </div>
      <div class="row">
        <!--Список вариаций-->                               
        <?php foreach ($products_variant as $product_variant) { ?>
          <?php if ($product_variant['stock_qty'] > 0) {
            $stock_id = "instock";
          } else {
            $stock_id = "nostock";
          } ?>
          <div id="<?php echo $stock_id; ?>" class="col-lg-2 col-sm-3 col-xs-6">
            <div class="product-thumb boxshadow">                             
              <a href="<?php echo $product_variant['href']; ?>">
                <div class="product-name">
                  <?php echo $product_variant['model']; ?>
                </div>
                <img src="<?php echo $product_variant['thumb']; ?>" alt="<?php echo $product_variant['model']; ?>" title="<?php echo $product_variant['model']; ?>" class="img-responsive" />                     </a>             
              <div class="stock"><?php echo $product_variant['stock']; ?></div>
            </div>
          </div>
        <?php } ?>     
      </div>
    <?php } ?>
    
    Соответственно стили отображения настраивайте так как нужно Вам!

    P.S. В коде вывода в шаблон имеются кнопки
    HTML:
    <div id="category-options">             
      <button type="button" id="view-instock-variant" class="btn btn-default" data-toggle="tooltip" title="<?php echo $button_instock; ?>"><i class="fa fa-eye-slash fa-2x"></i></button>
      <button type="button" id="view-all-variant" class="btn btn-default active" data-toggle="tooltip" title="<?php echo $button_all; ?>"><i class="fa fa-eye fa-2x"></i></i></button>
    </div>
    
    Данные кнопки скрывают или показывают товары, которых нет в наличии! Как они работают.....

    Возвращаемся к переменной
    PHP:
    $stock_qty $result['quantity'];
    И раздаче id
    PHP:
    <?php foreach ($products as $product) { ?>
      <?php if ($product['stock_qty'] > 0) {
        
    $stock_id "instock";
      } else {
        
    $stock_id "nostock";
       } 
    ?>
        <div id="<?php echo $stock_id?>".........
    Зачем и почему!?!? Всё просто!!! Добавляем в файл common.js вот такой функционал
    PHP:
    //View instock variant product only
    $('#view-instock-variant').click(function() {
                 
      $(
    '#content #nostock').css('display''none');
      $(
    '#content #category-options #view-instock-variant').addClass('active');
      $(
    '#content #category-options #view-all-variant').removeClass('active');       
    });

    //View all variant product
    $('#view-all-variant').click(function() {
                 
      $(
    '#content #nostock').css('display''block');
      $(
    '#content #category-options #view-all-variant').addClass('active');
      $(
    '#content #category-options #view-instock-variant').removeClass('active');       
    });
    Пользуемся!!! Значение тайтлов кнопок прописывал в языковом файле рашн.пхп + добавил ссылку на перевод в контроллер.
     
    Vlad и RoS нравится это.
  17. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Есть потребность в "допиливании" функционала кнопок В наличии и Все. Этой функцией я пользуюсь также и в категориях. Только там другие id у кнопок и выбор запоминается. Имеется проблема в том, что когда покупатель зайдёт в категорию где нет товаров наличии и у него будет в памяти кнопка В наличии, то увидит он пустоту.
    Хочу в таком случае выводить сообщение. Для этого нужно сделать функцию, которая будет срабатывать при нажатии на кнопку В наличии и которая должна понять, что все товары скрыты, т.е. все товары имеют id nostock или не имеют id instock. Кто подскажет!?!?
     
  18. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    Код:
    if ($("#nostock").length > 0){
    // код
    } else {
    // код
    }
     
    DiMoss нравится это.
  19. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    !!!ВАЖНОЕ ДОПОЛНЕНИЕ К МОДУ!!!

    В файле catalog/controller/product/manufacturer.php в массиве
    PHP:
    $data['products'][] = array(
    строчку
    PHP:
    'href'        => $this->url->link('product/product''manufacturer_id=' $result['manufacturer_id'] . '&product_id=' $result['product_id'] . $url)
    меняем на
    PHP:
    'href'        => $this->url->link('product/product' '&product_id=' $result['product_id'] . $url)
    и в файле catalog/controller/product/product.php
    в начале функции function index() нужно вставить код для отлавливания категории в которой находится товар

    PHP:
    if (!isset($this->request->get['path']) && !isset($this->request->get['manufacturer_id']) && !isset($this->request->get['search']) && !isset($this->request->get['tag'])) {        
            
      
    $category_ids $this->model_catalog_product->getCategories($this->request->get['product_id']);
            
      
    $sort = array();
      foreach (
    $category_ids as $category_idss) {
        
    $sort[$category_idss['num_id']] = (int)$category_idss['category_id'];
      }
      
    ksort($sort);        
            
      
    $b=array_pop($sort);
      while (
    $b != '0') {
        
    $cat_arr[] = $b;
        
    $a $this->model_catalog_category->getCategory($b);
        
    $b $a['parent_id'];
       }      
       
    $this->request->get['path'] = implode("_"array_reverse($cat_arr));
    }
    Иначе при переходе в товар с главной страницы, либо со страницы производителя и т.п. посыпятся ошибки!
     
    Последнее редактирование: 9 мар 2016
    RoS нравится это.
  20. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Благодарю за наводку! Исполнил таким образом
    PHP:
    function chek_instock() {
      if ($(
    "#instock").length == 0){
        
    message "<p>Нет товаров в наличии.</p><p>Нажмите кнопку <strong>Все</strong> для просмотра полного списка товаров</p>";   
      } else {
        
    message "";
      }
      
    document.getElementById('nostock-variant').innerHTML message;   
    }
    function 
    chek_all() { 
      
    message ""
      
    document.getElementById('nostock-variant').innerHTML message;   
    }
    Триггер повесил на соответствующие кнопки с помощью параметра onclick
     
    RoS нравится это.