Закладки без регистрации opencart 2-3

Закладки без регистрации opencart 2-3

Что бы получить работающий список закладок без регистрации нужно будет внести изменения в контроллер - /catalog/controller/account/wishlist.php

В результате получим отображение списка закладок и возможность удаления товаров и списка. Сам список будет взят из сессии (по-умолчанию только из базы с привязкой к пользователю)

Начнем. Откроем /catalog/controller/account/wishlist.php и внесем правки (все в порядке изменений в файле):

Убираем проверку авторизации

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

/*if (!$this->customer->isLogged()) {
$this->session->data['redirect'] = $this->url->link('account/wishlist', '', true);
$this->response->redirect($this->url->link('account/login', '', true));
}*/

Возможность удаления из закладок

Чуть дальше находим:

// Remove Wishlist
$this->model_account_wishlist->deleteWishlist($this->request->get['remove']);

Здесь добавим проверку - авторизован ли посетитель, если нет возьмем из сессии список закладок, кроме товара из запроса на удаление, почистим закладки и запишем обратно получившийся результат:

if ($this->customer->isLogged()) {
	$this->model_account_wishlist->deleteWishlist($this->request->get['remove']);
} else {
	$prods = $this->session->data['wishlist'];
	$this->session->data['wishlist'] = '';
	foreach ($prods as $prod) if ($prod != $this->request->get['remove']) {
		$this->session->data['wishlist'][] = $prod;
	}
}

Получение товаров из закладок

Здесь все по аналогии с удалением, работаем с закладками в сессии. Находим:

$results = $this->model_account_wishlist->getWishlist();

Меняем на следующий код:

$results = array();
if ($this->customer->isLogged()) {
	$results = $this->model_account_wishlist->getWishlist();
} else if (!empty($this->session->data['wishlist'])) {
	$prods = $this->session->data['wishlist'];
	foreach ($prods as $prod) {
		$results[]['product_id'] = $prod;
	}
}

Далее необходимо сделать еще одну правку, в /catalog/controller/common/header.php

Находим:

$data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), (isset($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));

Меняем на:

$data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), (!empty($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));

Сказать $пасибо (это совсем не обязательно)

Добавить комментарий

Комментарии ()

  1. великий_и_ужасный 05 ноября 2018, 18:37
    0 #

    До чего же подача кода отвратительна (
    ru.wikipedia.org/wiki/Стандарт_оформления_кода

    1. Владимир 05 ноября 2018, 20:11
      0 #

      здесь куски кода в несколько строчек… что заменить, куда добавить… вполне понятно

    2. Альфред 18 июля 2018, 22:301
      0 #

      Спасибо! Отлично работает, устал искать такой модуль, а тут бесплатно) Кстати, что-бы полностью работало на opencart 3 самый последний пункт тоже нужно добавить, а то у вас написано, что это надо только для opencart 2. Иначе счетчик не будет обновляться.

      1. Владимир 19 июля 2018, 00:38
        0 #

        Спасибо, исправил

      2. Александр 16 июля 2018, 16:221
        0 #

        Владимир, не могли бы вы мне оставить свою почту? Хочется раз и навсегда покончить с закладками? P.S. Вопросик это я, я просто зарегистрировался :)

        1. Владимир 16 июля 2018, 20:38
          0 #

          Моя почта vl@onenv.ru. Правок, кажется, не много осталось совсем

        2. Вопросик 15 июля 2018, 01:44
          0 #

          Спасибо еще раз, Владимир! Вы очень помогли!!! Буду частенько заходить к Вам почитывать какие нибудь статьи!

          1. Вопросик 15 июля 2018, 01:471
            0 #

            Блин теперь другая проблема ): Покрашенное сердце, не сохраняет свой цвет. Грешу на js. как сохранить этот цвет после перехода на другую страницу, без понятия ):

            1. Владимир 15 июля 2018, 02:311
              +1 #

              проверять есть ли в закладках товар через php нужно, при выводе. т.е. в контроллере категории/модуля нужно получить id товаров из закладок и проверить есть ли там нужный…
              после

              $results = $this->model_catalog_product->getProducts($filter_data);
              добавим
              if ($this->customer->isLogged()) {
              $this->load->model('account/wishlist');
              $w_list = $this->model_account_wishlist->getWishlist();
              } else {
              $w_list = $this->session->data['wishlist'];
              }
              далее перед $data['products'][] = array(
              if (in_array($result['product_id'], $w_list)) {
              $wl_class = 'wl-add';
              } else {
              $wl_class = '';
              }
              ну и в самом массиве products
              'wl_class'  => $wl_class,
              и вот это уже в шаблоне использовать
              <?php echo $product['wl_class']; ?>
              для гостей проверил, а вот для зарегистрированных не проверял

              1. Вопросик 15 июля 2018, 12:30
                0 #

                Отлично работает! Только почему то если на страницу товара добавлять, Undefined variable и указывает в ошибке путь system/storage и так далее. Есть вероятность что я криво сделал, но вроде все должно быть хорошо

                1. Владимир 15 июля 2018, 13:53
                  +1 #

                  Скорее всего… Это в самом товаре, или в связанных? в контроллере для самого товара класс через data[] нужно назнчить, может где то здесь проблема…

                  1. Вопросик 16 июля 2018, 01:411
                    0 #

                    Возможно. Буду смотреть. теперь возникла новая проблема. Если все сделать как вы сказали для модулей special.tpl и latest.tpl почему то возникает такая проблема:

                    Это при условии, что не один товар не добавлен в избранное.
                    Если добавить в закладки и обновить страницу, тогда все окей, ошибок нет.

                    Warning: in_array() expects parameter 2 to be array, string given in /home/jollyvap/public_html/system/storage/modification/catalog/controller/extension/module/special.php on line 90

                    1. Владимир 16 июля 2018, 01:51
                      +1 #

                      учитывая что файл в кэше, там может быть конфликт с неким модулем… взглянуть бы на сам файл

                      1. Вопросик 16 июля 2018, 01:53
                        0 #

                        какой именно? special.php?

                        1. Вопросик 16 июля 2018, 01:591
                          0 #

                          yadi.sk/d/Q90WZgE53ZCp3L

                          Вот то что в систем это модификатор
                          То что в controller это оригинал

                          Только что без обновления всех модификаторов, удлалил эти 2 файла вот такая ерунда:

                          Warning: in_array() expects parameter 2 to be array, string given in /home/jollyvap/public_html/catalog/controller/extension/module/special.php on line 67

                          1. Владимир 16 июля 2018, 02:09
                            +1 #

                            Это вылазит если нет товаров в закладках. в категориях так же. Нужно немного поменять:

                            if ($this->customer->isLogged()) {
                            $this->load->model('account/wishlist');
                            $w_list = $this->model_account_wishlist->getWishlist();
                            } else if ($this->session->data['wishlist']) {
                            $w_list = $this->session->data['wishlist'];
                            } else {
                            $w_list = array();
                            }

                            1. Вопросик 16 июля 2018, 02:30
                              0 #

                              Да действительно работает! Владимир, что бы я без Вас делал? :)

                              Кстати на страницу товара таким же образом добавлять?
                              Вчера добавлял, на кнопке в классах, было написано «Undefined variable». Или для товара своя система добавления?

                              1. Владимир 16 июля 2018, 03:19
                                +1 #

                                там немного по другому. если есть ошибки, пришлите контроллер товара, посмотрю

                                1. Вопросик 16 июля 2018, 14:051
                                  0 #

                                  Владимир, вчера делал все было окей, никакой ошибки, сейчас захожу:

                                  Notice: Undefined index: wishlist in /home/jollyvap/public_html/system/storage/modification/catalog/controller/extension/module/special.php on line 61
                                  ругается на:
                                  } else if ($this->session->data['wishlist']) {
                                  что я мог не так написать?

                                  Вся фишка в чем: Если зайди на страницу и будет такая ошибка, то нужно добавить товар в избранное, затем удалить его оттуда и если опять лазать по сайту, этой ошибки больше нет.

                                  1. Владимир 16 июля 2018, 20:37
                                    0 #

                                    } else if (!empty($this->session->data['wishlist'])) {
                                    Это я забыл про вариант когда закладки еще совсем не добавлялись

                                    1. Александр 16 июля 2018, 20:51
                                      0 #

                                      Да получилось! Для страницы товара сделал тоже самое, что и для категории, модулей, пока ошибок не наблюдаю. Спасибо Владимир!!!

            2. Вопросик 14 июля 2018, 12:22
              0 #

              А можно еще такой вопрос, можно ли как то отметить кнопку закладок, после добавления?
              К примеру, понравился товар, нажал сердечко, покрасился в другой цвет?
              Пытаюсь сделать в common.js, но я ничего там не понимаю ): или хотя бы как класс нужный задать ТОЛЬКО понравившемуся товару а не всем?

              1. Владимир 14 июля 2018, 14:291
                0 #

                Добавить класс при добавлении закладки просто. В common.js найдите

                $('#wishlist-total').attr('title', json['total']);
                И добавьте здесь класс, как то так:
                $('#wishlist-total').attr('title', json['total']).addClass('wl-added');
                Проверок здесь никаких не нужно, все равно только в плюс. Теперь нужно сохранить класс при обновлении страниц, удалить если товаров в закладках не осталось… здесь сложнее. Нужен контроллер «controller/common/header.php», вот этот код:
                if ($this->customer->isLogged()) {
                $this->load->model('account/wishlist');
                $data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), $this->model_account_wishlist->getTotalWishlist());
                } else {
                $data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), (!empty($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));
                }
                Добавим в $data класс в зависимости количества товаров. В итоге будет так:
                if ($this->customer->isLogged()) {
                $this->load->model('account/wishlist');
                $count_wl = $this->model_account_wishlist->getTotalWishlist();
                } else if (!empty($this->session->data['wishlist'])) {
                $count_wl = count($this->session->data['wishlist']);
                } else {
                $count_wl = 0;
                }
                $data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), $count_wl);
                if ($count_wl > 0) {
                $data['class_wishlist'] = 'wl-added';
                } else {
                $data['class_wishlist'] = '';
                }
                Теперь осталось в header.tpl добавить назначенный класс. Для ссылки с id=«wishlist-total» добавить:
                class="<?php echo $class_wishlist; ?>"

                1. Вопросик 15 июля 2018, 00:511
                  0 #

                  А если нужно добавить в категории, и в модули latest.tpl и special.tpl? Я так понимаю нужно в контроллере вставить тоже самое что и в голову?
                  Ну то есть, в данный момент, работает так: Добавляю товар в закладки, красится сердечко которое подсчитывает общее количество добавленных в избранное.
                  А можно ли как то сделать так что бы допустим я на любой странице где есть товар и где выводится кнопка добавления в избранное, при нажатии этой кнопки, сердце только для этого товара добавлялся?

                  ну к примеру сейчас так:

                  это в голове кнопка сердца

                  а у товара который добавил нету:


                  Просматриваю common.js
                  увидел вот такой код, на сколько я понял, отвечает за то что, если удачно добавили, тогда выводит это:

                  if (json['success']) {
                  $('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>');
                  }


                  Вот и думал, что может можно как то поменять? К примеру получить ид товара и для этого товара грубо говоря добавлять класс?

                  Сейчас чутка посидел подумал додумался до такого:
                  в catalog.tpl где кнопка добавления в избранное добавил уникальный ид
                  id="<?php echo $product['product_id']; ?>"
                  теперь в common.js
                  вместо:
                  $('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>');
                  написал
                  $('#' + 'product_id').addClass('wl-add');
                  пробывал и так
                  $('#' + product_id).addClass('wl-add');
                  но все равно не добавляет ):

                  1. Вопросик 15 июля 2018, 01:35
                    0 #

                    Нашел в чем косяк, теперь добавляет для добавленного товара нужный мне класс для кнопки с лайком :)))

                    $('#'+product_id+'').addClass('wl-add');

                    1. Владимир 15 июля 2018, 01:41
                      0 #

                      id="<?php echo $product['product_id']; ?>"
                      лучше вот так:
                      id="p-<?php echo $product['product_id']; ?>"
                      уже не помню как там с идентификаторами, но с классами есть проблемы если они только из цифр

                      тогда можно делать так:
                      $('#p-' + product_id).addClass('wl-add');
                      переменная не в кавычках

                      1. Вопросик 15 июля 2018, 01:48
                        0 #

                        Пробовал 2 вариантом, не срабатывал ):

                2. Вопросик 11 июля 2018, 22:151
                  0 #

                  Отличный вариант! Только если, нет товаров в закладках появляется ошибка «Invalid argument supplied for foreach()»
                  Решил проблему вот так:

                  $data['products'] = array();
                  
                  		$results = array();
                  			if ($this->customer->isLogged()) {
                  			$results = $this->model_account_wishlist->getWishlist();
                  		} else if (isset($this->session->data['wishlist'])) {
                  			$prods = $this->session->data['wishlist'];
                  			if(isset($prods) && is_array($prods)) foreach ($prods as $prod) {
                  				$results[]['product_id'] = $prod;
                  			}
                  		}
                  
                  //добавил if(isset($prods) && is_array($prods)) перед foreach 
                  Вопрос теперь другой. Если добавить товар в закладки, подсчитывается сумма всех товаров в закладках, НО если удалить все товары, то 0 почему то не ставится и остается 1, как будто еще товар остался, при этом страница закладок пустая. Как решить проблему?

                  1. Владимир 12 июля 2018, 00:10
                    0 #

                    Проверял на opencart 3, там все корректно и так, под опенкарт 2 нужно немного подправить…
                    1. controller/account/wishlist.php
                    вместо

                    } else if (isset($this->session->data['wishlist'])) {
                    нужно
                    } else if (!empty($this->session->data['wishlist'])) {
                    2. controller/common/header.php
                    вместо
                    $data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), (isset($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));
                    нужно
                    $data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), (!empty($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));
                    (проверяем на пустоту, а не существование)

                    1. Вопросик 12 июля 2018, 12:38
                      0 #

                      ВОУ! Работает!!! Спасибо Вам, Владимир!!!