Перейти к содержимому


Добавить товар в избранное


  • Вы не можете ответить в тему
Сообщений в теме: 14

#1 zcz

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 104 сообщений
Репутация: 62
Продвинутый

Отправлено 01 November 2016 - 11:16 AM

Спонсор stasikons

Модуль позволяет реализовать на сайте блок "избранное".
Работает все на ajax, для зарегистрированных заноситься в базу, для посетителей в сессию.
Сразу скажу, что код в шаблонах написан под 3.1.3 версию, но переделать, думаю, труда не составит.
Все ajax и js (jquery) написаны универсально + есть закомментированные строки под старую и новую версию шаблона

Если в шаблоне не установлен jquery, то его необходимо будет поставить!

Установка:

!ВКЛЮЧАЕМ ПРИНУДИТЕЛЬНУЮ ОЧИСТКУ КЕША В АДМИНКЕ!

Заливаем файлы в свои директории.

Открываем index.php в корне (да он должен быть открытым.)
Находим строку

if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file" ))) {

Заменяем на

if ( in_array($_GET["do"], array( "captcha", "cart", "rss", "compare", "yandex", "invoice_jur", "invoice_phys", "stat", "get_file", "favourites" ))) {

в файле core/config/tables.inc.php в самый низ перед закрывающим тегом ?> вставляем

if(!defined('FAVORITES_TABLE')) {
define('FAVORITES_TABLE', 'ПРЕФИКС_favourites');
}

Открываем файл core/functions/product_functions.php
Находим функцию prdSearchProductByTemplate

в ней, в самом низу, перед $result[] = $row; вставляем

//вставка для избранных товаров
if ( isset($_SESSION["log"]) ) {
$select = mysql_query("SELECT customerID FROM ".CUSTOMERS_TABLE." WHERE `Login` = '".$_SESSION["log"]."' ");
$rows = mysql_fetch_array($select);
$favorit = mysql_query("SELECT productsID FROM ".FAVORITES_TABLE." WHERE customerID = '".$rows[0]."'");
$r = mysql_fetch_array($favorit);
$prd = explode(",", $r[0]);
foreach ($prd as $v) {
if($v == $row['productID']) {
$row["inF"] = 1;
}
}
}
else {
$prd = explode(",", $_SESSION['f_prod']);
foreach ($prd as $v) {
if($v == $row['productID']) {
$row["inF"] = 1;
}
}
}
//END вставка для избранных товаров

открываем core/tpl/user/ВАШ_ШАБЛОН/product_detailed.tpl.html

в нужном месте вставляем кусок кода для кнопки "в избранное"

{*Добавить в избранное*}
<span id="favour_{$product_info.productID}">
{if $in_favorite eq 1}
<a href="#" onclick="doFavoriteDel('pID={$product_info.productID}'); return false" class="btn btn-default">Удалить из избранного</a>
{else}
<a href="#" onclick="doFavorite('pID={$product_info.productID}'); return false" class="btn btn-default">В избранное</a>
{/if}
</span>
{*END добавить в избранное*}

в файле core/tpl/user/ВАШ_ШАБЛОН/product_brief.tpl.html в нужном месте вставляем

{*Добавить в избранное*}
<span id="favour_{$product_info.productID}">
{if $product_info.inF eq 1}
<a href="#" onclick="doFavoriteDel('pID={$product_info.productID}'); return false" class="btn btn-default btn-xs">Удалить из избранного</a>
{else}
<a href="#" onclick="doFavorite('pID={$product_info.productID}'); return false" class="btn btn-default btn-xs">В избранное</a>
{/if}			  
</span>
{*END добавить в избранное*}

в core/tpl/user/ВАШ_ШАБЛОН/index.tpl.html перед закрывающим тегом </body> добавляем


{* добавление в избранное *}
<script src="data/{$smarty.const.TPL}/favourites.js"></script>
{* END добавление в избранное *}

в htaccess необходимо в самый низ добавить строки

#Избранные товары
RewriteRule ^favourites\.html$ index.php?favourites=yes [L]
#END избранные товары

После всех изменений переходим на страницу http://ВАШ_САЙТ/favourites.html

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

Устанавливаем блок из "управления блоками" (добавить блок из файла) или вставляем вручную в нужном месте шаблона.
Если все шаги были выполнены верно, то можно наслаждаться новым модулем.

Прикрепленный файл  Добавить в избранное.rar   7.47К   25 Количество загрузок:
Прикрепленный файл  favourites_js_3_1_2.rar   902байт   8 Количество загрузок: - JS для shopcms 3.1.1 и 3.1.2
  • 7
Пишу, устанавливаю, натягиваю))) pix-art.ru

#2 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 06 November 2016 - 09:14 PM

Вот это подарок! Гранд мерси!!!
  • 0

#3 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 13 November 2016 - 04:51 PM

На странице избранного - если товара нет в наличии, то кнопка "Добавить в корзину" все равно доступна.
При нажатии на нее Ajax затемняет экран и сообщает что товар добавлен в корзину. Но понятно что в корзине товара и не будет.
Как исправить проблемку с доступностью кнопки при отсутствии товара на складе?
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#4 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 13 November 2016 - 06:31 PM

Сделал под свои нужды немного по другому.
Извиняюсь за беспокойство.

p.s. Маленький штрих ;)

В файле /ВАШ ШАБЛОН/favourites.tpl.html

Найти строчку:

<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$favourites_product[i].productID}.html{else}index.php?productID={$favourites_product[i].productID}{/if}" class="pname">{$favourites_product[i].name|truncate:50:"...":true}</a>

Заменить на это:

<a href="{if $smarty.const.CONF_MOD_REWRITE eq 1}product_{$favourites_product[i].productID}.html{else}index.php?productID={$favourites_product[i].productID}{/if}" class="pnameh">{$favourites_product[i].name|truncate:50:"...":true}</a>

Тем самым подправим правильно класс с class="pname" на class="pnameh"
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#5 zcz

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 104 сообщений
Репутация: 62
Продвинутый

Отправлено 14 November 2016 - 06:09 AM

На странице избранного - если товара нет в наличии, то кнопка "Добавить в корзину" все равно доступна.
При нажатии на нее Ajax затемняет экран и сообщает что товар добавлен в корзину. Но понятно что в корзине товара и не будет.
Как исправить проблемку с доступностью кнопки при отсутствии товара на складе?

Делается так:
в includes/favourites.php на 65 строке перед t.filename добавить s.in_stoсk,
В шаблон core/tpl/user/шаблон/favourites.tpl.html перед формой корзины вставить
{if $smarty.const.CONF_SHOW_ADD2CART eq 1 && ( $smarty.const.CONF_CHECKSTOCK==0 || $favourites_product[i].in_stock > 0 ) }
и после окончания формы, воткнуть закрывающий {/if}
  • 0
Пишу, устанавливаю, натягиваю))) pix-art.ru

#6 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 14 November 2016 - 08:17 AM

zcz - Спасибо еще раз за модуль. Возникло пара вопросов по работе. Все встроил по инструкции, сейчас он работает так:

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

И второе, это при переходе по ссылке /favourites.html отображается пустая страница (не белый экран, а просто пусто, т.е. как будто, товаров в нем нет. Ошибок в статистике нет.

Информации об успешной установке не было, но таблица _favourites существует и в ней есть 4 товара (ID через запятую), однако на/favourites.html ничего не отображается
  • 0

#7 zcz

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 104 сообщений
Репутация: 62
Продвинутый

Отправлено 14 November 2016 - 08:25 AM

zcz - Спасибо еще раз за модуль. Возникло пара вопросов по работе. Все встроил по инструкции, сейчас он работает так:

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

И второе, это при переходе по ссылке /favourites.html отображается пустая страница (не белый экран, а просто пусто, т.е. как будто, товаров в нем нет. Ошибок в статистике нет.

Если все сделано по инструкции, то все должно работать.
Почистите кеш (папка core/chache/), проверьте подключение JS. Если товар добавляется в избранное, но не отрабатывает JS, то нужно смотреть в сторону id блоков и т.д.
  • 0
Пишу, устанавливаю, натягиваю))) pix-art.ru

#8 Jeck2000

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 159 сообщений
Репутация: 8
Начинающий
  • ГородСанкт-Петербург

Отправлено 14 November 2016 - 08:51 AM

Нашел, то, что проглядел. в файле favourites.js базовая установка для 3.1.3, а у меня 3.1.2 . Перезакоментировал. теперь табличка о добавлении и удалении стала появятся. Остался один вопрос. При добавлении, надпись Добавить в избранное должна автоматически меняться на "Удалить из избранного" или только после обновлении страницы ? (тоже касается блока - т.е. должно ли в нем увеличиваться кол-во товаров без обновления страницы или нет) ? или где-то еще что-то нужно подправить под 3.1.2 ? Спасибо

upd: а , ну и в избранном все равно чистый лист
  • 0

#9 zcz

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 104 сообщений
Репутация: 62
Продвинутый

Отправлено 14 November 2016 - 08:56 AM

Нашел, то, что проглядел. в файле favourites.js базовая установка для 3.1.3, а у меня 3.1.2 . Перезакоментировал. теперь табличка о добавлении и удалении стала появятся. Остался один вопрос. При добавлении, надпись Добавить в избранное должна автоматически меняться на "Удалить из избранного" или только после обновлении страницы ? (тоже касается блока - т.е. должно ли в нем увеличиваться кол-во товаров без обновления страницы или нет) ? или где-то еще что-то нужно подправить под 3.1.2 ? Спасибо

Должно автоматически.
$('#favour_'+data.pID+' a').text("Удалить из избранного");
var s = $('#favour_'+data.pID+' a').attr('onclick');
var v = s.replace(/doFavorite/gim, "doFavoriteDel");
$('#favour_'+data.pID+' a').attr('onclick', v);
$('#numF').text(data.numF);
Вот этот кусок кода JS отвечает за смену кнопки и добавление в блок.
  • 0
Пишу, устанавливаю, натягиваю))) pix-art.ru

#10 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 14 November 2016 - 11:58 AM

Делается так:
в includes/favourites.php на 65 строке перед t.filename добавить s.in_stoсk,


Именно так и сделал, только кнопку добавления в корзину убрал вообще, это должно выглядеть (у меня) как просто список избранного. Но зато добавил на страницу избранного "Наличие на складе:"
Плюс в шаблон "shopcms" с bootstap, всунул еще в верхнее меню отображение количества добавленного в избранное.

Выглядит примерно так:

Прикрепленный файл  IMG_14.11.2016-11.40.48.jpg   6.36К   5 Количество загрузок:

От самого блока Избранное отказался вообще. Отображение в верхнем меню служит и для зарегистрированных и для гостей.

И еще что хотел сказать...
По большому счету слово Избранное ассоциируется с добавлением странички товара в избранное браузера. По этому (как по мне) лучше это звучит как Список желаний.

Ну и чтобы все это было по "феншую" в блок Личного кабинета добавил необходимую информацию.
Выглядит примерно так:

Прикрепленный файл  IMG_14.11.2016-11.44.00.jpg   14.41К   4 Количество загрузок:
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#11 zcz

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 104 сообщений
Репутация: 62
Продвинутый

Отправлено 14 November 2016 - 12:02 PM

Как называть и как выводить - личное дело каждого.
Моя задача была сделать рабочий модуль.
  • 0
Пишу, устанавливаю, натягиваю))) pix-art.ru

#12 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 14 November 2016 - 12:10 PM

Никто же и не спорит я просто высказал свое мнение.
За дополнение Вам + в репутацию ;)
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#13 jiykka

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

  • Download User
  • PipPip
  • 29 сообщений
Репутация: 0
Начинающий

Отправлено 25 November 2016 - 02:11 PM

Спасибо за долгожданный модуль!
Но, подскажите друзья:
Есть пикча прикрепленная к углу экрана ведущая на страницу "Избранного".
Хочется сделать чтобы эта пикча появлялась если в избранном есть хотя бы один товар.
Делал так :
{if $favourites_product|@count > 0} пикча {/if}
Но так не работает.
  • 0

#14 zcz

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 104 сообщений
Репутация: 62
Продвинутый

Отправлено 25 November 2016 - 02:23 PM

Спасибо за долгожданный модуль! Но, подскажите друзья: Есть пикча прикрепленная к углу экрана ведущая на страницу "Избранного". Хочется сделать чтобы эта пикча появлялась если в избранном есть хотя бы один товар. Делал так : {if $favourites_product|@count > 0} пикча {/if} Но так не работает.

Ну, если вкратце, то отвечает за показ избранного {$numF} т.е. кол-во товаров в избранном ({if $numF > 0}пикча{/if}). но т.к. товар добавляется через ajax, то нужно учесть еще и это... в favourites.js там где идет добавление после $('#numF').text(data.numF); вставить
if (data.numF === 0){
    $('.class или #id пикчи').hide();
}
else {
    $('.class или #id пикчи').show();
}

и продублировать во втором варианте (т.е. в удалении из избранного).

При этом не забыть по умолчанию ставить пикче style="display:none;" и в шаблоне делать проверку уже не просто {if $numF > 0}пикча{/if} а так:
{if $numF > 0}пикча + style="display:block;" {else}пикча + style="display:none;"{/if}

  • 1
Пишу, устанавливаю, натягиваю))) pix-art.ru

#15 Den

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 117 сообщений
Репутация: 0
Начинающий

Отправлено 27 February 2017 - 01:43 PM

Подскажите, как правильно модифицировать функции doFavorite и doFavoriteDel.

В своем шаблоне, кнопку "В избранное"/"Удалить из избранного" объединил в группу (под Bootstrap) с кнопкой "Добавить в сравнение", и получилось так:
<div class="btn-group" role="group">
<button type="button" onclick="doLoadcpr('do=compare&amp;cpradd={$product_info.productID}'); return false" class="btn btn-default" title="
   Добавить к сравнению"><i class="fa fa-balance-scale" aria-hidden="true"></i></button>
<button type="button" id="testFav" onclick="doFavorite{if $in_favorite eq 1}Del{/if}('pID={$product_info.productID}'); return false" class="btn btn-default" title="В список желаний"><i class="fa fa-heart" aria-hidden="true"></i></button>
</div>

Чтобы группа кнопок нормально отображалась пришлось убрать обрамляющий <span id="favour_{$product_info.productID}"></span>. После перезагрузки страницы все работает как надо - кнопка добавляет и удаляет, но без перезагрузки естественно не работает.

Назначил кнопке id="testFav", а вот как модифицировать функции из favourites.js, чтобы менять содержимое onclick не могу понять... Возможно ли вообще это? Подскажите кто знает.

Update
Все разобрался, нужно назначать кнопке id="favour_{$product_info.productID}", а функции модифицировать так:
- doFavorite
    //$('#favour_'+data.pID+' a').text("Удалить из избранного");
    $('#favour_'+data.pID).attr('title', 'Удалить из избранного');
    //var s = $('#favour_'+data.pID+' a').attr('onclick');
    var s = $('#favour_'+data.pID).attr('onclick');
    var v = s.replace(/doFavorite/gim, "doFavoriteDel");
    //$('#favour_'+data.pID+' a').attr('onclick', v);
    $('#favour_'+data.pID).attr('onclick', v);
- doFavoriteDel
    //$('#favour_'+data.pID+' a').text("В избранное");
    $('#favour_'+data.pID).attr('title', 'В избранное');
    //var s = $('#favour_'+data.pID+' a').attr('onclick');
    var s = $('#favour_'+data.pID).attr('onclick');
    var v = s.replace(/doFavoriteDel/gim, "doFavorite");
    //$('#favour_'+data.pID+' a').attr('onclick', v);
    $('#favour_'+data.pID).attr('onclick', v);

  • 0