Magento 我的帐户布局 XML 问题

Posted

技术标签:

【中文标题】Magento 我的帐户布局 XML 问题【英文标题】:Magento My Account Layout XML Problem 【发布时间】:2010-11-08 10:24:06 【问题描述】:

我在让 customer.xml 布局文件在客户的“我的帐户”页面上正常工作时遇到问题。

通常在页面左侧的导航链接和先前订购的项目不会显示在页面上,但是如果我在 xml 文件中将引用名称更改为“内容”,它会显示出来(除非它显然在右手边)。我检查了它引用的模板 (2columns-left.phtml),getChildHtml('left') 的位置正确。

导致问题的块:

<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>

这基本上是直接从我们另一个 100% 有效的网站复制而来的。我已经尝试了我能想到的一切(例如,在模板和布局 xml 中更改引用的名称)无济于事。布局引用的模板显然可以正常工作,因为它们在放入“内容”区域时会显示出来。

本次安装的magento是1.3.1.1版本。

感谢您给我的任何建议...

更新:我尝试更改对“global_messages”的引用,但它也没有显示在那里。它似乎只在“内容”部分有效。

更新 2:这些是在与 Alan Storm 非常方便的调试模块(您可以在下面的答案中找到)一起使用时在页面上使用“showLayout=page”查询字符串的结果。

    <?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>

【问题讨论】:

很奇怪。我认为您没有不小心从 page.xml 中删除“左”块,或者在某处的默认部分中取消设置? 雷米,你发现了吗?我今天早上早些时候看到了你的评论,但是当我回来回复时,它已经消失了。 【参考方案1】:

首先要做的事情。确保您已清除 Magento 应用程序缓存。所有布局 XML 都由 Magento 缓存,因此将新文件放入其中不足以触发任何更改。

听起来您的左侧列未呈现。以下是一些可能的原因

    您的根模板设置为左两列布局以外的其他内容

    一个 标记被注入到布局中的某处,它正在改变你的左列

    您的“左”块被覆盖,因此它没有需要正确渲染的子块

所以,第一步是找出这三个中的哪一个。在所有 php/phtml 文件中放置一些任意但引人注目的文本(我倾向于像

one

two

等),这样你就可以知道哪些文件是 实际上正在加载。

还有一个模板调试设置

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

它做类似的事情。如果您想使用它,您需要深入到特定的配置范围(您不能将其设置为默认值)

虽然执行其中任何一项都不会直接导致问题,但它们会(希望)让您排除个别原因。

关于布局有一件重要的事情需要牢记。这些 XML 文件的名称是任意的。他们的布局工作方式是所有布局 XML 组合成一个巨大的 XML 文件。然后,对于每个请求,这个大型 XML 文件会根据页面请求的“处理”内容而减少。句柄类似于 。换句话说,您的任何其他布局文件中的某些内容可能会导致您在结帐页面上出现问题,只是 customer.xml 中的内容。

您正在使用的 Magento 站点也可能有一两个被覆盖的控制器,这将更改 Magento 查找任何页面请求的布局句柄。

重点是,有很多因素可能导致这种情况,我们需要深入了解 Magento 的内部结构。在你的开发环境中安装这个模块(这是我正在做的一个实验性调试)

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

当您启动并运行它时,使用以下查询字符串在您的商店中加载一个页面

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

这将显示 magento 在任何请求中使用的句柄。您应该会看到类似

的列表
    默认 STORE_bare_us THEME_\frontend_default_default customer_account_index customer_logged_in

如果数字 4 不同(companyname_modulename_customer_account_index),这意味着您的站点有一个用于此请求的自定义控制器。如果是这种情况,您需要在 内的布局中查找可能会覆盖您想要执行的操作的标签。

接下来,使用以下查询字符串加载 Magento URL

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

您应该会在浏览器中看到一个正在呈现的 XML 文件。这是您请求的最终布局 XML。查找带有输出属性集的标签(最有可能命名为 root)

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

输出属性意味着这是 Magento 开始渲染的模板。如果这不是您的两列布局,那么您离解决问题更近了。

接下来,在根模块中查找名为 left 的模块

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

如果这有一个忽略属性,可能会有一个对应的标签

<remove name="left"/>

在您的布局中的某个位置。你会想要删除它。

此外,请确保您的根块实际上有一个名称为 left 的子块。

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

最后,这更像是一个健全性检查

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

在 showLayout 查询字符串参数中指定“包”将显示您的整个包布局。这是您所有的 layout.xml 文件合并为一个。您可以使用它来确保 magento 知道您正在添加(缓存)的 XML,并确保您正在编辑正确的文件。您还可以对每个句柄部分进行示例,以查找给您带来不满意结果的意外布局入侵。

【讨论】:

哇...谢谢艾伦,你是个传奇。你的这个模块确实很方便。根模板设置为 3columns.phtml,但正如您在我的 OP 的代码中看到的那样,我更新了使用的模板。我知道这是可行的,因为我尝试将某些内容放入 2columns-left.phtml 文件中,并且它会显示在页面上。我还检查了 标记,但在 customer_account 页面内或与之相关的标记都没有。据我所知,它没有被覆盖。非常感谢您的帮助! 嗨艾伦,我已经用返回的 xml 更新了我的 OP。再次感谢您的帮助。 认为我看到了你的问题,我已经更新了主要帖子以反映这一点。查看 showlayout=page 生成的 XML 中的根块。此根块没有名为 left 的子块。如果没有这个,getChildHtml 就没有什么可以实例化的,并且会默默地通过。查看出厂默认 page.xml 以了解应在何处/如何直接在具有 name="root" 的块下定义 name=left 的 vlock。我猜是你团队的其他人把它拿出来了。 就是这样!你真是个天才……非常感谢你的帮助! 谢谢艾伦。我经常参考这篇文章。你的想法帮助我弄清楚如果我想更新一个块的模板,我需要嵌套我的 标签(在我复制并粘贴两次添加它的块之前!)【参考方案2】:

针对dolu(针对有此问题的其他人),如果您将Alan 的模块放在app/code/community 中,则需要编辑app/etc/modules/Alanstormdotcom_Layoutviewer.xml 以使用“community”代码池。该模块预计默认安装在 app/code/local (至少是链接到 Alan 的答案的版本)。

【讨论】:

以上是关于Magento 我的帐户布局 XML 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何重写magento core-cache-model (Mage_Core_Model_Cache)

在每次请求时在Magento中记录所有加载的布局句柄

Magento在admin中将自定义输入字段添加到客户帐户窗体

Magento 重写核心模型资源集合

Magento:如何将小部件放入布局 xml?

Magento : Mage::getModel 清除数据