【问题标题】:How to do proper nesting in a Magento theme?如何在 Magento 主题中正确嵌套?
【发布时间】:2012-08-27 12:25:37
【问题描述】:

我在两个目录中复制了默认的 Magento 主题并将其重命名。 经过大量调整后,我陷入了困境。

我有一个包含基本布局的 3columns.phtml 文件:

  • 顶部 (top.phtml)
  • 标题 (header.phtml)
  • main (main.phtml)
  • 页脚 (footer.phtml)

与 main.phtml:

  • left.phtml
  • middle.phtml
  • right.phtml

现在,当我在 3columns.phtml 中使用 getChildHtml() 函数分别引用这些块时,一切都很顺利。现在,将它们放入 main.phtml 文件后,它似乎不再起作用了。 main.phtml 中的任何内容都不会显示(甚至没有简单的 html 标签)。认为这可能与我查看 page.xml 的 xml 布局文件有关,但发现有些事情是由 catalog.xml 处理的

我现在在 page.xml 中有这些块声明:

  • 顶部(未设置模板=)
  • 标头(未设置模板=)
  • 主(模板=“页面/html/main.phtml”)
    • 左 (template="page/html/left.phtml")
    • 中间(template="page/html/middle.phtml")
    • topmenu (template="page/html/topmenu.phtml")
    • 面包屑(没有模板=设置)
    • 右(模板=“page/html/right.phtml”)
  • 页脚 (template="page/html/footer.phtml")

尽管 top 和 header 没有设置模板,但它们的 html 在前端显示得很好。页脚也显示得很好。 显示了左侧的输出,但没有被 main 的输出包裹。 对的输出相同。 Middle 的输出显示,但其中的任何 getChildHtml 调用都没有。

关于发生了什么的任何想法? 另外,page.xml 和 catalog.xml 与模板有什么关系?每个对 getChildHtml 的调用都必须在 page.xml 文件中吗?页面和目录有什么区别。

page.xml部分:http://www.snipplr.com/view/66919/part-of-pagexml-not-working/

catalog.xml部分:http://www.snipplr.com/view/66920/default-part-of-catalogxml-not-working/

3columns.phtml:http://www.snipplr.com/view/66921/main-theme-file-3columnsphtml/

【问题讨论】:

    标签: templates magento nested


    【解决方案1】:

    有关详细说明,您可以阅读 Alanstorm 的书“No Frills Magento Layout”。 我给你“简要”的解释,让你有点开悟。

    在我们的控制器中,当我们调用$this->loadLayout();时,它会自动“调用”<default>句柄。

    稍后,所有布局xml中的所有句柄都会被合并。

    假设您的 page.xml 中有 <default>,那么您的 catalog.xml 中也有 <default>。 调用$this->loadLayout()后,page.xml和catalog.xml中的<default>会被合并。

    这就是他们之间的关系。

    我们可以说<default> 是一切的主体。它是主要结构。通常从中“引用”的任何其他布局。

    假设你想在主体(内容)中添加一些东西,我们会调用:

    <reference name="content">
        <block type="core/template" name="testing" template="some/test/template.phtml"></block>
    </reference>
    

    那些标签的意思是:将&lt;block type="core/template" name="testing" template="some/test/template.phtml"&gt;&lt;/block&gt;放在带有名称内容的块下。

    如果你看到带有名字内容的block的定义:

    <block type="core/text_list" name="content" as="content" translate="label">
        <label>Main Content Area</label>
    </block>
    

    你可以看到类型是core/text_list。这种类型的块将呈现它下面的每个孩子,它不需要模板。 如您所见,template="blabla/blibli.phtml" 没有定义。

    具有模板的块类型是core/block_template。在这种类型的块中,如果你想渲染它的孩子,你必须“有意识地”调用echo $this-&gt;getChildHtml('mykid')

    你明白了吗?

    这就是您的定义不正确的原因:&lt;block type="core/text_list" name="main" as="main" translate="label" template="page/html/main.phtml"&gt;

    core/text_list 不需要也没有模板。你可以想象如果“内容”是core/block_template:每次你要在“内容”下创建一个孩子,你必须“有意识地”调用echo $this-&gt;getChildHtml('mykid')。假设您有 100 个孩子,您需要致电 echo $this-&gt;getChildHtml('mykid1')echo $this-&gt;getChildHtml('mykid2')、...、echo $this-&gt;getChildHtml('mykid100')

    然后让我们看看你的catalog.xml:

    <default>
        <!-- Mage_Catalog -->
        <block type="core/template" name="top" template="page/html/top.phtml"></block>
    
        <block type="core/template" name="header" template="page/html/header.phtml"></block>
    
        <block type="core/template" name="main" template="page/html/main.phtml">
            <block type="core/template" name="left" template="page/html/left.phtml"></block>
            <block type="core/template" name="middle" template="page/html/middle.phtml"></block>
            <block type="core/template" name="right" template="page/html/right.phtml"></block>
        </block>
    
        <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>
    
        <block type="catalog/product_price_template" name="catalog_product_price_template" />
    </default>
    

    我不明白您将从这个catalog.xml 中获得什么。没有参考:&lt;block type="core/template" name="top" template="page/html/top.phtml"&gt;&lt;/block&gt;&lt;block type="core/template" name="header" template="page/html/header.phtml"&gt;&lt;/block&gt;等。

    如果您要添加一些布局(子布局),您需要从现有布局中“引用”。假设您要在名为“main”的块下添加子项,并将代码放入您的 catalog.xml:

    那么你的catalog.xml会是这样的:

    <default>
        <reference name="main">
            <block type="core/template" name="i" template="my/new/template1.phtml"></block>
            <block type="core/template" name="dont" template="my/new/template2.phtml"></block>
            <block type="core/template" name="know" template="my/new/template3.phtml"></block>
        </reference>
    </default>
    

    现在取决于名称为“main”的块的定义。

    如果您的名称为“main”的块是:

    <block type="core/text_list" name="main" as="main" translate="label">
    ...
    </block>
    

    然后这些块(名称为“i”、“dont”、“know”的块)将被自动调用(渲染)。

    如果您的名称为“main”的块是:

    <block type="core/template" name="main" as="main" translate="label" template="page/html/main.phtml">
    ...
    </block>
    

    那么你需要在你的page/html/main.phtml中调用这个:

    echo $this->getChildHtml('i');
    echo $this->getChildHtml('dont');
    echo $this->getChildHtml('know');
    

    这就是我所能解释的,因为它在你的布局中几乎是不正确的,如果你明白了,你可以通过阅读我的解释来解决它。

    小贴士:

    • 要查看加载了哪些句柄,请将此代码放入控制器中的 $this-&gt;loadLayout(); 下:

      $layout = Mage::getSingleton('core/layout');
      $updates = $layout->getUpdate();
      $handles = $updates->getHandles();
      var_dump($handles);
      
    • 要查看从加载布局生成的 xml,请将此代码放在控制器中的 $this-&gt;loadLayout(); 下:

      $layout = Mage::getSingleton('core/layout');
      $updates = $layout->getUpdate();
      $xml = $updates->asString();
      var_dump($xml);
      

    也许你需要echo "&lt;pre&gt;" / wrap using htmlentities / Mage::log 来保持整洁。

    【讨论】:

      【解决方案2】:

      这里有一些可能的解释。

      由于 left、middle 和 right 是 'main' 的子级,您需要调用 getChildChildHtml(注意双子级)。

      由于 'main' 是 3columns 内的子项(嵌套),它不被视为自己的页面类型(即 1 列),更好的解决方案似乎是编辑 3columns.phtml 文件以包含您想要的块。

      当调用 getChildHtml 时,传递给它的参数是 xml 中的 name='' 属性(例如,如果需要调用 'right' 块,那么我们需要在 xml 中找到 name 属性 - 在这个如果它是“正确的”并将其用于参数)。

      左侧、页脚等块正在显示,因为它们已经在 3columns.phtml 文件中被调用。

      还要仔细检查'main'的模板文件是否在正确的位置。

      我希望这些是一些有用的指针

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 1970-01-01
        • 2014-08-15
        • 2017-09-21
        相关资源
        最近更新 更多