Comprehensive Guide on Magento 2 Sections and Local Storage with a Real Module Example (BigBoy Namespace)
Magento 2 offers enhanced performance and user experience by introducing sections for storing customer data and other necessary information in the browser’s local storage. This approach significantly reduces page load times by preventing unnecessary server calls and offloading some of the processing to the client-side. Here's a detailed guide to implement this using Magento 2 and a real module under the BigBoy namespace.
In Magento 2, sections are predefined data chunks stored in local storage in the browser. The idea is that when a user interacts with the website, Magento can deliver specific data in the form of sections (such as the customer's cart, shipping address, and customer session) without having to reload the entire page or make additional AJAX calls to the server. These sections can be stored and retrieved in the browser’s local storage, which helps reduce page load times.
Sections are defined in XML configuration files and can contain various types of customer-related data, such as:
- Customer's shopping cart
- Customer authentication (login status)
- Checkout details
- Customer's wishlist
- Store information
- Improved performance: Sections are stored in the browser's local storage and are retrieved directly from there, reducing the number of server requests.
- Reduced page reloads: Sections update parts of the page without requiring a complete page reload, making for a smoother user experience.
- Optimized customer experience: Sections allow personalized data (e.g., cart contents, customer login status) to be quickly accessible and updated.
In Magento 2, sections are defined using the sections.xml configuration file, which is typically located in the view/frontend or view/adminhtml directories of your module.
Let's create a custom module called BigBoy_SectionExample. Here's how we can set up the directory structure:
app/code/BigBoy/SectionExample
├── etc
│ ├── frontend
│ │ └── sections.xml
│ └── module.xml
└── registration.phpThis file registers your module with Magento 2.
<?php
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'BigBoy_SectionExample',
__DIR__
);This is the module declaration file located in the etc folder.
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="BigBoy_SectionExample" setup_version="1.0.0"/>
</config>Now, let's define the sections in etc/frontend/sections.xml for our module. This file will define which data will be stored in local storage. Here's an example:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/section-config.xsd">
<section name="customer" request_field="customer">
<storage>
<type>localStorage</type>
</storage>
</section>
<section name="cart" request_field="cart">
<storage>
<type>localStorage</type>
</storage>
</section>
</config>In this configuration:
customerandcartare the sections we're defining.request_fieldspecifies the data being requested.- The
<storage><type>localStorage</type></storage>part defines that this data should be stored in the browser's local storage.
Sometimes, you may need to modify the data in the section or handle specific events when sections are updated. To do this, you can create an observer. For example, if you want to update the cart section whenever a new product is added to the cart, you can do the following:
- Create
etc/frontend/events.xmlfile:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework/Event/etc/events.xsd">
<event name="checkout_cart_product_add_after">
<observer name="update_cart_section" instance="BigBoy\SectionExample\Observer\UpdateCartSection" />
</event>
</config>- Then, implement the observer in
Observer/UpdateCartSection.php:
<?php
namespace BigBoy\SectionExample\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Checkout\Model\Cart;
class UpdateCartSection implements ObserverInterface
{
protected $cart;
public function __construct(Cart $cart)
{
$this->cart = $cart;
}
public function execute(Observer $observer)
{
// Logic to update the cart section.
$cartData = $this->cart->getQuote()->getItemsCollection();
// Here you can modify the cart data or perform any required actions
// to update localStorage in the browser
}
}To enable the module, run the following commands:
php bin/magento module:enable BigBoy_SectionExample
php bin/magento setup:upgrade
php bin/magento cache:flushOnce the sections are defined, Magento will automatically manage the process of storing and retrieving the data in local storage for the specified sections. This process is abstracted from the developer, meaning that Magento handles the heavy lifting behind the scenes.
For instance, when the customer adds a product to the cart, Magento will store the cart information in the browser's local storage, allowing you to access it quickly without making an AJAX call to the server.
You can debug and view the data stored in the browser's local storage by inspecting the page's storage in the developer tools of your browser (usually under Application > Local Storage).
In this guide, we created a Magento 2 module under the BigBoy namespace that defines sections for storing customer and cart data in local storage. This is an efficient way to improve the response time of your Magento store, particularly for customers who have repetitive or dynamic data like cart contents or customer sessions.
Using sections, Magento 2 leverages local storage for data caching, reducing server requests and improving the overall user experience. By creating a custom module and defining sections through sections.xml, you can customize which data is stored, ensuring performance is optimized according to your store's needs.
Let me know if you'd like help with any specific steps or further elaboration!