Magento provides the ability to have multiple homepages or a homepage with dynamic blocks that alter based on demand. However, there may be times when different homepages must be displayed based on customer groups/segments.
This is possible with the dynamic block functionality, which is available in the Enterprise and Cloud editions. However, there is a constraint in that you have to maintain numerous blocks for multiple customer groups/segments. In that situation, you can alter the default functionality by using the code below:
Step 1: Create a plugin for "Magento\Cms\Controller\Index\Index" by adding the below code in your module di.xml file.
<type name="Magento\Cms\Controller\Index\Index">
<plugin name="dynamicHomepage" type="Mageinsight\Module\Plugin\DynamicHomepage" sortOrder="1"/>
</type>
Step 2: Add the plugin file as below:
<?php
namespace Mageinsight\Module\Plugin;
use Magento\Framework\App\Config;
use Magento\Cms\Model\ResourceModel\Page as PageModel;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Cms\Helper\Page as PageHelper;
use Magento\Customer\Model\Session as CustomerSession;
class DynamicHomepage
{
/**
* @var \Magento\Cms\Helper\Page
*/
protected $pageHelper;
protected $pageModel;
protected $storeManager;
/**
* @var CustomerSession
*/
protected $customerSession;
/**
* Index constructor.
*
* @param \Magento\Cms\Helper\Page $pageHelper
* @param PageModel $pageModel
* @param \Magento\Store\Model\StoreManagerInterface $storeManager
* @param CustomerSession $customerSession
*/
public function __construct(
PageHelper $pageHelper,
PageModel $pageModel,
StoreManagerInterface $storeManager,
CustomerSession $customerSession
) {
$this->pageHelper = $pageHelper;
$this->pageModel = $pageModel;
$this->storeManager = $storeManager;
$this->customerSession = $customerSession;
}
public function aroundExecute(
\Magento\Cms\Controller\Index\Index $subject,
\Closure $proceed,
$coreRoute = null
) {
$groupId = $this->customerSession->getCustomerGroupId();
if ($groupId) {
$pageIdentifier = // You can have your logic to get page Identifier
if ($pageIdentifier) {
$storeId = $this->storeManager->getStore()->getId();
$pageId = $this->pageModel->checkIdentifier($pageIdentifier, $storeId);
$resultPage = $this->pageHelper->prepareResultPage($subject, $pageId);
if ($resultPage) {
return $resultPage;
}
}
}
return $proceed();
}
}
Now you will be able to manage different homepages at one time for different customers.
Comments
Post a Comment