views:

6793

answers:

6

Hi there,

I'm having issues getting the customer.xml layout file to work properly for the customer's "my account" pages.

The navigation links and the previously ordered items that are usually on the left hand side of the page won't show up on the page, but if I change the reference name to "content" in the xml file, it shows up (except it's obviously then on the right hand side). I've checked the template it's referencing (2columns-left.phtml), and the getChildHtml('left') is there in the correct position.

The block that's causing the problem:

<customer_account>
    <!-- Mage_Customer -->
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>

    <reference name="left">
        <action method="unsetChild"><name>catalog.navigation.all</name></action>
        <action method="unsetChild"><name>callout.sendcard</name></action>
        <action method="unsetChild"><name>callout.specialorder</name></action>
        <block type="customer/account_navigation" name="customer_account_navigation" before="-" template="customer/account/navigation.phtml">
            <action method="addLink" translate="label" module="customer"><name>account</name><path>customer/account/</path><label>Account Dashboard</label></action>
            <action method="addLink" translate="label" module="customer"><name>account_edit</name><path>customer/account/edit/</path><label>Account Information</label></action>
            <action method="addLink" translate="label" module="customer"><name>address_book</name><path>customer/address/</path><label>Address Book</label></action>
        </block>
        <block type="sales/reorder_sidebar" name="sale.reorder.sidebar" as="reorder" template="sales/reorder/sidebar.phtml"/>
        <remove name="tags_popular"/>
    </reference>
</customer_account>

This was basically copied straight over from another one of our sites where this works 100%. I've tried everything I can think of (changing the name of the reference in both the template and the layout xml, for example) to no avail. The templates that the layout is referencing are obviously working because they do show up when put into the "content" area.

This installation of magento is version 1.3.1.1.

I appreciate any advice you have to give me...

*Update: I tried changing the reference to "global_messages", and it doesn't show there either. It only seems to work in the "content" section.*

Update 2: These are the results of using the "showLayout=page" query string on the page when used with Alan Storm's very handy debugging module (which you'll find in his answer below).

    <?xml version="1.0"?>
<layout><block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">
 <block type="page/html_head" name="head" as="head">
  <action method="addJs">
   <script>prototype/prototype.js</script>
  </action>
  <action method="addJs">
   <script>prototype/validation.js</script>
  </action>

  <action method="addJs">
   <script>paypoint/validation.js</script>
  </action>
  <action method="addJs">
   <script>scriptaculous/builder.js</script>
  </action>
  <action method="addJs">
   <script>scriptaculous/effects.js</script>

  </action>
  <action method="addJs">
   <script>scriptaculous/dragdrop.js</script>
  </action>
  <action method="addJs">
   <script>scriptaculous/controls.js</script>
  </action>
  <action method="addJs">

   <script>scriptaculous/slider.js</script>
  </action>
  <action method="addJs">
   <script>varien/js.js</script>
  </action>
  <action method="addJs">
   <script>varien/form.js</script>

  </action>
  <action method="addJs">
   <script>varien/menu.js</script>
  </action>
  <action method="addJs">
   <script>mage/translate.js</script>
  </action>
  <action method="addJs">

   <script>mage/cookies.js</script>
  </action>
  <action method="addCss">
   <stylesheet>css/reset.css</stylesheet>
  </action>
  <action method="addCss">
   <stylesheet>css/boxes.css</stylesheet>

  </action>
  <action method="addCss">
   <stylesheet>css/clears.css</stylesheet>
  </action>
  <action method="addCss">
   <stylesheet>css/menu.css</stylesheet>
  </action>
  <action method="addCss">

   <stylesheet>css/calendar-blue.css</stylesheet>
  </action>
  <action method="addCss">
   <stylesheet>css/styles.css</stylesheet>
  </action>
  <action method="addItem">
   <type>skin_css</type>

   <name>css/iestyles.css</name>
   <params/>
   <if>IE</if>
  </action>
  <action method="addItem">
   <type>skin_css</type>
   <name>css/ie7.css</name>

   <params/>
   <if>IE 7</if>
  </action>
  <action method="addItem">
   <type>skin_css</type>
   <name>css/ie7minus.css</name>
   <params/>

   <if>lt IE 7</if>
  </action>
  <action method="addItem">
   <type>js</type>
   <name>lib/ds-sleight.js</name>
   <params/>
   <if>lt IE 7</if>

  </action>
  <action method="addItem">
   <type>js</type>
   <name>varien/iehover-fix.js</name>
   <params/>
   <if>lt IE 7</if>
  </action>

  <action method="addCss">
   <stylesheet>css/print.css</stylesheet>
   <params>media="print"</params>
  </action>
 </block>
 <block type="page/html_header" name="header" as="header">
  <block type="page/template_links" name="top.links" as="topLinks"/>
  <block type="page/switch" name="store_language" as="store_language" template="page/switch/languages.phtml"/>

  <block type="core/template" name="top.nav" template="page/html/top.nav.phtml"/>
 </block>
 <block type="core/messages" name="global_messages" as="global_messages"/>
 <block type="core/messages" name="messages" as="messages"/>
 <block type="core/text_list" name="content" as="content"/>
 <block type="core/text_list" name="right" as="right"/>
 <block type="page/html_footer" name="footer" as="footer" template="page/html/footer.phtml"/>
 <block type="core/text_list" name="before_body_end" as="before_body_end"/>
</block>

<block type="core/profiler" output="toHtml"/>
<reference name="top.links">
 <action method="addLink" translate="label title" module="customer">
  <label>My Account</label>
  <url helper="customer/getAccountUrl"/>
  <title>My Account</title>
  <prepare/>
  <urlParams/>
  <position>10</position>

 </action>
</reference>
<reference name="root">
 <action method="setTemplate">
  <template>page/2columns-left.phtml</template>
 </action>
</reference>
<reference name="top.menu">
 <block type="catalog/navigation" name="catalog.topnav" template="catalog/navigation/top.phtml"/>
</reference>
<reference name="footer_links">

 <action method="addLink" translate="label title" module="catalog" ifconfig="catalog/seo/site_map">
  <label>Site Map</label>
  <url helper="catalog/map/getCategoryUrl"/>
  <title>Site Map</title>
 </action>
</reference>
<reference name="footer_links">
 <action method="addLink" translate="label title" module="catalogsearch" ifconfig="catalog/seo/search_terms">
  <label>Search Terms</label>

  <url helper="catalogsearch/getSearchTermUrl"/>
  <title>Search Terms</title>
 </action>
 <action method="addLink" translate="label title" module="catalogsearch">
  <label>Advanced Search</label>
  <url helper="catalogsearch/getAdvancedSearchUrl"/>
  <title>Advanced Search</title>

 </action>
</reference>
<reference name="top.links">
 <block type="checkout/links" name="checkout_cart_link">
  <action method="addCartLink"/>
  <action method="addCheckoutLink"/>
 </block>
</reference>
<reference name="footer">
 <block type="cms/block" name="cms_footer_links" before="footer_links">
  <action method="setBlockId">

   <block_id>footer_links</block_id>
  </action>
 </block>
</reference>
<reference name="left">
 <block type="tag/popular" name="tags_popular" template="tag/popular.phtm" ignore="1">
  <action method="setTemplate">
   <template>tag/popular.phtml</template>
  </action>

 </block>
</reference>
<reference name="left">

</reference>
<reference name="before_body_end">
 <block type="googleanalytics/ga" name="google_analytics" as="google_analytics"/>
</reference>
<reference name="footer_links">
 <action method="addLink" translate="label title" module="contacts" ifconfig="contacts/contacts/enabled">
  <label>Contact Us</label>

  <url>contact-us</url>
  <title>Contact Us</title>
  <prepare>true</prepare>
 </action>
</reference>
<reference name="footer_links">
 <action method="addLink" translate="label title" module="rss" ifconfig="rss/config/active">
  <label>RSS</label>

  <url>rss</url>
  <title>RSS testing</title>
  <prepare>true</prepare>
  <urlParams/>
  <position/>
  <li/>
  <a>class="link-feed"</a>

 </action>
</reference>
<reference name="wishlist_sidebar">
 <action method="addPriceBlockType">
  <type>bundle</type>
  <block>bundle/catalog_product_price</block>
  <template>bundle/catalog/product/price.phtml</template>
 </action>

</reference>
<reference name="cart_sidebar">
 <action method="addItemRender">
  <type>bundle</type>
  <block>bundle/checkout_cart_item_renderer</block>
  <template>checkout/cart/sidebar/default.phtml</template>
 </action>
</reference>
<reference name="root">

 <action method="setTemplate">
  <template>page/2columns-left.phtml</template>
 </action>
</reference>
<reference name="left">
 <action method="unsetChild">
  <name>catalog.navigation.all</name>
 </action>
 <action method="unsetChild">

  <name>callout.sendcard</name>
 </action>
 <action method="unsetChild">
  <name>callout.specialorder</name>
 </action>
 <block type="customer/account_navigation" name="customer_account_navigation" before="-" template="customer/account/navigation.phtml">
  <action method="addLink" translate="label" module="customer">
   <name>account</name>

   <path>customer/account/</path>
   <label>Account Dashboard</label>
  </action>
  <action method="addLink" translate="label" module="customer">
   <name>account_edit</name>
   <path>customer/account/edit/</path>
   <label>Account Information</label>

  </action>
  <action method="addLink" translate="label" module="customer">
   <name>address_book</name>
   <path>customer/address/</path>
   <label>Address Book</label>
  </action>
 </block>

 <block type="sales/reorder_sidebar" name="sale.reorder.sidebar" as="reorder" template="sales/reorder/sidebar.phtml"/>
 <remove name="tags_popular"/>
</reference>
<reference name="customer_account_navigation">
 <action method="addLink" translate="label" module="sales">
  <name>orders</name>
  <path>sales/order/history/</path>
  <label>My Orders</label>

 </action>
</reference>
<reference name="customer_account_navigation">
 <action method="addLink" translate="label" module="tag">
  <name>tags</name>
  <path>tag/customer/</path>
  <label>My Tags</label>
 </action>

</reference>
<reference name="customer_account_navigation">
 <action method="addLink" translate="label" module="newsletter">
  <name>newsletter</name>
  <path>newsletter/manage/</path>
  <label>Newsletter Subscriptions</label>
 </action>
</reference>
<reference name="cart_sidebar">

 <action method="addItemRender">
  <type>bundle</type>
  <block>bundle/checkout_cart_item_renderer</block>
  <template>checkout/cart/sidebar/default.phtml</template>
 </action>
</reference>
<update handle="customer_account"/>
<reference name="content">
 <block type="customer/account_dashboard" name="customer_account_dashboard" template="customer/account/dashboard.phtml">

  <block type="customer/account_dashboard_hello" name="customer_account_dashboard_hello" as="hello" template="customer/account/dashboard/hello.phtml"/>
  <block type="core/template" name="customer_account_dashboard_top" as="top"/>
  <block type="customer/account_dashboard_info" name="customer_account_dashboard_info" as="info" template="customer/account/dashboard/info.phtml"/>
  <block type="customer/account_dashboard_newsletter" name="customer_account_dashboard_newsletter" as="newsletter" template="customer/account/dashboard/newsletter.phtml"/>
  <block type="customer/account_dashboard_address" name="customer_account_dashboard_address" as="address" template="customer/account/dashboard/address.phtml"/>
  <block type="core/template" name="customer_account_dashboard_info1" as="info1"/>
  <block type="core/template" name="customer_account_dashboard_info2" as="info2"/>
 </block>
</reference>

<reference name="right">
 <action method="unsetChild">
  <name>catalog_compare_sidebar</name>
 </action>
</reference>
<reference name="customer_account_dashboard">
 <action method="unsetChild">
  <name>top</name>
 </action>

 <block type="sales/order_recent" name="customer_account_dashboard_top" as="top" template="sales/order/recent.phtml"/>
</reference>
<reference name="right">
 <action method="unsetChild">
  <name>right.poll</name>
 </action>
</reference>
<reference name="customer_account_dashboard">
 <action method="unsetChild">
  <name>customer_account_dashboard_info2</name>

 </action>
 <block type="tag/customer_recent" name="customer_account_dashboard_info2" as="info2" template="tag/customer/recent.phtml"/>
</reference>
<reference name="right">
 <action method="unsetChild">
  <name>right.newsletter</name>
 </action>
</reference>
<reference name="top.links">
 <action method="addLink" translate="label title" module="customer">

  <label>Log Out</label>
  <url helper="customer/getLogoutUrl"/>
  <title>Log Out</title>
  <prepare/>
  <urlParams/>
  <position>100</position>
 </action>

</reference></layout>
+7  A: 

First things first. Make sure you've cleared out your Magento application cache. All layout XML is cached by Magento, so dropping a new file in there isn't enough to trigger any changes.

It sounds like your left hand column isn't rendering. Here's a few possible reasons for this

  1. Your root template to is being set to something other than the two column left layout

  2. A <remove /> tag is being injected into the layout somewhere that's zapping your left column

  3. Your "left" block is being overridden so that it doesn't have the child blocks it needs to properly render

So, step 1 is to figure out which of the three this is. Place some arbitrary but noticeable text in all your php/phtml files (i tend towards something like <h1>one</h1>, <h1>two</h1>, etc.) so you can tell which files are actually being loaded.

There's also a template debug setting in

System->Configuration->Developer->Debug->Template Path Hints

which does something similar. If you want to use this you'll need to drill down to a specific configuration scope (you can't set it on default)

While doing either of these won't point to the direct problem, they will (hopefully) let you rule out individual causes.

There's an important thing to keep in mind about layouts. The names of those XML files are arbitrary. They way layouts work is all the layout XML is combined into one giant XML file. Then, for each request, this large XML file is reduced depending on what "handles" a page request has. A handle is something like <default> or <checkout_cart_index>. In other words, something in any of your other layout files may be causing you problems on the checkout page, not just things in customer.xml.

It's also possible that the Magento site you're working with has a controller or two that's overridden, which would change the layout handles that Magento looks for with any page request.

Point being, there's a number of things that could be causing this, and we need to peek inside Magneto's internals. Install this module in your development environment (it's an experimental debugging thing I'm working on)

http://alanstorm.com/2005/projects/Layoutviewer.tar.gz

When you have it up and running, load a page in your store with the following query string

http://magento.example.com/customer/account/?showLayout=handles

This will display the handles magento uses on any request. You should see a list of something like

  1. default
  2. STORE_bare_us
  3. THEME_\frontend_default_default
  4. customer_account_index
  5. customer_logged_in

If number 4 is something different (companyname_modulename_customer_account_index), that means your site has a custom controller for this request. If that's the case, you'll want to look for tags in your layouts inside <companyname_modulename_customer_account_index> that may be overriding what you want to do.

Next, load a Magento URL with the following query string

http://magento.example.com/customer/account/?showLayout=page

You should see an XML file being rendered in the browser. This is you request's final layout XML. Look for a tag (most likely named root) with an output attribute set

<block type="page/html" name="root" output="toHtml" template="page/2columns-left.phtml">

The output attribute means this is the template that Magento will start rendering with. If this isn't your two column layout, you're closer to solving your problem.

Next, look for a module named left inside the root module

<block type="core/text_list" name="left" as="left" ignore="1"/>

If this has an ignore attribute, there will probably be a corresponding tag

<remove name="left"/>

somewhere in your layout. You'll want to remove this.

Also, make sure that your root block actually has a child block with the name left.

<block type="page/html" name="root" output="toHtml" ... >
    ...
    <block type="core/text_list" name="left" as "left" />
    ...
</block>

Finally, and this is more a sanity check

http://magento.example.com/checkout/cart/?showLayout=package

Specifying "package" in the showLayout query string parameter will show you your entire package layout. This is all your layout.xml files combined into one. You can use this to make sure magento knows about the XML you're adding (cache), and to make sure you're editing the correct files. You can also example each handle section to look for unexpected layout intrusctions that are giving you the results you're not happy with.

Alan Storm
Wow... thanks Alan, you're a legend. This module of yours is very handy indeed.The root template is set to 3columns.phtml, but as you can see in the code from my OP, I update which template is used. I know this works because I've tried putting something into the 2columns-left.phtml file and it shows up on the page. I've also checked for a <remove name="left" /> tag, but there isn't one within or relating to the customer_account page. As far as I can tell, it's not being overridden.Thanks so much for your help!
Remy
Can you post the contents of "showLayout=page"?
Alan Storm
Hi Alan, I have updated my OP with the xml that gets returned. Many thanks again for your help.
Remy
I **think** I see your problem, and I've updated the main post to reflect this. Take a look at the root block in your showlayout=page generated XML. This root block has no child block named left. Without this there, getChildHtml has nothing to instantiate, and will silently pass. Take a look at the factory default page.xml to see where/how you should should define a vlock with name=left directly under the block with name="root". My guess is someone else on your team took this out.
Alan Storm
That was it! You're a genius... thanks so much for your help!
Remy
Thanks Alan. I refer to this post frequently. Your ideas helped me to figure out that I need to nest my <reference> tags if I wanted to update the template of a block (before I was copy and pasting the block which added it twice!)
Josh Ribakoff
Thanks Alan, with your Layoutviewer module I was able to debug a problem I was having! You're a legend!
Vincent
A: 

Hi alan!

I tried your layoutViewer module, but i cant get this module work.

I put the Alanstormdotcom_Layoutviewer.xml into app/etc/modules And all the others folders in app\code\community\Alanstormdotcom\LayoutViewer

Then i add "?showLayout=handles" in the url of any page, but i dont see any changes. I've tried this in front and in admin area.

Is there something i miss?

dolu
A: 

Hello. Thank you for sharing your awesome info.

I got one problem which i iam not been able to solve.

Everything seems to be working alrigt, exept when logged in and trying to modify address book, or edit addresses. Magento redirects to no-route, 404 page.

I've made fresh (ssh) install of latest 1.3, installed hellothemes theme.

Have updated mage-latest-core

have tried to use only default theme, it does not help.

Do you have any suggestions to fix this? And if i don't manage to fix this, how much would you need money to do it for me?

Site will be going in production state in march!

Thanks anyways for your awesome help for magento!

-Jani

Jani
A: 

Hello Sir,

I am developing a website DeveloperSolution.com , I am trying to add a CMS page! But i want that should show within in My Account Section! I have done This! But now problem is When we click on that page the left My Account Blcok do not come! Any help would be appreciated!

Regards, Raj

Raj
A: 

In response to dolu (for anyone else who has this problem), if you put Alan's module in app/code/community, you need to edit app/etc/modules/Alanstormdotcom_Layoutviewer.xml to use the "community" codePool. The module expects to be installed at app/code/local by default (at least the version linked to Alan's answer here).

Del F
A: 

Thank you very much guys !

I've had exactly the same problem: someone of my team removed the left block from the root block... Hopefully I've found this post to help me!

Cheers

GouMs