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

Закладки без регистрации opencart 2-3
Обновления:
Показать
02.07.2020 - Статья переписана, много изменений
06.07.2020 - Файл: /catalog/controller/account/wishlist.php, вместо:
$this->session->data['wishlist'] = '';
Нужно:
$this->session->data['wishlist'] = array();
03.08.2020 - Файл: /system/library/cart/customer.php, изменения в получении закладок, а так же добавил перенос закладок при регистрации

Изначально в opencart есть кнопки добавления закладок в модулях, на странице товара, в категориях и др. Нажимаем на кнопку, товар добавляется в закладки, это отображается в header. Закладки могут просмотреть только зарегистрированные пользователи

Что будет сделано:

  1. Просмотр и удаление закладок без регистрации
  2. Проверка наличия товара в закладках с присвоением отдельного класса

Убираем проверку авторизации + удаление из закладок

Сначала получим работающий список закладок без регистрации нужно будет внести изменения в контроллер - /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'] = array();
	foreach ($prods as $prod) if ($prod != $this->request->get['remove']) {
		$this->session->data['wishlist'][] = $prod;
	}
}

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

В зависимости от того, нужно ли отображение наличия каждого товара в закладках код будет отличаться. Если необходимо только открыть закладки всем, получение списка закладок можно оставить как есть - у зарегистрированных пользователей за это отвечает модель /catalog/model/account/wishlist.php, для гостей - сессия. Если же мы хотим показать, что товар есть в закладках, то в таком варианте придется делать много лишних запросов к БД (как минимум два - для header и для контроллера товара, или категории). Поэтому лучше будет получение закладок перенести в библиотеки и обойтись одним запросом.

Я напишу код для первого случая, затем для второго, берем один из:

Работа с закладками для гостей без проверки наличия товара в закладках

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

/catalog/controller/account/wishlist.php

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

$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));

Закладки для гостей с проверкой наличия товара в закладках

Здесь первое что сделаем, внесем изменения в класс Customer: /system/library/cart/customer.php, это позволит делать один запрос для получения закладок во всех контроллерах, а заодно посчитаем количество товаров по результату этого запроса, а не отдельным.

Находим:

private $address_id;

Добавляем:

private $w_list;

Находим:

if (isset($this->session->data['customer_id'])) {
	***********
	if ($customer_query->num_rows) {
		***********
	} else {
		$this->logout();
	}
}

Добавим получение закладок для авторизованного пользователя и через "else" для гостя (изменено 03.08.20):

if (isset($this->session->data['customer_id'])) {
	***********
	if ($customer_query->num_rows) {
		***********
		$w_list_q = $this->db->query("SELECT * FROM " . DB_PREFIX . "customer_wishlist WHERE customer_id = '" . (int)$this->customer_id . "'");
		$this->w_list = $w_list_q->rows;
	} else {
		$this->logout();
	}
} else {
	if (!empty($this->session->data['wishlist'])) {
		$this->w_list = array();
		foreach ($this->session->data['wishlist'] as $prod_id) {
			$this->w_list[] = array(
				'product_id' => $prod_id
			);
		}
	} else {
			$this->w_list = array();
	}
}

В результате получим что-то такое (кликабельно):

Функция после изменений

Далее находим:

$this->address_id = '';

Добавляем (это очистит закладки при выходе пользователя из аккаунта):

$this->w_list = array();

Находим:

public function getRewardPoints() {
	******
}

Добавляем после этой функции:

public function getWishlist() {
	return $this->w_list;
}
public function getTotalWishlist() {
	return count($this->w_list);
}

Здесь все. Теперь в любом контроллере можем использовать (кроме функций добавления и удаления закладок):

$this->customer->getWishlist();
$this->customer->getTotalWishlist();

Изменения в header (контроллер: catalog/controller/common/header.php)

Здесь находим:

// Wishlist
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'), (isset($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));
}

И меняем на следующее:

// Wishlist
$data['text_wishlist'] = sprintf($this->language->get('text_wishlist'), $this->customer->getTotalWishlist());

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

/catalog/controller/account/wishlist.php

Находим:

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

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

$results = array();
$results = $this->customer->getWishlist();

Показать наличие отдельного товара в закладках

На примере страницы товара сделаем проверку наличия товара в закладках и если он там есть - поменяем цвет кнопки.

1. Изменения в контроллере товара: /catalog/controller/product/product.php

Для начала нужно будет получить закладки, затем добавить в массив $data некий класс, если текущий товар там обнаружился. Для этого где то в контроллере, например после:

$data['description'] = html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8');

Добавим:

$w_list = array_column($this->customer->getWishlist(), 'product_id');
if (in_array($this->request->get['product_id'], $w_list)) {
	$data['wl_class'] = 'wl-add';
} else {
	$data['wl_class'] = '';
}

Это все изменения в контроллере, если нужно проверить наличие только текущего товара. Еще Можно сделать то же самое для похожих. Для этого перед:

$data['products'][] = array(

Добавляем:

if (in_array($result['product_id'], $w_list)) {
$wl_class = 'wl-add';
} else {
$wl_class = '';
}

И теперь в массиве $data['products'][] можно добавить:

'wl_class' => $wl_class,

Далее переходим к шаблону - /catalog/view/theme/default/template/product/product.tpl (product.twig для oc 3.x) и добавляем класс к нужным кнопкам, после чего останется задать этому классу некие свойства в CSS. Для конопки текщего товара это будет выглядеть так (изменения в атрибуте "class"):

<button type="button" data-toggle="tooltip" class="btn btn-default <?php echo $wl_class; ?>" title="<?php echo $button_wishlist; ?>" onclick="wishlist.add('<?php echo $product_id; ?>');"><i class="fa fa-heart"></i></button>

Аналогично для кнопки в похожих товарах:

<button type="button" data-toggle="tooltip" title="<?php echo $button_wishlist; ?>" class="<?php echo $product['wl_class']; ?>" onclick="wishlist.add('<?php echo $product['product_id']; ?>');"><i class="fa fa-heart"></i></button>

Удаление из закладок по кнопке добавления (в товаре)

Т.е. если товара нет в закладках - добавляем, если он там уже есть - удаляем.

Здесь есть несколько вариантов решения, я выбрал самый простой (как мне кажется). Для начала правим /catalog/controller/account/wishlist.php. Находим функцию add:

public function add() {
	*******
}

И заменим ее полностью:

	public function add() {
		$this->load->language('account/wishlist');

		$json = array();

		if (isset($this->request->post['product_id'])) {
			$product_id = $this->request->post['product_id'];
		} else {
			$product_id = 0;
		}
		$w_list = array_column($this->customer->getWishlist(), 'product_id');
		if (!in_array($product_id, $w_list)) {
			//ADD
			$this->load->model('catalog/product');
			$product_info = $this->model_catalog_product->getProduct($product_id);
			if ($product_info) {
				if ($this->customer->isLogged()) {
					// Edit customers cart
					$this->load->model('account/wishlist');
					$this->model_account_wishlist->addWishlist($this->request->post['product_id']);
					$json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));
					$json['total'] = sprintf($this->language->get('text_wishlist'), $this->model_account_wishlist->getTotalWishlist());
				} else {
					if (!isset($this->session->data['wishlist'])) {
						$this->session->data['wishlist'] = array();
					}
					$this->session->data['wishlist'][] = $this->request->post['product_id'];
					$this->session->data['wishlist'] = array_unique($this->session->data['wishlist']);
					$json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));
					$json['total'] = sprintf($this->language->get('text_wishlist'), (isset($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));
				}
			}
		} else {
			//REM
			if ($this->customer->isLogged()) {
				$this->load->model('account/wishlist');
				$this->model_account_wishlist->deleteWishlist($product_id);
				$json['total'] = sprintf($this->language->get('text_wishlist'), $this->model_account_wishlist->getTotalWishlist());
			} else {
				$prods = $this->session->data['wishlist'];
				$this->session->data['wishlist'] = array();
				foreach ($prods as $prod) if ($prod != $product_id) {
					$this->session->data['wishlist'][] = $prod;
				}
				$json['total'] = sprintf($this->language->get('text_wishlist'), (!empty($this->session->data['wishlist']) ? count($this->session->data['wishlist']) : 0));
			}
			$json['success'] = sprintf($this->language->get('text_rem'), $this->url->link('account/wishlist'));
		}

		$this->response->addHeader('Content-Type: application/json');
		$this->response->setOutput(json_encode($json));
	}

Теперь нужно открыть перевод (catalog/language/ru-ru/account/wishlist.php) и добавить:

$_['text_rem']  = 'Вы удалили товар из <a href="%s">Закладок</a>!';

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

Следующий шаг (да, это еще не все) - изменение кнопки после добавления/удаления товара из закладок. Для этого придется переделать саму кнопку и скрипт за нее отвечающий (или добавить новый).

У самой кнопки удаляем событие onclick и добавляем какой-нибудь класс.. например: "add-to-wl". Получим:

<button type="button" data-toggle="tooltip" class="btn btn-default add-to-wl <?php echo $wl_class; ?>" title="<?php echo $button_wishlist; ?>" data="<?php echo $product_id; ?>"><i class="fa fa-heart"></i></button>

Теперь JS. В /catalog/view/javascript/common.js, после:

$(document).ready(function() {

Добавляем функцию:

	$('.add-to-wl').click(function() {
		var product_id = $(this).attr('data');
		$.ajax({
			url: 'index.php?route=account/wishlist/add',
			type: 'post',
			data: 'product_id=' + product_id,
			dataType: 'json',
			success: function(json) {
				$('.alert-dismissible').remove();
				if (json['redirect']) {
					location = json['redirect'];
				}
				if (json['success']) {
					$(this).toggleClass('wl-add');
					$('#content').parent().before('<div class="alert alert-success alert-dismissible"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>');
				}
				$('#wishlist-total span').html(json['total']);
				$('#wishlist-total').attr('title', json['total']);
				$('html, body').animate({ scrollTop: 0 }, 'slow');
			},
			error: function(xhr, ajaxOptions, thrownError) {
				alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
			}
		});
	});

Сохранение закладок при регистрации пользователя

В опенкарт есть один странный момент, связанный с переносом закладок между гостем и авторизованным пользователем. Если у пользователя уже есть аккаунт, он авторизуется и если он как гость добавлял товары в закладки, они замечательно переносятся. А когда пользователь создает аккаунт, сразу после идет авторизация, но в закладках пусто. Почему?

В контроллере авторизации (/catalog/controller/account/login.php) есть проверка на наличие товаров в закладках и если они есть - перенос. Код там вот такой:

// Wishlist
			if (isset($this->session->data['wishlist']) && is_array($this->session->data['wishlist'])) {
				$this->load->model('account/wishlist');
				foreach ($this->session->data['wishlist'] as $key => $product_id) {
					$this->model_account_wishlist->addWishlist($product_id);
					unset($this->session->data['wishlist'][$key]);
				}
			}

Что касается регистрации, то в соответствующем контроллере про закладки видимо забыли, исправим. для этого внесем небольшое изменение в /catalog/controller/account/register.php

Здесь найдем:

$this->customer->login($this->request->post['email'], $this->request->post['password']);

И после этой строки добавим приведенный выше код из login.php. Вот и все.

Изменение уведомления при добавлении

Если делали пункт "Удаление из закладок по кнопке добавления" - это не нужно

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

Языковой файл можно найти по пути /catalog/language/ru-ru/account/wishlist.php, здесь нужно изменить 'text_login'.

Что касается правок в контроллере (все тот же wishlist.php), здесь нужно найти функцию add() и в ней проверку на регистрацию.

if ($this->customer->isLogged()) {
......
$json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));
......
} else {
......
$json['success'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));
......
}

Здесь нужно код для второго 'success' (для гостей) заменить первым (для зарегистрированных).

Сказать $пасибо

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

  1. Овечка 16 августа 2020, 13:41
    0

    У меня вопрос на счёт проверки наличия товара в закладках, если он там есть — меняем цвет кнопки.
    Как это сделать для страницы каталога? Я взял ваш код для блока «Похожие», но он в catalog.php не работает.
    PS: код для product.php работает прекрасно.

    1. Овечка 16 августа 2020, 13:55
      0

      Я уточню свой вопрос)))
      У меня товар удаляется и добавляется на странице каталога, но класс к кнопке не добавляется.

      1. Овечка 16 августа 2020, 14:07
        0

        Простите!!! Вопрос отпал. Я ступил!!! Не обновил модификатор, у меня в кэше контроллер catalog.php был

      2. yurok 14 августа 2020, 22:53
        0

        Добрый день! спасибо за подробную инструкцию, действительно полезно!
        я пошел по простому пути, все работает но при удалении товара из закладок урл кнопки «domen.ru/wishlist/wishlist» т.е. откуда-то вылазит второй wishlist в адресе и п факту вижу ту же страницу с закладками но ничего не удаляется. opencart 2.2
        спасибо за помощь

        1. Владимир 15 августа 2020, 20:021
          0

          Добрый вечер! Попробуйте просто изменить ссылку в контроллере.
          $data['products'][] = array(
          ******
          'remove' => $this->url->link('account/wishlist', 'remove='. $product_info['product_id'])
          ):

          1. yurok 16 августа 2020, 13:14
            0

            спасибо, это из-за чпу. в таблице базы щс-url-alias стояло правило. пока не придумал как сделать и просто его уволил. теперь правда страница закладок без чпу

        2. Овечка 14 августа 2020, 10:31
          0

          Спасибо вам за довольно «разжеванный» туториал! Скажите пожалуйста, как удалять товар из wishlist через ajax? Например для добавления товара в wishlist есть функция add() в controller/account/wishlist.php. А для удаления такой нет. Что нужно в controller/account/wishlist.php дописать, что бы можно было удалять товар без перезагрузки страницы??? В common.js я разберусь что писать, а вот в account/wishlist.php к сожалению нет.
          Помогите пожалуйста!!!

          1. Владимир 15 августа 2020, 20:061
            0

            Добрый вечер! Добрался до компа. На самом деле все очень просто. Что бы удалялось из закладок функция в common.js:

            $('.rem-wl').click(function() {
            var row = $(this).parents('tr');
            $.ajax({
            url: 'index.php?route=account/wishlist/add',
            type: 'post',
            data: 'product_id=' + product_id,
            dataType: 'json',
            success: function(json) {
            $(row).remove();
            }
            });
            });
            Ну и добавить кнопке (удалить) класс «rem-wl» и сделать ее не ссылкой, а кнопкой (button)

            1. Овечка 16 августа 2020, 13:42
              0

              Спасибо вам большое!

          2. Andrew 02 августа 2020, 21:42
            0

            Здравствуйте, подскажите пожалуйста, как сделать чтобы если гость добавил товар в закладки, то после авторизации он у него сохранялся?

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

            так:

            $results = array();
            $results = $this->customer->getWishlist();
            То если зайти под гостем будет писать ошибку
            $result['product_id']
            , т.к. в
            $this->session->data['wishlist']
            нет ключа product_id, а просто например 43(id товара) из-за этого тут не сможет найти товар:

            $product_info = $this->model_catalog_product->getProduct($result['product_id']);
            , но если сделать вот так:
            if ($this->customer->isLogged()) {
            			$results = $this->model_account_wishlist->getWishlist();
            		} else {
            			$prods = $this->customer->getWishlist();
            			foreach ($prods as $prod) {
            				$results[]['product_id'] = $prod;
            			}
            		}
            То бишь добавить в массив для гостя product_id => id товара, то работает без ошибки, а для авторизованного
            $this->model_account_wishlist->getWishlist
            где есть product_id в массиве. Но тогда отпадает нужда в
            $this->customer->getWishlist(
            )… Подскажите пожалуйста, как правильнее чтобы работало без ошибок и после авторизации не слетали закладки? заранее спасибо!

            1. Владимир 03 августа 2020, 00:06
              0

              Здравствуйте! Я здесь кроме этого, еще и целый запрос к БД пропустил)

              Внес исправления. Сохранение при регистрации также добавил (при авторизации они и так добавляются)

              1. Andrew 03 августа 2020, 08:38
                0

                супер, спасибо большое!)

                1. Andrew 03 августа 2020, 10:07
                  0

                  Нашел еще небольшую проблему в удалении товара из закладок при повторном нажатии, у вас поиск товара идет по функции in_array, но она ищет по ключу, а у нас в $w_list многомерный массив, и нужно искать по значению, решил так:
                  в модель account/wishlist добавил новую функцию

                  public function in_multiarray($elem, $array)
                         {
                              if( is_array( $array ) || is_object( $array ) )
                              {
                                  if( is_object( $array ) )
                                  {
                                      $temp_array = get_object_vars( $array );
                                      if( in_array( $elem, $temp_array ) )
                                          return TRUE;
                                  }
                                  if( is_array( $array ) && in_array( $elem, $array ) )
                                      return TRUE;
                                  foreach( $array as $array_element )
                                  {
                                      if( ( is_array( $array_element ) || is_object( $array_element ) ) && $this->in_multiarray( $elem, $array_element ) )
                                      {
                                          return TRUE;
                                          exit;
                                      }
                                  }
                              }
                  
                              return FALSE;
                         }
                  и в controller/wishlist заменил
                  if (!in_array($product_id, $w_list)) {
                  на
                  if (!$this->model_account_wishlist->in_multiarray($product_id, $w_list)) {
                  Если у вас есть более гуманное решение, поделитесь пожалуйста)

                  1. Владимир 03 августа 2020, 10:49
                    0

                    Спасибо, исправил. Сделал через array_column

                    1. Владимир 03 августа 2020, 10:55
                      0

                      И точно также в «Показать наличие отдельного товара в закладках»

                  2. Ирина 15 июля 2020, 03:10
                    0

                    Добрый день
                    если сделать таким образом закладки, они будут для каждого покупателя свои или для всех одни?

                    1. Владимир 15 июля 2020, 08:111
                      0

                      Добрый день! Должны быть разные, т.к. идет привязка к сессии пользователя

                    2. Na Kodish 01 июля 2020, 10:41
                      0

                      Здравствуйте, все сделала как у вас, спасибо большое) Скажите, а можно по второму нажатию на закрашенное сердечко удалять товар из закладок?

                      1. Владимир 02 июля 2020, 03:52
                        0

                        Здравствуйте!
                        Статью переписал полностью… добавил удаление

                      2. Владимир 25 ноября 2019, 20:01
                        0

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

                        1. Артур 13 августа 2019, 12:10
                          0

                          Здравствуйте, после удаления из закладок такие ошибки
                          Warning: count(): Parameter must be an array or an object that implements Countable in /home/site.ua/www/system/storage/modification/catalog/controller/common/footer.php on line 30Warning: count(): Parameter must be an array or an object that implements Countable in /home/site.ua/www/catalog/controller/common/menu.php on line 47

                          1. Владимир 13 августа 2019, 15:031
                            0

                            Смотрите файлы, что находится в указанных строках. Закладки здесь непричем (footer.php, menu.php — сюда разве правки вносили?).

                            1. Артур 13 августа 2019, 18:28
                              0

                              с этими решил… просто выводил избранные в эти места и там нужно было тоже заменить получение товаров из закладок… но при удалении из избранного все равно ошибка…
                              Fatal error: Uncaught Error: [] operator not supported for strings in /home/imperiazolota.ua/www/catalog/controller/account/wishlist.php:29 Stack trace: #0 /home/imperiazolota.ua/www/system/storage/modification/system/engine/action.php(79): ControllerAccountWishList->index() #1 /home/imperiazolota.ua/www/catalog/controller/startup/router.php(25): Action->execute(Object(Registry)) #2 /home/imperiazolota.ua/www/system/storage/modification/system/engine/action.php(79): ControllerStartupRouter->index() #3 /home/imperiazolota.ua/www/system/engine/router.php(67): Action->execute(Object(Registry)) #4 /home/imperiazolota.ua/www/system/engine/router.php(56): Router->execute(Object(Action)) #5 /home/imperiazolota.ua/www/system/framework.php(168): Router->dispatch(Object(Action), Object(Action)) #6 /home/imperiazolota.ua/www/system/startup.php(104): require_once('/home/imperiazo...') #7 /home/imperiazolota.ua/www/index.php(19): start('catalog') #8 {main} thrown in /home/imperiazolota.ua/www/catalog/controller/account/wishlist.php on line 29

                              1. Артур 13 августа 2019, 18:56
                                0

                                вот проверил, когда один товар в избранном то нормально, а когда больше 1-го тогда ошибка, и после успешного удаления одного товара из избранного, потом при добавлении ошибка json

                                1. LoGwi-N 12 октября 2019, 13:15
                                  0

                                  в wishlist.php нужно поменять

                                  $this->session->data['wishlist'] = '';
                                  на
                                  $this->session->data['wishlist'] = array();

                            2. Elena El 08 августа 2019, 15:22
                              0

                              Все сделала, как указано выше, но все равно кидает на страницу авторизации

                              1. Elena El 06 августа 2019, 02:10
                                0

                                Здравствуйте, помогите пожалуйста с версией opencart 3.0.

                                1. Владимир 08 августа 2019, 14:571
                                  0

                                  Здравствуйте! А что не получается?

                                  1. Elena El 08 августа 2019, 15:22
                                    0

                                    Все сделала, как указано выше, но все равно кидает на страницу авторизации

                                    1. Владимир 08 августа 2019, 15:54
                                      0

                                      А кеш модификаторов почищен?
                                      строки вначале /catalog/controller/account/wishlist.php закомментированы? (после этого уже не должно быть никакого перенаправления)

                                    2. Андрей 20 февраля 2019, 21:00
                                      0

                                      Спасибо заработало, кроме сообщения о добавлении товара, пробовал 2 варианта, менял в языковом файле (просто копировал с text_success в text_login) так и заменял в контроллере text_login на text_success

                                      В итоге получалось: Вы добавили ИМЯ_САЙТА/index.php?route=account/login в Закладки!

                                      Что не так? Версия Opencart 2.3

                                      1. Владимир 20 февраля 2019, 23:481
                                        0

                                        Там же нужно менять success для гостей на success для зарегистрированных. Попробуйте еще раз, или пришлите файлы на почту vl@onenv.ru

                                        1. Андрей 21 февраля 2019, 07:56
                                          0

                                          Я заменил:

                                          $json['success'] = sprintf($this->language->get('text_login'), $this->url->link('account/login', '', true), $this->url->link('account/register', '', true), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));
                                          на
                                          $json['success'] = sprintf($this->language->get('text_success'), $this->url->link('product/product', 'product_id=' . (int)$this->request->post['product_id']), $product_info['name'], $this->url->link('account/wishlist'));
                                          теперь нормально отображается, УРАААА!!!
                                          Спасибо, большое!

                                          Видимо я неправильно понял, мне кажется понятнее записать так: заменить этот код на этот, а то я понял что нужно просто «text_login» на «text_success» заменить :-)

                                      2. Yaroslav 09 декабря 2018, 22:33
                                        0

                                        Спасибо, на 2.3.0 работает.
                                        А как сделать чтобы при добавлении в закладки возле иконки высвечивалась толькоцыфра к-ва товара.
                                        в файле /checkout/cart.php я удалил записть. Но корректно показывает к-во, только после обновления

                                        1. Владимир 10 декабря 2018, 03:06
                                          0

                                          Все визуальные изменения при добавлении в common.js
                                          найдите

                                          $('#wishlist-total').attr('title', json['total']);
                                          Вообще при добавлении как раз только цифра и должна меняться… нужно смотреть что не так. Можете еще в комментариях здесь же посмотреть, от 14 июля и ниже, там как раз по визуальной части

                                        2. Сергей Соловьев 09 декабря 2018, 18:41
                                          0

                                          Владимир, спасибо за интересное решение.
                                          Подскажите, пожалуйста, не думали как решить перенос гостевых закладок в аккаунт и сохранение их в личном кабинете после регистрации\авторизации покупателя?

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

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

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

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

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

                                              Спасибо! Отлично работает, устал искать такой модуль, а тут бесплатно) Кстати, что-бы полностью работало на 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
                                                  +1

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

                                                  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. Vlad44 23 августа 2019, 14:42
                                                                        0

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

                                                                        1. Владимир 23 августа 2019, 18:47
                                                                          0

                                                                          А замену 'success' делали? самый последний пункт

                                                                          1. mx928 07 февраля 2020, 19:01
                                                                            0

                                                                            Тоже самое, для гостей все работает для зарегистрированных нет

                                                                  2. Антон 13 января 2020, 19:58
                                                                    0

                                                                    Скорее всего… Это в самом товаре, или в связанных? в контроллере для самого товара класс через data[] нужно назначить, может где то здесь проблема…
                                                                    Напишите, пожалуйста, как это сделать «в контроллере для самого товара класс через data[] нужно назначить». В контроллере категорий и в модулях всё работает, а в контроллере продукта не остаётся класс wl-add после обновления страницы. Я так понимаю нужно что-то исправить в

                                                                    if (in_array($result['product_id'], $w_list)) {
                                                                    $wl_class = 'wl-add';
                                                                    } else {
                                                                    $wl_class = '';
                                                                    }

                                                                    и в шаблоне продукта что выводить вместо

                                                                    class="<?php echo $product['wl_class']; ?>

                                                                    ?

                                                          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

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