Автор Тема: Можно ли заставить модуль blockwishlist работать без регистрации?  (Прочитано 45 раз)

22 Ноября 2016, 08:55:46
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Подскажите,
можно ли заставить модуль blockwishlist работать без регистрации?

Если пользователь не зарегистрирован, то при клике на кнопку добавить в избранное получаем
"Вы должны авторизоваться"

Можно ли добиться работы модуля избранных товаров без регистрации?

Возможно какой нибудь хак?
Заранее спасибо!
22 Ноября 2016, 11:53:03
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Класс модуля нужно изменить WishList.php. В нем заменить $id_customer на временный ид, котрый брать из cookie.
29 Ноября 2016, 13:52:58
Ответ #2
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Класс модуля нужно изменить WishList.php. В нем заменить $id_customer на временный ид, котрый брать из cookie.

Мне кажется всё волшебство происходит в cart.php
Здесь вместо $context->customer->id
использовать временный ид, котрый брать из cookie.
Что скажите?
29 Ноября 2016, 14:07:23
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В  /modules/blockwishlist/cart.php определение списка на основе id_wishlist
$context->cookie->id_wishlistесли он не существует, то создается новый
$wishlist = new WishList();Так что без изменения класса WishList нельзя обойтись.
29 Ноября 2016, 16:47:20
Ответ #4
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В  /modules/blockwishlist/cart.php определение списка на основе id_wishlist
$context->cookie->id_wishlistесли он не существует, то создается новый
$wishlist = new WishList();Так что без изменения класса WishList нельзя обойтись.

А возможен ли такой вариант:
В случае если клиент не зарегистрирован и пытается добавить товар в wishlist,
автоматически создавать пользователя например с ФИО Гость и уже для него добавлять товар?

В этом случае wishlist будет доступен в Личном кабинете 'Моё избранное'

29 Ноября 2016, 18:06:55
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Можно и так, но лучше создавать временный ид и хранить его в сессии без создания гостевого акка, чтобы бд не забивалась ненужными данными.
01 Декабря 2016, 16:43:31
Ответ #6
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Можно и так, но лучше создавать временный ид и хранить его в сессии без создания гостевого акка, чтобы бд не забивалась ненужными данными.

Один момент всё таки не понятен.

Всё реализуется через new WishList()
$wishlist = new WishList();
$wishlist->id_shop = $context->shop->id;
$wishlist->id_shop_group = $context->shop->id_shop_group;
$wishlist->default = 1;

$mod_wishlist = new BlockWishList();
$wishlist->name = $mod_wishlist->default_wishlist_name;
$wishlist->id_customer = (int)$context->customer->id;
list($us, $s) = explode(' ', microtime());
srand($s * $us);
$wishlist->token = strtoupper(substr(sha1(uniqid(rand(), true)._COOKIE_KEY_.$context->customer->id), 0, 16));
$wishlist->add();
$context->cookie->id_wishlist = (int)$wishlist->id;

Так вот, по какому принципу необходимо создавать (int)$context->customer->id, что бы он не пересёкся с тем, что уже имеется в FROM `'._DB_PREFIX_.'wishlist`

Как реализовать : В нем заменить $id_customer на временный ид, котрый брать из cookie.

if (!isset($context->cookie->id_customer) || $context->cookie->id_customer == '')
   {
      $context->cookie->id_customer = откуда брать временной id (по какому принципу его создавать?);
      $context->customer->id = $context->cookie->id_customer;
   }
01 Декабря 2016, 18:15:04
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 13147
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Поэтому и менять нужно класс WishList, чтобы не использовать id_customer. Этот ид можно использовать только когда пользователь авторизируется. Получается что нужно создать новый модуль.
02 Декабря 2016, 09:00:22
Ответ #8
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Поэтому и менять нужно класс WishList, чтобы не использовать id_customer. Этот ид можно использовать только когда пользователь авторизируется. Получается что нужно создать новый модуль.

Не подскажите?
В /modules/blockwishlist/cart.php имеем
$wishlist = new WishList();
$wishlist->add();

Однако метод add() в WishList.php отсутствует:
Есть public function delete()
а вот add() нет.

Подскажите где он находится?

Единственное похожее на то что нужно это:
public static function addProduct($id_wishlist, $id_customer, $id_product, $id_product_attribute, $quantity)
Только здесь выполняется INSERT:
INSERT INTO `'._DB_PREFIX_.'wishlist_product` (`id_wishlist`, `id_product`, `id_product_attribute`, `quantity`, `priority`)
02 Декабря 2016, 10:42:53
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 2169
  • Репутация: +49/-4
  • Сообщество PrestaShop
    • Просмотр профиля
02 Декабря 2016, 11:56:17
Ответ #10
  • Старожил
  • ****
  • Сообщений: 254
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Общие методы add, del.. в классе ObjectModel.php.

Подскажите, в методе add
Db::getInstance()->insert($this->def['table'], $this->getFields(), $null_values)

Всё пишется в таблицу $this->def['table']

Как узнать чему равняется значение $this->def['table']??
Предполагаю, что в моём случае:
$this->def['table'] == ps_wishlist
02 Декабря 2016, 12:02:04
Ответ #11
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 85953
  • Репутация: +25399/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В классе всегда есть описание модели
/**
 * @see ObjectModel::$definition
 */
public static $definition = array(
        'table' => 'wishlist',