0

I have a requirement where Customer can select from available theme to be shown when they are logged in. Now I have theme's id in customer Eav setup custom attribute, I also have setup a customer_login event

events.xml

<?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="customer_login"> <observer name="themepick_customer_login_observer" instance="Afnam\ThemePick\Observer\CustomerLogin" /> </event> </config> 

and in Observer\CustomerLogin.php

public function execute(\Magento\Framework\Event\Observer $observer) { $customer_id = $observer->getEvent()->getCustomer()->getId(); $customer = $this->customerRepository->getById( $customer_id ); $id = $customer->getCustomAttribute( Constants::SELECTED_THEME )->getValue(); $themes = $this->collectionFactory->create()->loadRegisteredThemes(); foreach ($themes as $theme) { if ($theme->getId() == $id) { $this->config->assignToStore( $theme, [Store::DEFAULT_STORE_ID], ScopeConfigInterface::SCOPE_TYPE_DEFAULT ); } } } 

but it doesn't change the theme as expected, I have followed this link https://magento.stackexchange.com/a/140027/26896 and they are changing theme in InstallData

Another important issue is that I dont really want to change the system theme I rather want to apply different themes for different users So it doesn't change the theme for all users but the current user only, and once they logout or check site in other browser with other user so they see default or other assigned theme to that user, Hope I have made myself clear

2 Answers 2

0

Below changes require in Observer\CustomerLogin.php

public function execute(\Magento\Framework\Event\Observer $observer) { $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $config = $objectManager->get("\Magento\Theme\Model\Config"); $storeManager = $objectManager->get('\Magento\Store\Model\StoreManagerInterface'); $customer_id = $observer->getEvent()->getCustomer()->getId(); $customer = $this->customerRepository->getById( $customer_id ); $id = $customer->getCustomAttribute( Constants::SELECTED_THEME )->getValue(); $theme = $objectManager->get("\Magento\Theme\Model\ThemeFactory")->create()->load($id); $storeId= $storeManager->getStore()->getStoreId(); if ($theme->getId()) { $config->assignToStore($theme,[$storeId],'store'); } } 
2
  • You should not use the object manager, use depencency injection instead Commented Dec 10, 2019 at 8:32
  • Yes, that's my mistake. Should use dependancy injection. Commented Dec 10, 2019 at 11:39
-1

You need to flush/ clean the cache in order for loading a new theme.

Refer to this topic to clean the cache programmatically. click here

3
  • I have already tried flushing the cache and ran setup:upgrade after above script doesn't make any difference Commented Apr 13, 2018 at 6:28
  • Go to Content => Design => Confirguration to check whether the theme is set properly. See the example image link: prntscr.com/j4mlyj Commented Apr 13, 2018 at 6:46
  • its showing the default already applied theme in admin panel Commented Apr 13, 2018 at 8:44

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.