I had a similar problem: I wanted the mini-cart component to refresh after I sent an Ajax request to add an item the cart.
It actually works quite nicely if you just remember some points:
- Declare which page sections need to be updated after an Ajax call, in etc/frontend/sections.xml of your module.
- Use jQuery.post() to send your Ajax request. It may be a POST or a PUT request, just not GET.
- And it must be through jQuery, not Prototype or vanilla JS, because it is jQuery's 'ajaxComplete' event that plays an essential role.
- prepend the Ajax url with a base-url (do not just start with /)
Here is my sections.xml (xyz is the name of our customer):
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
<action name="xyz-ajax/cart/add">
<section name="cart"/>
</action>
</config>
Here, 'xyz-ajax/cart/add' is according to the format '[frontName]/[ActionPath]/[ActionName]'. The xml tells Magento to update 'cart' after ajax call "xyz-ajax/cart/add" has completed.
This is my template (.phtml) code:
<script type="text/javascript">
require(['jquery', 'BigBridge_XYZ/option_selector'], function($, optionSelect) {
optionSelect.create(<?= json_encode($componentData) ?>, $);
})
</script>
and this is the JS code that sends the Ajax request:
function requestComplete(responseData) {
}
$.post(baseUrl + 'xyz-ajax/cart/add/cf/' + configurableProductId + '/simple/' + item.simpleProductId + '/amount/' + item.amount, requestComplete);
What happens in the process?
Every time your script sends an Ajax POST (or PUT) request to the server via jQuery, and it returns, jQuery sends an 'ajaxComplete' event. This event is handled by a handler in module-customer/view/frontend/web/js/customer-data.js. This handler checks which page-sections depend on the Ajax call (from your sections.xml) and invalidates them. These will be updated.
Sources:
Since the encrypt
-function may produce unsafe characters like =
or +
only the second method with base 64 encoding will be safe.
Use this twoliner:
$key = Mage::helper('core')->urlEncode(Mage::helper('core')->encrypt(123));
$url = Mage::getUrl('product/index/link', array('key' => $key));
Best Answer
You can use just the Magento core URL for coupon posting:
http://example.com/checkout/cart/couponPost/coupon_code/MY_COUPON_CODE
You can also add on?return_url=http...
if you want a specific return url or let it just redirect to the cart by default.