
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. Закладки могут просмотреть только зарегистрированные пользователи
Что будет сделано:
- Просмотр и удаление закладок без регистрации
- Проверка наличия товара в закладках с присвоением отдельного класса
Убираем проверку авторизации + удаление из закладок
Сначала получим работающий список закладок без регистрации нужно будет внести изменения в контроллер - /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' (для гостей) заменить первым (для зарегистрированных).
Для гостей не работает, для зарегистрированных работает. Opencart Version 3.0.3.6 (rs.1). Почему то в сессии не хранятся добавленные товары, там просто пусто
А нет, всё нормально. Ребята, если у вас сторонняя тема, то посмотрите в кеше модификаторов storage/modification/catalog/controller/account/wishlist.php. Сторонняя тема или другие модули могут немного изменить ваш вывод.
Установил чистый ocStore 2.3.0.2 и сделал как описано выше. В итоге — всё так же просит зарегистрироваться. Печально, пойду искать другой вариант((
Самое начало, /catalog/controller/account/wishlist.php, проверка на залогинен ли пользователь. Если закомментировать — уже на этом этапе ничего просить не будет.
ps. не забываем чистить кэш модификаторов.
Прошу прощения, ступил. Делаю правки на одном сервере а кеш зачищаю на другом)))
Врё работает! Автору огромное спасибо.
Просто отличная статья! Есть ли что-то похожее по сравнению товаров, что бы сделать кнопку добавить/удалить из сравнения, и проверку на то есть ли товар в сравнении
У меня вопрос на счёт проверки наличия товара в закладках, если он там есть — меняем цвет кнопки.
Как это сделать для страницы каталога? Я взял ваш код для блока «Похожие», но он в catalog.php не работает.
PS: код для product.php работает прекрасно.
Я уточню свой вопрос)))
У меня товар удаляется и добавляется на странице каталога, но класс к кнопке не добавляется.
Простите!!! Вопрос отпал. Я ступил!!! Не обновил модификатор, у меня в кэше контроллер catalog.php был
Добрый день! спасибо за подробную инструкцию, действительно полезно!
я пошел по простому пути, все работает но при удалении товара из закладок урл кнопки «domen.ru/wishlist/wishlist» т.е. откуда-то вылазит второй wishlist в адресе и п факту вижу ту же страницу с закладками но ничего не удаляется. opencart 2.2
спасибо за помощь
Добрый вечер! Попробуйте просто изменить ссылку в контроллере.
$data['products'][] = array(
******
'remove' => $this->url->link('account/wishlist', 'remove='. $product_info['product_id'])
):
спасибо, это из-за чпу. в таблице базы щс-url-alias стояло правило. пока не придумал как сделать и просто его уволил. теперь правда страница закладок без чпу
Спасибо вам за довольно «разжеванный» туториал! Скажите пожалуйста, как удалять товар из wishlist через ajax? Например для добавления товара в wishlist есть функция add() в controller/account/wishlist.php. А для удаления такой нет. Что нужно в controller/account/wishlist.php дописать, что бы можно было удалять товар без перезагрузки страницы??? В common.js я разберусь что писать, а вот в account/wishlist.php к сожалению нет.
Помогите пожалуйста!!!
Добрый вечер! Добрался до компа. На самом деле все очень просто. Что бы удалялось из закладок функция в common.js:
Ну и добавить кнопке (удалить) класс «rem-wl» и сделать ее не ссылкой, а кнопкой (button)Спасибо вам большое!
Здравствуйте, подскажите пожалуйста, как сделать чтобы если гость добавил товар в закладки, то после авторизации он у него сохранялся?
То если зайти под гостем будет писать ошибку , т.к. в нет ключа product_id, а просто например 43(id товара) из-за этого тут не сможет найти товар:И нашел проблему, если добавлять правки по этому варианту:
Закладки для гостей с проверкой наличия товара в закладках
так:
, но если сделать вот так:
То бишь добавить в массив для гостя product_id => id товара, то работает без ошибки, а для авторизованного где есть product_id в массиве. Но тогда отпадает нужда в )… Подскажите пожалуйста, как правильнее чтобы работало без ошибок и после авторизации не слетали закладки? заранее спасибо!
Здравствуйте! Я здесь кроме этого, еще и целый запрос к БД пропустил)
Внес исправления. Сохранение при регистрации также добавил (при авторизации они и так добавляются)
супер, спасибо большое!)
Нашел еще небольшую проблему в удалении товара из закладок при повторном нажатии, у вас поиск товара идет по функции in_array, но она ищет по ключу, а у нас в $w_list многомерный массив, и нужно искать по значению, решил так:
и в controller/wishlist заменилв модель account/wishlist добавил новую функцию
на
Если у вас есть более гуманное решение, поделитесь пожалуйста)
Спасибо, исправил. Сделал через array_column
И точно также в «Показать наличие отдельного товара в закладках»
Добрый день
если сделать таким образом закладки, они будут для каждого покупателя свои или для всех одни?
Добрый день! Должны быть разные, т.к. идет привязка к сессии пользователя
Здравствуйте, все сделала как у вас, спасибо большое) Скажите, а можно по второму нажатию на закрашенное сердечко удалять товар из закладок?
Здравствуйте!
Статью переписал полностью… добавил удаление
Добрый.
Подскажите, а почему эти закладки получаются не индивидуальны для конкретно взятого пользователя, а общие для всех?
Здравствуйте, после удаления из закладок такие ошибки
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
Смотрите файлы, что находится в указанных строках. Закладки здесь непричем (footer.php, menu.php — сюда разве правки вносили?).
с этими решил… просто выводил избранные в эти места и там нужно было тоже заменить получение товаров из закладок… но при удалении из избранного все равно ошибка…
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-го тогда ошибка, и после успешного удаления одного товара из избранного, потом при добавлении ошибка json
в wishlist.php нужно поменять
наВсе сделала, как указано выше, но все равно кидает на страницу авторизации
Здравствуйте, помогите пожалуйста с версией opencart 3.0.
Здравствуйте! А что не получается?
Все сделала, как указано выше, но все равно кидает на страницу авторизации
А кеш модификаторов почищен?
строки вначале /catalog/controller/account/wishlist.php закомментированы? (после этого уже не должно быть никакого перенаправления)
Спасибо заработало, кроме сообщения о добавлении товара, пробовал 2 варианта, менял в языковом файле (просто копировал с text_success в text_login) так и заменял в контроллере text_login на text_success
В итоге получалось: Вы добавили ИМЯ_САЙТА/index.php?route=account/login в Закладки!
Что не так? Версия Opencart 2.3
Там же нужно менять success для гостей на success для зарегистрированных. Попробуйте еще раз, или пришлите файлы на почту vl@onenv.ru
Я заменил:
натеперь нормально отображается, УРАААА!!!
Спасибо, большое!
Видимо я неправильно понял, мне кажется понятнее записать так: заменить этот код на этот, а то я понял что нужно просто «text_login» на «text_success» заменить :-)
Спасибо, на 2.3.0 работает.
А как сделать чтобы при добавлении в закладки возле иконки высвечивалась толькоцыфра к-ва товара.
в файле /checkout/cart.php я удалил записть. Но корректно показывает к-во, только после обновления
Все визуальные изменения при добавлении в common.js
Вообще при добавлении как раз только цифра и должна меняться… нужно смотреть что не так. Можете еще в комментариях здесь же посмотреть, от 14 июля и ниже, там как раз по визуальной частинайдите
Владимир, спасибо за интересное решение.
Подскажите, пожалуйста, не думали как решить перенос гостевых закладок в аккаунт и сохранение их в личном кабинете после регистрации\авторизации покупателя?
До чего же подача кода отвратительна (
ru.wikipedia.org/wiki/Стандарт_оформления_кода
здесь куски кода в несколько строчек… что заменить, куда добавить… вполне понятно
Спасибо! Отлично работает, устал искать такой модуль, а тут бесплатно) Кстати, что-бы полностью работало на opencart 3 самый последний пункт тоже нужно добавить, а то у вас написано, что это надо только для opencart 2. Иначе счетчик не будет обновляться.
Спасибо, исправил
Владимир, не могли бы вы мне оставить свою почту? Хочется раз и навсегда покончить с закладками? P.S. Вопросик это я, я просто зарегистрировался :)
Моя почта vl@onenv.ru. Правок, кажется, не много осталось совсем
Спасибо еще раз, Владимир! Вы очень помогли!!! Буду частенько заходить к Вам почитывать какие нибудь статьи!
Блин теперь другая проблема ): Покрашенное сердце, не сохраняет свой цвет. Грешу на js. как сохранить этот цвет после перехода на другую страницу, без понятия ):
проверять есть ли в закладках товар через php нужно, при выводе. т.е. в контроллере категории/модуля нужно получить id товаров из закладок и проверить есть ли там нужный…
добавимпосле
далее перед $data['products'][] = array(
ну и в самом массиве products
и вот это уже в шаблоне использовать
для гостей проверил, а вот для зарегистрированных не проверял
Отлично работает! Только почему то если на страницу товара добавлять, Undefined variable и указывает в ошибке путь system/storage и так далее. Есть вероятность что я криво сделал, но вроде все должно быть хорошо
Скорее всего… Это в самом товаре, или в связанных? в контроллере для самого товара класс через data[] нужно назнчить, может где то здесь проблема…
Возможно. Буду смотреть. теперь возникла новая проблема. Если все сделать как вы сказали для модулей special.tpl и latest.tpl почему то возникает такая проблема:

Это при условии, что не один товар не добавлен в избранное.
Если добавить в закладки и обновить страницу, тогда все окей, ошибок нет.
учитывая что файл в кэше, там может быть конфликт с неким модулем… взглянуть бы на сам файл
какой именно? special.php?
yadi.sk/d/Q90WZgE53ZCp3L
Вот то что в систем это модификатор
То что в controller это оригинал
Только что без обновления всех модификаторов, удлалил эти 2 файла вот такая ерунда:
Это вылазит если нет товаров в закладках. в категориях так же. Нужно немного поменять:
Да действительно работает! Владимир, что бы я без Вас делал? :)
Кстати на страницу товара таким же образом добавлять?
Вчера добавлял, на кнопке в классах, было написано «Undefined variable». Или для товара своя система добавления?
там немного по другому. если есть ошибки, пришлите контроллер товара, посмотрю
Владимир, вчера делал все было окей, никакой ошибки, сейчас захожу:
ругается на:что я мог не так написать?
Вся фишка в чем: Если зайди на страницу и будет такая ошибка, то нужно добавить товар в избранное, затем удалить его оттуда и если опять лазать по сайту, этой ошибки больше нет.
Да получилось! Для страницы товара сделал тоже самое, что и для категории, модулей, пока ошибок не наблюдаю. Спасибо Владимир!!!
Подскажите, пожалуйста, для незарегистрированных добавляет класс, а для зарегистрированных нет. Почему? В чем может быть причина?
А замену 'success' делали? самый последний пункт
Тоже самое, для гостей все работает для зарегистрированных нет
if (in_array($result['product_id'], $w_list)) {
$wl_class = 'wl-add';
} else {
$wl_class = '';
}
и в шаблоне продукта что выводить вместо
class="<?php echo $product['wl_class']; ?>
?
А можно еще такой вопрос, можно ли как то отметить кнопку закладок, после добавления?
К примеру, понравился товар, нажал сердечко, покрасился в другой цвет?
Пытаюсь сделать в common.js, но я ничего там не понимаю ): или хотя бы как класс нужный задать ТОЛЬКО понравившемуся товару а не всем?
Добавить класс при добавлении закладки просто. В common.js найдите
И добавьте здесь класс, как то так:Проверок здесь никаких не нужно, все равно только в плюс. Теперь нужно сохранить класс при обновлении страниц, удалить если товаров в закладках не осталось… здесь сложнее. Нужен контроллер «controller/common/header.php», вот этот код:
Добавим в $data класс в зависимости количества товаров. В итоге будет так:
Теперь осталось в header.tpl добавить назначенный класс. Для ссылки с id=«wishlist-total» добавить:
А если нужно добавить в категории, и в модули latest.tpl и special.tpl? Я так понимаю нужно в контроллере вставить тоже самое что и в голову?


Ну то есть, в данный момент, работает так: Добавляю товар в закладки, красится сердечко которое подсчитывает общее количество добавленных в избранное.
А можно ли как то сделать так что бы допустим я на любой странице где есть товар и где выводится кнопка добавления в избранное, при нажатии этой кнопки, сердце только для этого товара добавлялся?
ну к примеру сейчас так:
это в голове кнопка сердца
а у товара который добавил нету:
Просматриваю common.js
увидел вот такой код, на сколько я понял, отвечает за то что, если удачно добавили, тогда выводит это:
Вот и думал, что может можно как то поменять? К примеру получить ид товара и для этого товара грубо говоря добавлять класс?
Сейчас чутка посидел подумал додумался до такого:
в catalog.tpl где кнопка добавления в избранное добавил уникальный ид
теперь в common.js
вместо:
написал
пробывал и так
но все равно не добавляет ):
Нашел в чем косяк, теперь добавляет для добавленного товара нужный мне класс для кнопки с лайком :)))
уже не помню как там с идентификаторами, но с классами есть проблемы если они только из цифр
тогда можно делать так: переменная не в кавычках
Пробовал 2 вариантом, не срабатывал ):
Отличный вариант! Только если, нет товаров в закладках появляется ошибка «Invalid argument supplied for foreach()»
Вопрос теперь другой. Если добавить товар в закладки, подсчитывается сумма всех товаров в закладках, НО если удалить все товары, то 0 почему то не ставится и остается 1, как будто еще товар остался, при этом страница закладок пустая. Как решить проблему?Решил проблему вот так:
Проверял на opencart 3, там все корректно и так, под опенкарт 2 нужно немного подправить…
нужно1. controller/account/wishlist.php
вместо
2. controller/common/header.php
вместо
нужно
(проверяем на пустоту, а не существование)
ВОУ! Работает!!! Спасибо Вам, Владимир!!!