Magento 2: Добавить для сравнения и добавить в список желаний с помощью ajax


Как сделать добавление для сравнения и добавления в список пожеланий с помощью ajax. Я хочу сделать функциональность ajax для списка желаний и сравнить на главной странице товары блока горячих продавцов и товары на странице списка.

Без перезагрузки страницы с помощью ajax добавьте в список желаний и добавьте для сравнения функциональности.

Author: Rakesh Jesadiya, 2016-02-22

3 answers

Не хочу ничего рекламировать, но модуль сравнения и списка пожеланий Tigren ajax выполнил наши требования. О, а также это бесплатно и включает в себя функции добавления ajax в корзину и входа в систему клиента.

Https://www.tigren.com/magento-2-extensions/ajax-suite-magento-2/

 1
Author: Macas, 2018-05-18 07:33:28

Я добавил функцию добавления Ajax в список желаний на странице продукта следующим способом:

Добавлена пользовательская кнопка "Добавить в список желаний" в следующий файл внутри условия <?php if ($block->isWishListAllowed()) : ?>

App/design/frontend/Vendor/Module/Magento_Wishlist/templates/catalog/product/view/addto/wishlist.phtml

<button name="add-to-wishlist" onclick="addProductToWishlist()"> Add to Wishlist</button>
<?php $productId = json_decode($block->getWishlistParams(), true)['data']['product']; ?>

Он вызывает addProductToWishlist() функцию javascript, которую я добавил в тот же список пожеланий.phtml файл

<script>
function addProductToWishlist() {
    require(["jquery"], function($){
        $.ajax({
            url: '<?php echo $this->getUrl('general/index/addtowishlist') ?>',
            method: 'get',
            data: { productId: <?php echo $productId ?>},
            dataType: 'json',
            showLoader:true,
            success: function(data){
                var redirect = data.result.redirect;
                if(redirect) {
                    window.location.href = '<?php echo $this->getUrl('customer/account/login') ?>';
                } else {
                  // show successfully added message 
                }
            }
        });
    });
}

Вот мой код контроллера, который имеет логика добавления товара в список желаний.

App/code/Vendor/Module/Controller/Index/Addtowishlist.php

<?php

namespace Vendor\General\Controller\Index;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;

class Addtowishlist extends Action {

    protected $customerSession;
    protected $wishlistRepository;
    protected $productRepository;

    public function __construct(
    Context $context,
    \Magento\Customer\Model\Session $customerSession,
    \Magento\Wishlist\Model\WishlistFactory $wishlistRepository,
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository,
    ResultFactory $resultFactory,
    \Magento\Framework\Controller\Result\JsonFactory $jsonFactory
        ) {
        $this->customerSession = $customerSession;
        $this->wishlistRepository= $wishlistRepository;
        $this->productRepository = $productRepository;
        $this->resultFactory = $resultFactory;
        $this->jsonFactory = $jsonFactory;
        parent::__construct($context);
    }

    public function execute() {
        $customerId = $this->customerSession->getCustomer()->getId();
        if(!$customerId) {
           $jsonData = ['result' => ['status' => 200, 'redirect' => 1,'message' => 'Customer not logged in.']]; 
            $result = $this->jsonFactory->create()->setData($jsonData);
            return $result;
        }
        $productId = $this->getRequest()->getParam('productId');

        try {
            $product = $this->productRepository->getById($productId);
        } catch (NoSuchEntityException $e) {
            $product = null;
        }

        $wishlist = $this->wishlistRepository->create()->loadByCustomerId($customerId, true);

        $wishlist->addNewItem($product);
        $wishlist->save();

        $jsonData = ['result' => ['status' => 200, 'redirect' => 0, 'message' => 'Added to wishlist']];
        $result = $this->jsonFactory->create()->setData($jsonData);
        return $result;
    }
} 

Приведенный выше код отлично работает на странице продукта. Аналогичным образом вы можете добавить функцию Ajax "Добавить в список желаний" на странице списка.

Note: Приведенный выше код нуждается в некотором улучшении, например, в проверке form_key в файле контроллера.

 6
Author: amitshree, 2018-12-12 12:42:22

Мне удалось придумать довольно простое решение для функциональности списка пожеланий AJAX:

1) Используйте следующий вспомогательный метод, который возвращает параметры в кодировке JSON:

$this->helper("Magento\Wishlist\Helper\Data")->getAddParams($product)

Это возвращает что-то вроде следующего:

{
    "action": "https://www.mywebsite.com/wishlist/index/add/",
    "data": {
        "product": "1",
        "uenc": "a0bLy9tMhZGlhLWVsZXljbGFya2oZWxY29tL25i5hc3RsZW1lbnRzLXNUusLmhHR0cHM6Ww,"
    }
}

2) Включите ключ формы в свои данные при отправке запроса POST, аналогично следующему:

var url  = "https://www.mywebsite.com/wishlist/index/add/";
var data = {
    action   : "add-to-wishlist",
    form_key : "xyC5IcaqeNg2um6g",
    product  : "1",
    uenc     : "a0bLy9tMhZGlhLWVsZXljbGFya2oZWxY29tL25i5hc3RsZW1lbnRzLXNUusLmhHR0cHM6Ww,"
}

$.post(url, data);

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

Примечание: ключ формы можно получить либо с помощью JavaScript, либо получение значения файла cookie с именем form_key или с помощью функции getFormKey() Magento.

Редактировать: при использовании этого метода есть несколько недостатков:

  1. Нет success обратного вызова из запроса POST.
  2. Как только вы добавите товар, на следующей странице, которую вы посетите, появится сообщение о том, что "[товар] добавлен в ваш список пожеланий. Нажмите здесь, чтобы продолжить покупки".

Поэтому, хотя это работает, это далеко не надежное решение.

 3
Author: user7290573, 2018-07-04 12:21:07