Закладки без регистрации 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. Альфред 18 июля 2018, 22:30(Комментарий был изменён)
    0 #

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

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

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

    2. Александр 16 июля 2018, 16:22(Комментарий был изменён)
      0 #

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

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

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

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

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

        1. Вопросик 15 июля 2018, 01:47(Комментарий был изменён)
          0 #

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

          1. Владимир 15 июля 2018, 02:31(Комментарий был изменён)
            +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:41(Комментарий был изменён)
                  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:59(Комментарий был изменён)
                        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:05(Комментарий был изменён)
                                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:29(Комментарий был изменён)
              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:51(Комментарий был изменён)
                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:15(Комментарий был изменён)
                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 #

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