Следующий предыдущий товар

Тема в разделе "Инструкции и FAQ", создана пользователем rip, 8 май 2015.

  1. rip

    rip Пользователь

    Сообщения:
    84
    Симпатии:
    19
    Для того, чтобы в карточке товара (опенкарт 2.0) были ссылки, указывающие на Следующий/Предыдущий товар необходимо добавить нижеприведённый код в указанные три файла. Работа по принципу: $product_id+1; $product_id-1, т.е. товары нужно забивать по порядку.

    в файле: catalog/controller/product/product.php

    после строки:
    Код:
    $data['heading_title'] = $product_info['name'];
    добавить:
    Код:
     
    
                $data['text_prev'] = $this->language->get('text_prev');
                $data['text_next'] = $this->language->get('text_next');
        
                $data['next_prod'] = $next_prod = $this->model_catalog_product->getProduct($product_id+1);
                $data['prev_prod'] = $prev_prod = $this->model_catalog_product->getProduct($product_id-1);
    
                if($next_prod) {
                    $data['next_product_url'] = $this->url->link('product/product', 'product_id=' .  $next_prod['product_id']);
                    $data['next_product_name']= $next_prod['name'];
                }
    
                if($prev_prod) {
                    $data['prev_product_url'] = $this->url->link('product/product', 'product_id=' .  $prev_prod['product_id']);
                    $data['prev_product_name']= $prev_prod['name'];
                }
        
    

    в файл: catalog/language/*/product/product.php

    добавить:
    Код:
      
                $_['text_prev']        = 'Предыдущий';
                $_['text_next']        = 'Следующий';
    
    

    в файле: catalog/view/theme/*/template/product/product.tpl

    перед строкой:
    Код:
    <h1><?php echo $heading_title; ?></h1>
    добавить:
    Код:
                <div class="btn-group pull-right" >
                <?php if($prev_prod) { ?>
                  <button type="button" onclick="location.href='<?php echo $prev_product_url; ?>'" data-toggle="tooltip" class="btn btn-default" title="<?php echo $prev_product_name; ?>"><?php echo $text_prev; ?></button>
                <?php } ?>
                <?php if($next_prod) { ?>
                  <button type="button" onclick="location.href='<?php echo $next_product_url; ?>'" data-toggle="tooltip" class="btn btn-default" title="<?php echo $next_product_name; ?>"><?php echo $text_next; ?></button>
                  <?php } ?>
                </div>
     
    Последнее редактирование модератором: 9 май 2015
    Kontovi, solunski.d и Zlata Jesen нравится это.
  2. rip

    rip Пользователь

    Сообщения:
    84
    Симпатии:
    19
    интересно, почему указанный выше код не является ДОПОЛНЕНИЕМ, а является ИНСТРУКЦИЕЙ?
     
  3. Ravilr

    Ravilr Специалист

    Сообщения:
    3.879
    Симпатии:
    1.065
    Дополнение / Модуль, это набор файлов, который устанавливается в опенкарт и имеет как минимум свой отдельный контроллер.
    Модификатор - файл ocmod который по инструкции xml, создает виртуальные копии файлов и меняет в нем код.
    Инструкция - это текстовая инструкция для выполнения неких действий с файлами
     
  4. rip

    rip Пользователь

    Сообщения:
    84
    Симпатии:
    19
    и, ежели в результате этих действий появляется дополнительный функционал, то впору создавать раздел "Некие действия". Был уверен, что Инструкция пишется к тому, что уже есть, например, к опенкарт.
     
    Последнее редактирование: 10 май 2015
  5. rip

    rip Пользователь

    Сообщения:
    84
    Симпатии:
    19
  6. Ravilr

    Ravilr Специалист

    Сообщения:
    3.879
    Симпатии:
    1.065
    нет. Читайте описание внимательнее.

    @rip Вы действительно не понимаете разницу или вы решили просто "по троллить" ??
    Или вы обиделись что тему перенесли из модулей в инструкции?
     
  7. rip

    rip Пользователь

    Сообщения:
    84
    Симпатии:
    19
    Инструкция - указания, правила, устанавливающие порядок и способ выполнения или осуществления чего-л. (действовать по инструкции).
    Дополнение - то, что дополняет, служит добавлением к чему-л.
    Писал выше, всё ясно
     
  8. griale

    griale Новичок

    Сообщения:
    8
    Симпатии:
    1
    вот vqmod если кому интересно
    работает на 2.0.3.1
     

    Вложения:

    solunski.d нравится это.
  9. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.569
    Симпатии:
    432
    Спасибо за инструкцию)))
     
  10. INSPIRIT

    INSPIRIT Новичок

    Сообщения:
    1
    Симпатии:
    0
    есть такие модули как самим выбрать какие товары следующии и предыдущии? как рекомендации товара под продуктом
     
  11. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    я не видел, но сделать думаю можно. Естественно не своими силами, а силами програмиста
     
  12. Marianna

    Marianna Пользователь

    Сообщения:
    55
    Симпатии:
    2
    у вас вариант не очень, предыдущий и следующий товар по айди, а не предыдущий следующий в категории
     
    tsap нравится это.
  13. griale

    griale Новичок

    Сообщения:
    8
    Симпатии:
    1
    соглашусь с Marianna, т.к. если есть проблема: если след по id, товар в другой категории то может перепрыгнуть совершенно на другой товар в другой категории. Хорошо бы как то ограничить в категории, чтобы по кругу был переход
     
  14. Romans

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

    Сообщения:
    1.438
    Симпатии:
    780
    http://shop.opencart-russia.ru/prev-next
     
  15. Argonaut

    Argonaut Новичок

    Сообщения:
    4
    Симпатии:
    0
    у меня вылезла такая ошибка.
    Notice: Undefined variable: prev_prod in www/system/storage/modification/catalog/view/theme/default/template/product/product.tpl on line 70 Notice: Undefined variable: next_prod in www/system/storage/modification/catalog/view/theme/default/template/product/product.tpl on line 73

    шаблон дефолтный
    может кто подскажет что делать?
     
  16. Yuriy.Gr

    Yuriy.Gr Новичок

    Сообщения:
    26
    Симпатии:
    16
    Какой-то из модификаторов нашалил.
     
  17. slydeev

    slydeev Новичок

    Сообщения:
    1
    Симпатии:
    0
    Удалось решить? у меня такая же проблема с включенными опциями
     
  18. v0ndelpark

    v0ndelpark Пользователь

    Сообщения:
    64
    Симпатии:
    2
    А есть подобная инструкция для Opencart 3 ?
     
  19. Ravilr

    Ravilr Специалист

    Сообщения:
    3.879
    Симпатии:
    1.065
    Нету. И без инструкции можно легко адаптировать по 3х. Достаточно вникнуть.
    А лучше конечно купить модуль https://shop.opencart-russia.ru/search/?search=предыдущий Для правильной работы.
     
  20. borodatiy1988

    borodatiy1988 Новичок

    Сообщения:
    1
    Симпатии:
    0
    Я подобную задачу решал для кастомизации постов. За основу брал этот модуль https://opencartforum.com/files/fil...anichennoe-kolichestvo-kategoriy-so-statyami/
    Вот логика отображения следующего и предидущего постов для это модуля, если применить извилины, то его можно кастомизировать под товары, что я и начинаю делать.
    Добавляем в модель с товарами catalog->model->catalog->product.php два метода, не забываем переписать запросы из бд под товары, в аргументы передаем $product_id и category_id = 0

    public function getNextPost($article_id, $blog_category_id = 0){
    $sql = "SELECT a.article_id, a.image, ad.tag, ad.name, ad.meta_title, a.date_added, a.date_modified, "
    . "ad.meta_description, ad.meta_keyword, ad.description, "
    . "ad.preview ";
    if ($blog_category_id) {
    $sql .= " FROM " . DB_PREFIX . "article_to_blog_category a2c";
    $sql .= " LEFT JOIN " . DB_PREFIX . "newsblog_article a ON (a2c.article_id = a.article_id)";
    } else {
    $sql .= " FROM " . DB_PREFIX . "newsblog_article a ";
    }
    $sql .= "LEFT JOIN " . DB_PREFIX . "newsblog_article_description AS ad "
    . "ON (a.article_id = ad.article_id) "
    . "WHERE a.article_id > '" . (int)$article_id . "' "
    . "AND a.status = 1 "
    . "AND ad.language_id = '" . (int) $this->config->get('config_language_id') . "' ";

    if($blog_category_id){
    $sql .= "AND a2c.category_id = '" . (int)$blog_category_id . "' ";
    }
    $sql .= " GROUP BY a.article_id ";
    $sql .= " ORDER BY a.date_added ";
    $sql .= " ASC ";

    $query = $this->db->query($sql);

    if(empty($query->row['article_id'])){
    return false;
    }


    return $query->row;
    }


    public function getPrevPost($article_id, $blog_category_id = 0){
    $sql = "SELECT a.article_id, a.image, ad.tag, ad.name, ad.meta_title, a.date_added, a.date_modified, "
    . "ad.meta_description, ad.meta_keyword, ad.description, "
    . "ad.preview ";
    if ($blog_category_id) {
    $sql .= " FROM " . DB_PREFIX . "article_to_blog_category a2c";
    $sql .= " LEFT JOIN " . DB_PREFIX . "newsblog_article a ON (a2c.article_id = a.article_id)";
    } else {
    $sql .= " FROM " . DB_PREFIX . "newsblog_article a ";
    }
    $sql .= "LEFT JOIN " . DB_PREFIX . "newsblog_article_description AS ad "
    . "ON (a.article_id = ad.article_id) "
    . "WHERE a.article_id < '" . (int)$article_id . "' "
    . "AND a.status = 1 "
    . "AND ad.language_id = '" . (int) $this->config->get('config_language_id') . "' ";

    if($blog_category_id){
    $sql .= "AND a2c.category_id = '" . (int)$blog_category_id . "' ";
    }
    $sql .= " GROUP BY a.article_id ";
    $sql .= " ORDER BY a.date_added ";
    $sql .= " ASC ";

    $query = $this->db->query($sql);

    if(empty($query->row['article_id'])){
    return false;
    }


    return $query->row;
    }

    Далее открываем контроллер со страницей товара, вызываем методы в этом контоллере catalog->controller->product->product.php и данные пулим в массив, не забываем, что в аргументы передаем product_id и ссылки href формируем согласно ссылкам на товары!

    //next and prev posts
    $nav_category_id = 0;

    $next_post_info = $this->model_catalog_product->getNextPost($newsblog_article_id, $nav_category_id);
    $prev_post_info = $this->model_catalog_product->getPrevPost($newsblog_article_id, $nav_category_id);

    $data['prev_post'] = array();
    if($prev_post_info){

    $data['prev_post'] = array(
    'name' => $prev_post_info['name'],
    'image' => $this->model_tool_image->resize($prev_post_info['image'], 150, 120),
    'description' => utf8_substr(strip_tags(html_entity_decode($prev_post_info['description'], ENT_QUOTES, 'UTF-8')), 0, 160) . '..',
    'href' => $this->url->link('newsblog/article', 'newsblog_path=' . $this->request->get['newsblog_path'] . '&newsblog_article_id=' . $prev_post_info['article_id'], 'SSL'),
    );
    }

    $data['next_post'] = array();
    if($next_post_info){

    $data['next_post'] = array(
    'name' => $next_post_info['name'],
    'image' => $this->model_tool_image->resize($next_post_info['image'], 150, 120),
    'description' => utf8_substr(strip_tags(html_entity_decode($next_post_info['description'], ENT_QUOTES, 'UTF-8')), 0, 160) . '..',
    'href' => $this->url->link('newsblog/article', 'newsblog_path=' . $this->request->get['newsblog_path'] . '&newsblog_article_id=' . $next_post_info['article_id'], 'SSL'),
    );
    }

    Почти закончили. Осталось открыть вьюху catalog->view->theme->default->template->product->product.tpl

    <div class=row>
    <div class="col-sm-6">
    <?php if ($prev_post) { ?>
    <a href="<?php echo $prev_post['href'] ?>" class="media">
    <div class="media-body">
    <div class="h4 media-heading"><?php echo $prev_post['name'] ?></div>
    <div class="media-body"><?php echo $prev_post['description'] ?></div>
    </div>
    <?php if ($prev_post['image']) { ?>

    <div class="media-right">
    <img class="media-object" src="<?php echo $prev_post['image'] ?>" data-holder-rendered="true">
    </div>
    <?php } ?>
    </a>
    <?php } ?>
    </div>


    <div class="col-sm-6">
    <?php if ($next_post) { ?>
    <a href="<?php echo $next_post['href'] ?>" class="media">
    <div class="media-body">
    <div class="h4 media-heading"><?php echo $next_post['name'] ?></div>
    <div class="media-body"><?php echo $next_post['description'] ?></div>
    </div>
    <?php if ($next_post['image']) { ?>

    <div class="media-right">
    <img class="media-object" src="<?php echo $next_post['image'] ?>" data-holder-rendered="true">
    </div>
    <?php } ?>
    </a>
    <?php } ?>
    </div>
    </div>

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