Creating admin custom theme from backend

create admin custom theme

Today we are going to talk about how can we create and define custom package, theme, skin, layout and template for admin area of Magento?

Strangely we have this control for frontend which Magento has provided as part of their core product but not sure why Magento hasn’t done this for admin or backend. Personally we find it really strange, but nevermind, this give us opportunity to go deep level of Magento code which is always a good thing.

Let’s crack on with our step by step implementation of doing this job -:

Step 1 – Create a new module under your local folder, in our case under \app\local\Scommerce\AdminTheme

Step 2 – Register the module in etc/modules directory either in Scommerce_All.xml or Scommerce_AdminTheme.xml by using the following code

<Scommerce_AdminTheme>
    <active>true</active>
    <codePool>local</codePool>
</Scommerce_AdminTheme>

Step 3 – Create config.xml under etc directory of your module \app\local\Scommerce\AdminTheme\etc\config.xml by using the following code

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Scommerce_AdminTheme>
            <version>0.0.1</version>
        </Scommerce_AdminTheme>
    </modules>
    <global>
        <events>
            <adminhtml_controller_action_predispatch_start>
                <observers>
                    <Scommerce_AdminTheme_Observer>
                        <class>Scommerce_AdminTheme_Model_Observer</class>
                        <method>adminTheme</method>
                    </Scommerce_AdminTheme_Observer>
                </observers>
            </adminhtml_controller_action_predispatch_start>
        </events>
    </global>
    <adminhtml>
        <translate>
            <modules>
                <Scommerce_AdminTheme>
                    <files>
                        <default>Scommerce_AdminTheme.csv</default>
                    </files>
                </Scommerce_AdminTheme>
            </modules>
        </translate>
        <acl>
         <resources>
            <admin>
                <children>
                    <system>
                         <children>
                             <config>
                                <children>
                                  <Scommerce_admin_theme translate="title">
                                   <title>Admin Theme</title> 
                                  </Scommerce_admin_theme>
                                </children>
                             </config>
                          </children>
                      </system>
                  </children>
              </admin>
          </resources>
     </acl>
  </adminhtml>
  <default>
        <Scommerce_admin_theme>
            <package>
                <current_package>default</current_package>
            </package>
            <themes>
                <default>default</default>
            </themes>
        </Scommerce_admin_theme>
    </default>  
</config>

In the above step, the key thing to notice is the adminhtml_controller_action_predispatch_start event which we are going to call to set our package, theme, layout, skin and template when you login to admin panel of your site.

Step 4 – Create system.xml under etc directory of your module \app\local\Scommerce\AdminTheme\etc\config.xml by using the following code

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <tabs>
        <scommerce translate="label">
            <label>Scommerce Configuration</label>
            <sort_order>10</sort_order>
        </scommerce>
    </tabs>
    <sections>
        <scommerce_admin_theme translate="label">
            <label>Admin Design</label>
            <tab>scommerce</tab>
            <frontend_type>text</frontend_type>
            <sort_order>300</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <package translate="label">
                    <label>Package</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>10</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <current_package translate="label">
                            <label>Current Package Name</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>10</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </current_package>
                    </fields>
                </package>
                <themes translate="label">
                    <label>Themes</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>20</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <template translate="label">
                            <label>Templates</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>10</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </template>
                        <skin translate="label">
                            <label>Skin (Images / CSS)</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>20</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </skin>
                        <layout translate="label">
                            <label>Layout</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>30</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </layout>
                        <default translate="label">
                            <label>Default</label>
                            <frontend_type>text</frontend_type>
                            <sort_order>40</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </default>
                    </fields>
                </themes>
            </groups>
        </scommerce_admin_theme>
    </sections>
</config>

In the above step, we are creating our new tab (Scommerce Configuration) and creating system configuration for defining package, theme, skin, layout and template from admin panel.

Step 5 – This is the last step and also the most important step of all. Here we are going to create our observer class under Model directory of our module app\code\local\Scommerce\AdminTheme\Model\Observer.php.

This class set the package, theme, skin, layout and template for admin panel when you login to admin area of your website.

class Scommerce_AdminTheme_Model_Observer
{
   protected $_currentArea = "adminhtml";

   protected $_packagename = "default";

   protected $_theme = "default";

   const CURRENT_PACKAGE = "Scommerce_admin_theme/package/current_package";

   const CURRENT_THEME = "Scommerce_admin_theme/themes";

   public function adminTheme()
   {
      if (Mage::getStoreConfig(self::CURRENT_PACKAGE)){
       $this->_packagename=Mage::getStoreConfig(self::CURRENT_PACKAGE);
      }
      if (Mage::getStoreConfig(self::CURRENT_THEME."/default")){
       $this->_theme=Mage::getStoreConfig(self::CURRENT_THEME."/default");
      }
      elseif(Mage::getStoreConfig(self::CURRENT_PACKAGE)){
       $this->_theme=Mage::getStoreConfig(self::CURRENT_PACKAGE);
      }

      Mage::getDesign()
            ->setArea($this->_currentArea)
            ->setPackageName((string)$this->_packagename)
            ->setTheme((string)$this->_theme);

      foreach (array('layout', 'template', 'skin') as $type) {
       if ($value = Mage::getStoreConfig(self::CURRENT_THEME."/".$type)) {
            Mage::getDesign()->setTheme($type, $value);
        }
      }
    }
}

As you have noticed Mage::getDesign() is the main function which sets the theming for frontend and adminhtml using setArea function.

Hope this article helped you in some way. Please leave us your comment and let us know what do you think? Thanks.

4 thoughts on “Creating admin custom theme from backend

  1. I love the way you wrote this article. This is wonderful. I do hope you intend to write more of these types of articles. Thank you for this interesting content!

  2. You guys did a great job spending your time to create this article! If I had to explain my emotions about your website in only one word ? it would be WOW! Thank you! P.S. Subscribed for updates!

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.