Magento – calling css using layout xml

csslayout

I have made a custom module and within that module I want to add my own css file.

So far I have made all the required phtml files and the necessary layout.xml file. Testing the module I can see that I can call all the relevant files so I am confident my layout.xml is working. My issue is that when I try and add css to my modules files I only get the same HTML code as when I don't try to call the css. I.e. the head is not added

I have read this magento tutorial and this other tutorial as well as several others and I can't see what I am doing wrong

I shall use signup as my example:

in the signup.phtml i have

<form>HTML & PHP to create form</form>

but nothing else. To get the head for my form page I try to call page/html/head.phtml and add an action node to call my css

<layout>
<default>
    <reference name="root">
        <block type="core/template" name="page_head" output="toHtml" template="page/html/head.phtml" />
        <action method="addCss"><stylesheet>css/normalize.css</stylesheet></action>             
    </reference>
</default>     
<user_register_form>
        <block type="core/template" name="prefcentre_regform" output="toHtml" template="ps/prefcentre/signup.phtml" />
</user_register_form>
<layout>

(Please not this is my most recent attempt to link my page with css, I have made several other attempts but it seems pointless to add all attempts)

It is my understanding from reading the tutorials that Magento will load the default handle and apply to all the pages in this .xml file. so why is this not being loaded? I am also wondering if my css is in the right folder, I currently have it in frontend/base/default/css but I have also tried placing it in frontend/default/modulename/css. I am not sure how Magento loads the stylesheet i.e which function it uses so I have not been able to take a look to try and work it out and I have not found that explanation in any of the tutorials

SUMMARY

  1. how do I set up the .xml file to add css to the pages in my module?

  2. were do I need to locate my css for magento to find them?

  3. which class is used to load action method="addCss"? (I have looked in various Mage/Core/Block folders)

  4. is there an alternative way to troubleshoot an xml problem other than simple trail and error? (for example I use Zend_Debug::dump($var) very useful when editing the php side of things)

Best Answer

You have an error in your xml, the <layout> tag at the end should be closed, but I will assume that it's a copy/paste mistake and that is not the problem

Your problem is here:

<default>
    <reference name="root">
        <block type="core/template" name="page_head" output="toHtml" template="page/html/head.phtml" />
        <action method="addCss"><stylesheet>css/normalize.css</stylesheet></action>
    </reference>
</default>

What you are doing is:

  1. Referencing the root block in all pages, adding to it a block of type core/template that is using the page/html/head.phtml as its template.
  2. Calling the addCss method of the page/html block (since the root is of that type if you look in the page.xml layout file)

What you should be doing is referencing the head block as the addCss function is in that one.

Now before answering your main question, I would like to put out a few remarks:

  • It is my understanding from reading the tutorials that Magento will load the default handle and apply to all the pages in this .xml file.

This is somewhat true, except that anything in the <default> handle, will applied website-wide, not just for pages of that particular layout file.

  • which class is used to load action method="addCss"? (I have looked in various Mage/Core/Block folders)

If you look at the page.xml file, you can find it. In fact there are 2 methods to add CSS files, addCss and addItem

<block type="page/html_head" name="head" as="head">
    <action method="addCss"><stylesheet>css/styles.css</stylesheet></action>
    <action method="addItem"><type>skin_css</type><name>css/styles-ie.css</name><params/><if>lt IE 8</if></action>
    <!-- etc. -->
</block>

From the type of the block, page/html_head, you would be able to figure out that the block is Mage_Page_Block_Html_Head. (It's in the format of module/path)

  • how do I set up the .xml file to add css to the pages in my module?

Since you need the css to be ONLY in you module's pages, you cannot put it in the <default> handle. As it would be loaded in all pages throughout the website.

But what you can do, is create your own "default" handle, and make all other handles "extend" it.

So using all that info, this is how your XML would look like:tl;dr

<layout>
    <!-- First we create the default handle that should be applied to all
         of the module pages in this layout file-->
    <user_register>
        <reference name="head">
            <!-- There is no need to reference the root handle, we just
                 reference the head handle and call the addCss method -->
            <action method="addCss"><stylesheet>css/normalize.css</stylesheet></action>             
        </reference>
    </user_register>
    <!-- The next handle will match the BASE_URL/user/register/form path -->
    <user_register_form>
            <!-- This is the tag which "extends" the user_register handle-->
            <update handle="user_register"/>
            <block type="core/template" name="prefcentre_regform" output="toHtml" template="ps/prefcentre/signup.phtml" />
    </user_register_form>
</layout>

  • where do I need to locate my css for magento to find them?

Since you used css/normalize.css as the path for the CSS file, it should be located at frontend/default/default/css and not inside a subfolder.