Magento 2: Добавить для сравнения и добавить в список желаний с помощью ajax
Как сделать добавление для сравнения и добавления в список пожеланий с помощью ajax. Я хочу сделать функциональность ajax для списка желаний и сравнить на главной странице товары блока горячих продавцов и товары на странице списка.
Без перезагрузки страницы с помощью ajax добавьте в список желаний и добавьте для сравнения функциональности.
3 answers
Не хочу ничего рекламировать, но модуль сравнения и списка пожеланий Tigren ajax выполнил наши требования. О, а также это бесплатно и включает в себя функции добавления ajax в корзину и входа в систему клиента.
Https://www.tigren.com/magento-2-extensions/ajax-suite-magento-2/
Я добавил функцию добавления 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
в файле контроллера.
Мне удалось придумать довольно простое решение для функциональности списка пожеланий 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.
Редактировать: при использовании этого метода есть несколько недостатков:
- Нет
success
обратного вызова из запроса POST. - Как только вы добавите товар, на следующей странице, которую вы посетите, появится сообщение о том, что "[товар] добавлен в ваш список пожеланий. Нажмите здесь, чтобы продолжить покупки".
Поэтому, хотя это работает, это далеко не надежное решение.