Magento 1 provided the useful ability to add layout updates depending on whether the customer was logged in or out of their account. For some reason, Magento 2 does not contain these layout handles by default. Below will describe the steps needed to add customer layout handles in Magento 2.
To start with, add a custom module containing a registration.php
and module.xml
file.
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, '[Vendor]_[Module]', __DIR__ );
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="[Vendor]_[Module]" setup_version="1.0.0" /> </config>
Enable the module and upgrade the database by running the following commands from your Magento root directory.
/path/to/php bin/magento module:enable [Vendor]_[Module] /path/to/php bin/magento setup:upgrade
The customer layout handles will be added via an event observer. The event in particular that needs to be ‘observed’ is the layout_load_before
event.
Create an events.xml
within the module’s etc/frontend
directory and define the observer.
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="layout_load_before"> <observer name="add_customer_handles" instance="[Vendor]\[Module]\Observer\AddCustomerHandlesObserver" /> </event> </config>
Create the observer, which will be responsible for adding in the customer_logged_in
and customer_logged_out
layout handles. You can use getUpdate()->addHandle()
from the layout object passed in the event.
In addition, inject the Magento\Customer\Model\Session
class that can be used to check whether the customer is logged in or not.
<?php namespace [Vendor]\[Module]\Observer; use Magento\Customer\Model\Session; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; class AddCustomerHandlesObserver implements ObserverInterface { /** * @var Session */ private $customerSession; /** * AddCustomerHandlesObserver constructor. * * @param Session $customerSession */ public function __construct( Session $customerSession ) { $this->customerSession = $customerSession; } /** * @param Observer $observer * @throws \Magento\Framework\Exception\LocalizedException */ public function execute(Observer $observer) { $layout = $observer->getEvent()->getLayout(); if ($this->customerSession->isLoggedIn()) { $layout->getUpdate()->addHandle('customer_logged_in'); } else { $layout->getUpdate()->addHandle('customer_logged_out'); } } }
Now you’ll have the ability to add layout updates within a customer_logged_in.xml
and a customer_logged_out.xml
file.
Add these layout files within the module’s view/frontend/layout
directory. As an example, the layout files shown below add a template that renders content depending on whether the customer is logged in or not.
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="content"> <block class="Magento\Framework\View\Element\Template" name="customerhandles.loggedin" after="-" template="[Vendor]_[Module]::customer_logged_in.phtml" /> </referenceContainer> </body> </page>
<div class="loggedin-container"> <p><?php echo __('Content showing for logged in customers'); ?></p> </div>
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="content"> <block class="Magento\Framework\View\Element\Template" name="customerhandles.loggedout" after="-" template="[Vendor]_[Module]::customer_logged_out.phtml" /> </referenceContainer> </body> </page>
<div class="loggedout-container"> <p><?php echo __('Content showing for logged out customers'); ?></p> </div>
Refresh the cache, and you should notice that the content that appears is dependent on whether the customer is logged out or in.
Note: This article is based on Magento Open Source version 2.2.