子ブロックをproduct_listに追加できません


7

商品リストにブロックを追加しようとしています:

<?xml version="1.0"?>
<layout version="0.1.0">
    <catalog_category_view translate="label">
        <reference name="product_list">
            <remove name="product_list_toolbar"/>
            <block type="core/template" name="helloworld" as="helloworld" template="helloworld.phtml"/>
        </reference>
        <reference name="footer">
            <block type="core/template" name="helloworld" as="helloworld" template="helloworld.phtml"/>
        </reference>
    </catalog_category_view>
</layout>

ではカタログ/製品/ list.phtml私はこれを持っています:

<?php Zend_Debug::dump($this->getSortedChildren()); ?>
<?php echo $this->getChildHtml('helloworld'); ?>

ではページ/ HTML / footer.phtml:私はこれを持っています

<?php Zend_Debug::dump($this->getSortedChildren()); ?>
<?php echo $this->getChildHtml('helloworld'); ?>

並べ替えた子のリストからが削除されているかどうかを確認することで<remove name="product_list_toolbar"/>、参照がproduct_list正しく機能するかどうかをテストできるように追加しただけであることに注意してくださいproduct_list_toolbarそうです。

だから私が今持っているのは製品リストとフッターの同じコードであり、それはフッターでのみ機能します。いくつかの掘削を行った後、私は見つけることができません任意のブロックのインスタンスが追加されているproduct_list他のよりproduct_list_toolbar。それで、このブロックについて、子供を追加することが機能しない何かがありますか?


実際、これは良い質問です。コミュニティがこの質問を閉じようとしている理由がわかりません。これは確かに意見に基づく質問ではありません。この種の質問に感謝する必要があります。
Rajeev K Tomy

回答:


8

ここでの問題は、レイアウトXMLでブロックが指定される順序です。

catalog_category_view技術的には正しいハンドルですが、そのハンドルにはproduct_listブロックが存在しません(まだ!)。

product_listブロックだけで作成されますcatalog_category_defaultcatalog_category_layeredハンドル。(そして、これらのハンドルは、XMLの後で指定されますcatalog_category_view。)

つまり、すべてのレイアウトXMLがマージされると、への参照product_listは実行されません。その時点ではまだ存在しないためです。

ソリューションは、両方のあなたのブロックを追加することであるcatalog_category_defaultcatalog_category_layered、OR、独自のカスタムハンドルを作成し、そのハンドルにあなたのブロックを追加し、使用<update>中に、あなたのハンドルを含めるように指示をcatalog_category_defaultしてcatalog_category_layered

うまくいったことを願っています。


のあるページcatalog_category_layeredも持っcatalog_category_defaultているようですので、必要だったようですcatalog_category_default。それ以外は、これは適切であり、なぜこれを行っているのかを理解するのに役立ちました。ありがとう。
タイラーV.

@TylerV。あなたのコメントは間違っています。詳細については、私の回答を参照してください。
Rajeev K Tomy

3

実際catalog_category_view、すべてのカテゴリビューページで処理され、レイアウトハンドルを正しく選択しました。ただし、ここでの問題は、レイアウトハンドルがmagentoで処理される順序に注意する必要があることです。

このコンテキストで、つまりカテゴリ製品リスト表示ページの場合、レイアウトハンドルはこの順序で処理されます(

  0 => 'default'
  1 =  'STORE_default' 
  2 => 'THEME_frontend_rwd_default'
  3 => 'catalog_category_view'
  4 => 'catalog_category_layered' 
  5 => 'CATEGORY_4'
  6 => 'customer_logged_out'
  7 => 'SHORTCUT_popup'
  8 => 'SHORTCUT_uk_popup' 
  9 => 'product_list' 

これは、magentoがloadLayoutアクションを実行するときに、最初にdefaultレイアウトハンドルを検討し、レイアウト更新ファイルを通じてこのレイアウトハンドルで定義されたブロックを含めることを意味します。その後、処理さSTORE_defaultれます。この手段のcatalog_category_viewレイアウトハンドルが前に処理していますcatalog_category_defaultcatalog_category_layeredこれは、ここで注意すべき重要な点です。

Magentoのは、定義されたproduct_listレイアウトハンドルの内側にブロックをcatalog_category_defaultしてcatalog_category_layeredcatalog_category_viewはこれら2つのレイアウトハンドルの直前で処理を行うため、定義で参照されているproduct_listブロックはまったく奇妙であり、したがって、magentoはその中のコンテンツを単に無視します。

コメントについて

あなたはそれを誤解していると思います。レイアウトに基づいて2種類のカテゴリがあります。彼らです

  1. デフォルトのカテゴリ
  2. 階層化されたカテゴリ

Magentoはlayout update handle、これら2つのタイプのカテゴリーに異なるものを追加します。以下のためdefault categoriesにのみ処理されますcatalog_category_default。の場合layered cateogries、magentoプロセスのみcatalog_category_layered。どちらの場合も、magentoは確実に処理さaction layout handle catalog_category_viewcategory specific layout handle CATEGORY_{ID}ます。つまり、簡単に言うaction layout handleと、すべてのカテゴリビューページで処理されます。(カテゴリ固有のレイアウトハンドルは、カテゴリごとに異なります。)ここで証明を参照してください

ファイル: app/code/core/Mage/Catalog/Model/Category.php

public function getLayoutUpdateHandle()
{
    $layout = 'catalog_category_';
    if ($this->getIsAnchor()) {
        $layout .= 'layered';
    }
    else {
        $layout .= 'default';
    }
    return $layout;
}

参照catalog_category_layeredは、カテゴリのisAnchorプロパティがに設定されている場合にのみレイアウト更新に含まれますyes(管理者側でこれを行っています)。それ以外の場合は処理されますcatalog_category_default

要するにレイアウトハンドルがMagentoの中で処理を取得される順序は、この場合の悪役とヒーローです。


あなたは正しいですしcatalog_category_layeredcatalog_category_default一緒に現れません。私catalog_category_layered_nochildrenはそれらを見て、混乱させました。奇妙なことに、catalog_category_layered_nochildren階層化されていないカテゴリでも追加されます。
タイラーV.

catalog_category_layered_nochildren表示カテゴリに子カテゴリがない場合にのみ考慮されます。いくつかの子カテゴリーを保持しているカテゴリーの場合、この特定のレイアウトハンドルは処理されません。それは論理的に聞こえますか?
Rajeev K Tomy 2015

0

ハンドルの下に参照と更新を配置しましたcatalog_category_viewが、product_listブロックはハンドルの下に定義されていcatalog_category_defaultます。これはカスケードし、動作するはずです。なぜそうしないのかを誰かに教えてください。しかし、このアップデートに使用されるハンドルを変更すると、問題が修正されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.