I want to find out which js sets the customer data in local storage in magento2.
Magento2 – How Customer Data is Set on Local Storage
customerlocal-storagemagento2
Related Solutions
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:
You can check this answer out:
Magento 2: Syncing Backend and Frontend State/Cache
Here's an example how to use customer-data:
define([
"Magento_Customer/js/customer-data"
], function (customerData) {
// Get data
var customData = customerData.get("custom-data")();
// Change something
customData.foo = "bar";
// Set data
customerData.set("custom-data", customData);
});
Hope this'll help you out.
Best Answer
The customer data component is added in the layout:
and loaded in the template:
The component prototype is:
And all data loading in the line near 200, in the
init
method of the customer data class:The main method responsible for data loading (
reload
) is calling a data providersgetFromServer
method:To reload all data the
sectionsNames
must be an empty array.