1

Magentoストアには、基本的に特定の「注目」属性が設定された製品コレクションである「注目」ページがあります。このためにCMSページを使用し、カスタムブロッククラスを備えたカスタムモジュールを使用して製品を表示します。これはうまくいきます。現在、これらのページにMagentoの階層型ナビゲーションを追加する作業を行っています。これは、主にレイヤードナビゲーションがcurrent_categoryに依存しているという事実のために、私が思っていたよりも難しいことがわかりました。独自のレイヤードナビゲーションブロックと独自のLayerクラスを作成することで、この問題を回避することができました。これで動作しましたが、ブロックコンテンツがレンダリングされる順序に問題が発生しました。

Magentoがレイアウトをレンダリングするとき、最初に左側の構造ブロックをレンダリングしているように見えます。これには、カテゴリツリーと階層化されたナビゲーションブロックが含まれています。残念ながら、カスタマイズしたレイヤードナビゲーションブロックは、コンテンツブロック内の製品リストに依存しています。階層化されたナビゲーションブロックがレンダリングされるとき、フィルタリングされた製品コレクションはまだ作成されていません。これにより、フィルタリング可能な属性のリストが空になるため、階層化されたナビゲーションブロックにはカテゴリリストのみが表示されます。

レイアウトXMLファイルのブロック定義を移動してコンテンツブロックの作成後に発生するようにすることで、この問題を回避することができました。これは機能しますが、私が望んでいたエレガントなソリューションではありません。すべての「注目の」ページのすべての共有ブロックを処理するカスタムレイアウトハンドルを作成しました。すべての「注目の」ページについて、私はを呼び出します<update handle="featured_default">最初は、階層化されたナビゲーションブロック定義をfeatured_defaultハンドル内に配置しようとしましたが、これにより上記の問題が発生しました(つまり、製品コレクションの準備ができていませんでした)。製品リストブロック定義の後に配置することにより、正しくレンダリングされますしかし、これは私がすべてのすべてのレイアウト更新にそれを入れなければならないことを意味します注目のページ。私が言ったように、私が望んでいたエレガントな解決策ではありません。

だから、これは私の質問に私をもたらします...あなたがまだ私と一緒にいるのなら。ブロックのレンダリング順序を制御することは可能ですか?ブロック定義のbefore属性とafter属性を使用してブロックの配置を制御できることは知っていますが、それは親ブロック内のブロックの位置のみを制御します。私がやりたいのは、コンテンツブロックがレンダリングされた後に、レイヤー化されたナビゲーションブロックの出力をレンダリングすることです。これは可能ですか?

フォローアップの質問は次のようになります:私はこれを正しくやっていますか?私が達成しようとしていることを考えると、この問題に対するより良い解決策はありますか?レイヤードナビゲーションブロックをCMSページに配置することについてオンラインで見つけた情報のほとんどは、レイヤードナビゲーションブロックで使用するカテゴリIDを設定する方法を示していますが、それは私が持っているものではありません。製品はさまざまなカテゴリに分類できます。共通しているのは、特定の属性値がtrueに設定されていることだけです。

長い質問でごめんなさい。これが理にかなっていることを願っています。私のコードを見る必要がある場合は、私に知らせてください。必要なものは何でも投稿します。

ありがとう!

4

1 に答える 1

0

Magento では、before="child.block.name"およびafter="child.block.name"属性を使用してブロックの順序を定義します。これらの属性が指定されていない場合、ブロックは Magento が読み取る順序でレンダリングされます。

例えば

カート サイドバー ブロックを左から右に移動します。

<reference name="left">
    <action method="unsetChild"><alias>cart_sidebar</alias></action>
</reference>
<reference name="right">
    <action method="insert"><blockName>cart_sidebar</blockName></action>
</reference>
  • blockName: ブロックの一意の名前です。
  • siblingName: 挿入対象のブロックに既に存在する、ブロック固有の名前です。
  • after: ブロック位置のブール識別子です。1 に等しい場合、ブロックは siblingName の後に追加されるか、siblingName が空の場合は子リストの最後に追加されます
  • alias: ブロックのエイリアスです。空の場合は blockName が使用されます。
于 2016-02-08T08:38:07.110 に答える