Current File : /var/www/vinorea/modules/tvcmswishlist/controllers/front/mywishlist.php
<?php
/**
 * 2007-2025 PrestaShop.
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@prestashop.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to http://www.prestashop.com for more information.
 *
 *  @author PrestaShop SA <contact@prestashop.com>
 *  @copyright  2007-2025 PrestaShop SA
 *  @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 *  International Registered Trademark & Property of PrestaShop SA
 */
class TvcmsWishListMyWishListModuleFrontController extends ModuleFrontController
{
    public $ssl = true;

    public function __construct()
    {
        parent::__construct();
        $this->context = Context::getContext();
        include_once $this->module->getLocalPath() . 'FunWishList.php';
    }

    /**
     * @see FrontController::initContent()
     */
    public function initContent()
    {
        parent::initContent();
        $action = Tools::getValue('action');

        if (!Tools::isSubmit('myajax')) {
            $this->assign();
        } elseif (!empty($action) && method_exists($this, 'ajaxProcess' . Tools::toCamelCase($action))) {
            $this->{'ajaxProcess' . Tools::toCamelCase($action)}();
        } else {
            exit(json_encode(['error' => 'method doesn\'t exist']));
        }
    }

    /**
     * Assign wishlist template.
     */
    public function assign()
    {
        $errors = [];

        if ($this->context->customer->isLogged()) {
            $add = Tools::getIsset('add');
            $add = (false === empty($add) ? 1 : 0);
            $delete = Tools::getIsset('deleted');
            $delete = (false === empty($delete) ? 1 : 0);
            $default = Tools::getIsset('default');
            $default = (false === empty($default) ? 1 : 0);
            $id_wishlist = Tools::getValue('id_wishlist');
            if (Tools::isSubmit('submitWishlist')) {
                if (1 == Configuration::get('PS_TOKEN_ACTIVATED')
                    && strcmp(Tools::getToken(), Tools::getValue('token'))) {
                    $errors[] = $this->module->l('Invalid token', 'mywishlist');
                }
                if (!count($errors)) {
                    $name = Tools::getValue('name');
                    if (empty($name)) {
                        $errors[] = $this->module->l('You must specify a name . ', 'mywishlist');
                    }
                    if (FunWishList::isExistsByNameForUser($name)) {
                        $errors[] = $this->module->l('This name is already used by another list . ', 'mywishlist');
                    }

                    if (!count($errors)) {
                        $wishlist = new FunWishList();
                        $wishlist->id_shop = $this->context->shop->id;
                        $wishlist->id_shop_group = $this->context->shop->id_shop_group;
                        $wishlist->name = $name;
                        $wishlist->id_customer = (int) $this->context->customer->id;
                        !$wishlist->isDefault($wishlist->id_customer) ? $wishlist->default = 1 : '';
                        list($us, $s) = explode(' ', microtime());
                        srand($s * $us);
                        $wishlist->token = Tools::strtoupper(Tools::substr(sha1(uniqid(rand(), true)
                            . _COOKIE_KEY_ . $this->context->customer->id), 0, 16));
                        $wishlist->add();
                        Mail::Send(
                            $this->context->language->id,
                            'wishlink',
                            Mail::l('Your wishlist\'s link', $this->context->language->id),
                            [
                            '{wishlist}' => $wishlist->name,
                            '{message}' => $this->context->link->getModuleLink('tvcmswishlist', 'view', [
                                'token' => $wishlist->token,
                            ]),
                            ],
                            $this->context->customer->email,
                            $this->context->customer->firstname . ' ' . $this->context->customer->lastname,
                            null,
                            pSQL(Configuration::get('PS_SHOP_NAME')),
                            null,
                            null,
                            $this->module->getLocalPath() . 'mails/'
                        );

                        Tools::redirect($this->context->link->getModuleLink('tvcmswishlist', 'mywishlist'));
                    }
                }
            } elseif ($add) {
                FunWishList::addCardToWishlist(
                    $this->context->customer->id,
                    Tools::getValue('id_wishlist'),
                    $this->context->language->id
                );
            } elseif ($delete && false === empty($id_wishlist)) {
                $wishlist = new FunWishList((int) $id_wishlist);
                if ($this->context->customer->isLogged()
                    && $this->context->customer->id == $wishlist->id_customer
                    && Validate::isLoadedObject($wishlist)) {
                    $wishlist->delete();
                } else {
                    $errors[] = $this->module->l('Cannot delete this wishlist', 'mywishlist');
                }
            } elseif ($default) {
                $wishlist = new FunWishList((int) $id_wishlist);
                if ($this->context->customer->isLogged()
                    && $this->context->customer->id == $wishlist->id_customer
                    && Validate::isLoadedObject($wishlist)) {
                    $wishlist->setDefault();
                } else {
                    $errors[] = $this->module->l('Cannot delete this wishlist', 'mywishlist');
                }
            }
            $this->context->smarty->assign('wishlists', FunWishList::getByIdCustomer($this->context->customer->id));
            $tmp = FunWishList::getInfosByIdCustomer($this->context->customer->id);
            $this->context->smarty->assign('nbProducts', $tmp);
        } else {
            Tools::redirect('index.php?controller=authentication&back='
                . urlencode($this->context->link->getModuleLink('tvcmswishlist', 'mywishlist')));
        }

        $this->context->smarty->assign([
            'id_customer' => (int) $this->context->customer->id,
            'errors' => $errors,
            'form_link' => $errors,
        ]);

        $this->setTemplate('module:tvcmswishlist/views/templates/front/mywishlist.tpl');
    }

    public function ajaxProcessDeleteList()
    {
        if (!$this->context->customer->isLogged()) {
            exit(json_encode(['success' => false,
                'error' => $this->module->l('You aren\'t logged in', 'mywishlist'), ]));
        }
        $default = Tools::getIsset('default');
        $default = (false === empty($default) ? 1 : 0);
        $id_wishlist = Tools::getValue('id_wishlist');
        $wishlist = new FunWishList((int) $id_wishlist);
        if (Validate::isLoadedObject($wishlist) && $wishlist->id_customer == $this->context->customer->id) {
            $default_change = $wishlist->default ? true : false;
            $id_customer = $wishlist->id_customer;
            $wishlist->delete();
        } else {
            exit(json_encode(['success' => false,
                'error' => $this->module->l('Cannot delete this wishlist', 'mywishlist'), ]));
        }
        if ($default_change) {
            $array = FunWishList::getDefault($id_customer);

            if (count($array)) {
                exit(json_encode([
                    'success' => true,
                    'id_default' => $array[0]['id_wishlist'],
                    ]));
            }
        }
        exit(json_encode(['success' => true]));
    }

    public function ajaxProcessSetDefault()
    {
        if (!$this->context->customer->isLogged()) {
            exit(json_encode(['success' => false,
                'error' => $this->module->l('You aren\'t logged in', 'mywishlist'), ]));
        }
        $default = Tools::getIsset('default');
        $default = (false === empty($default) ? 1 : 0);
        $id_wishlist = Tools::getValue('id_wishlist');

        if ($default) {
            $wishlist = new FunWishList((int) $id_wishlist);
            if (Validate::isLoadedObject($wishlist)
                && $wishlist->id_customer == $this->context->customer->id
                && $wishlist->setDefault()) {
                exit(json_encode(['success' => true]));
            }
        }
        exit(json_encode(['error' => true]));
    }

    public function ajaxProcessProductChangeWishlist()
    {
        if (!$this->context->customer->isLogged()) {
            exit(json_encode(['success' => false,
                'error' => $this->module->l('You aren\'t logged in', 'mywishlist'), ]));
        }

        $id_product = (int) Tools::getValue('id_product');
        $id_product_attribute = (int) Tools::getValue('id_product_attribute');
        $quantity = (int) Tools::getValue('quantity');
        $priority = (int) Tools::getValue('priority');
        $id_old_wishlist = (int) Tools::getValue('id_old_wishlist');
        $id_new_wishlist = (int) Tools::getValue('id_new_wishlist');
        $new_wishlist = new FunWishList((int) $id_new_wishlist);
        $old_wishlist = new FunWishList((int) $id_old_wishlist);

        // check the data is ok
        if (!$id_product || !is_int($id_product_attribute) || !$quantity
            || !is_int($priority) || ($priority < 0 && $priority > 2) || !$id_old_wishlist || !$id_new_wishlist
            || (Validate::isLoadedObject($new_wishlist) && $new_wishlist->id_customer != $this->context->customer->id)
            || (Validate::isLoadedObject($old_wishlist) && $old_wishlist->id_customer != $this->context->customer->id)) {
            exit(json_encode([
                'success' => false,
                'error' => $this->module->l('Error while moving product to another list', 'mywishlist'),
            ]));
        }

        $res = true;
        $check = (int) Db::getInstance()->getValue('SELECT quantity FROM ' . _DB_PREFIX_ . 'wishlist_product
            WHERE `id_product` = ' . $id_product . ' AND `id_product_attribute` = ' . $id_product_attribute
                 . ' AND `id_wishlist` = ' . $id_new_wishlist);
        if ($check) {
            $res &= $old_wishlist->removeProduct(
                $id_old_wishlist,
                $this->context->customer->id,
                $id_product,
                $id_product_attribute
            );
            $res &= $new_wishlist->updateProduct(
                $id_new_wishlist,
                $id_product,
                $id_product_attribute,
                $priority,
                $quantity + $check
            );
        } else {
            $res &= $old_wishlist->removeProduct(
                $id_old_wishlist,
                $this->context->customer->id,
                $id_product,
                $id_product_attribute
            );
            $res &= $new_wishlist->addProduct(
                $id_new_wishlist,
                $this->context->customer->id,
                $id_product,
                $id_product_attribute,
                $quantity
            );
        }

        if (!$res) {
            exit(json_encode([
                'success' => false,
                'error' => $this->module->l('Error while moving product to another list', 'mywishlist'),
            ]));
        }
        exit(json_encode([
            'success' => true,
            'msg' => $this->module->l('The product has been correctly moved', 'mywishlist'),
        ]));
    }
}