0

2つのdirにデフォルトのMagentoテーマをコピーして、名前を変更しました。たくさんの調整をした後、私は立ち往生するところまで来ました。

基本的なレイアウトが存在する3columns.phtmlファイルがあります。

  • top(top.phtml)
  • ヘッダー(header.phtml)
  • main(main.phtml)
  • フッター(footer.phtml)

main.phtmlを使用:

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

getChildHtml()関数を使用して3columns.phtmlでこれらのブロックを個別に参照すると、すべてが桃色になりました。現在、それらをmain.phtmlファイルに配置した後は、機能しなくなったようです。main.phtmlのコンテンツは表示されません(simpel htmlタグも表示されません)。page.xmlを調べたが、いくつかのことがcatalog.xmlによって処理されていることがわかったxmlレイアウトファイルに関係している可能性があると考えました。

これで、page.xmlに次のブロック宣言があります。

  • top(テンプレートなし=設定)
  • ヘッダー(テンプレートなし=設定)
  • main(template = "page / html / main.phtml")
    • 左(template = "page / html / left.phtml")
    • ミドル(template = "page / html / middle.phtml")
    • topmenu(template = "page / html / topmenu.phtml")
    • ブレッドクラム(テンプレートなし=セット)
    • 右(template = "page / html / right.phtml")
  • フッター(template = "page / html / footer.phtml")

また、トップとヘッダーにはテンプレートが設定されていませんが、HTMLはフロントエンドに正常に表示されます。フッターも正常に表示されます。左の出力が表示されますが、メインの出力によってラップされていません。右の出力は同じです。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/

4

2 に答える 2

4

詳細な説明については、Alanstormの本「NoFrillsMagentoLayout」を読むことができます。少し啓発できるように、「簡単な」説明をします。

コントローラでは、を呼び出すと、ハンドル$this->loadLayout();が自動的に「呼び出され」ます。<default>

後で、すべてのレイアウトxmlのすべてのハンドルがマージされます。

たとえば<default>、page.xmlにあると<default>すると、catalog.xmlにもあります。$this->loadLayout()page.xml<default>とcatalog.xmlからの呼び出しの後、マージされます。

それがそれらの間の関係です。

私たち<default>はすべての主なものであると言うことができます。主な構造です。他のレイアウトは通常、そこから「参照」します。

本体(コンテンツ)に何かを追加したいとしましょう。

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

それらのタグは次のことを意味します:<block type="core/template" name="testing" template="some/test/template.phtml"></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->getChildHtml('mykid')

わかりますか?

そのため、定義が正しくありません<block type="core/text_list" name="main" as="main" translate="label" template="page/html/main.phtml">

core/text_listテンプレートは必要ありません。「コンテンツ」がcore/block_template:であるかどうかを想像することができます。「コンテンツ」の下に子を作成するたびに、「意識的に」呼び出す必要がありますecho $this->getChildHtml('mykid')。100人の子供がいるとしましょう。 、、、 ...、echo $this->getChildHtml('mykid1')に電話する必要があります。echo $this->getChildHtml('mykid2')echo $this->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からあなたが達成しようとしていることはわかりません。<block type="core/template" name="top" template="page/html/top.phtml"></block>、、などの参照はありません<block type="core/template" name="header" template="page/html/header.phtml"></block>

レイアウト(子)を追加する場合は、既存のレイアウトから「参照」する必要があります。「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->loadLayout();次の場所に配置します。

    $layout = Mage::getSingleton('core/layout');
    $updates = $layout->getUpdate();
    $handles = $updates->getHandles();
    var_dump($handles);
    
  • ロードレイアウトから生成されたxmlを確認するには、このコードをコントローラーの次の場所に配置します$this->loadLayout();

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

多分あなたはecho "<pre>" / wrap using htmlentities / Mage::logきちんとした見た目の目的のために必要になるでしょう。

于 2012-08-27T14:13:25.333 に答える
1

ここにいくつかの可能な説明があります。

左、中央、右は「main」の子であるため、getChildChildHtmlを呼び出す必要があります(二重の子に注意してください)。

'main'は3columns内の子(ネスト)であるため、それ自体のページタイプ(つまり1列)とは見なされないため、3columns.phtmlファイルを編集して必要なブロックを作成することをお勧めします。

getChildHtmlを呼び出す場合、渡されるパラメーターはxmlのname =''属性です(たとえば、'right'ブロックを呼び出す必要がある場合は、xmlでname属性を見つける必要があります-この場合は' right'そしてそれをパラメータに使用します)。

左側のフッターなどのブロックは、3columns.phtmlファイルですでに呼び出されているため表示されています。

また、「main」へのテンプレートファイルが正しい場所にあることを再確認してください。

これらがいくつかの有用な指針であったことを願っています

于 2012-08-27T13:56:47.487 に答える