なぜこれがとても難しいのかわかりません。これを正しく理解すれば、目標を迅速に達成できるはずです...しかし、喜びはありません。
だから-私は私の最初のテーマを構築していて、それでもレイアウトに頭を悩ませています...
私は特にCatalog Product View
ページに取り組んでおり、このページを右の列のレイアウトから左の列のレイアウトに変換しています。ブロックを右から左に移動したいだけです。
デフォルトのcatalog.xmlでは、次のようproduct_list_related
に定義されています。
</catalog_product_view>
//...
<reference name="right">
<block type="catalog/product_list_related" name="catalog.product.related" before="-" template="catalog/product/list/related.phtml"/>
</reference>
</catalog_product_view>
私のlocal.xmlでは、単にこのブロックを移動しようとしています。
<layout>
// bunch other page directives
<catalog_product_view>
<reference name="root">
<action method="setTemplate"><template>page/2columns-left.phtml</template></action>
</reference>
<reference name="right">
<action method="unsetChild"><name>catalog.product.related</name></action>
</reference>
<reference name="left">
<action method="insert"><blockName>catalog.product.related</blockName></action>
// note that that "catalog.leftnav" gets inserted as expected
<block type="catalog/layer_view" name="catalog.leftnav" after="-" template="catalog/layer/view.phtml"/>
</reference>
</catalog_product_view>
</layout>
前述のようcatalog.leftnav
に、挿入は期待どおりに機能するため、他のすべてが正しく設定されていると想定しています。テンプレートやその他のディレクティブを変更しない場合、ターゲットブロックは期待どおりにレンダリングされます。これにより、ブロックが適切に設定解除されて挿入されたら、ブロックをレンダリングする必要があることがわかります。
これは私を狂わせています...しかし、Magentoで他に何が新しいのか。
乾杯 -
b [] x
UPDATE
オーバーライドを機能させることができないためlocal.xml
、変更されたにフォールバックしているだけですcatalog.xml
。私はかなり賢い人です...これを機能させることができないのではないかと心配しています(そして、どのような場合でも、magentoは黙って失敗します)-しかし、この愚かな問題をいじくり回すのにもう時間を無駄にすることはできません。
次に進みます。
UPDATE, again.
しばらく時間をかけて、今はmagentoで作業し、その複雑さに慣れてきました。local.xmlを正しく機能させる必要があるため、今日この問題に戻りました。
何が悪かったのかは本当にわかりませんが、この一連のディレクティブはようやく機能しました。
<reference name="right">
<action method="unsetChild">
<alias>catalog.product.related</alias>
</action>
</reference>
<reference name="left">
<action method="insert">
<block>catalog.product.related</block>
</action>
</reference>
これを扱っている他の人のために私が注意する重要なポイント:
Layout xmlディレクティブは、magentoクラス内で使用可能なメソッドを呼び出します。この場合、Page.xmlsの「Left」ブロックはタイプがで、そこからメソッドとMage_Core_Block_Text
を継承します。Mage_Core_Block_Abstract
unsetChild
insert
からMage_Core_Block_Abstract
:
/**
* Unset child block
*
* @param string $alias
* @return Mage_Core_Block_Abstract
*/
public function unsetChild($alias)
{
if (isset($this->_children[$alias])) {
unset($this->_children[$alias]);
}
if (!empty($this->_sortedChildren)) {
$key = array_search($alias, $this->_sortedChildren);
if ($key !== false) {
unset($this->_sortedChildren[$key]);
}
}
return $this;
}
と
/**
* Insert child block
*
* @param Mage_Core_Block_Abstract|string $block
* @param string $siblingName
* @param boolean $after
* @param string $alias
* @return object $this
*/
public function insert($block, $siblingName = '', $after = false, $alias = '')
{
if (is_string($block)) {
$block = $this->getLayout()->getBlock($block);
}
if (!$block) {
/*
* if we don't have block - don't throw exception because
* block can simply removed using layout method remove
*/
//Mage::throwException(Mage::helper('core')->__('Invalid block name to set child %s: %s', $alias, $block));
return $this;
}
if ($block->getIsAnonymous()) {
$this->setChild('', $block);
$name = $block->getNameInLayout();
} elseif ('' != $alias) {
$this->setChild($alias, $block);
$name = $block->getNameInLayout();
} else {
$name = $block->getNameInLayout();
$this->setChild($name, $block);
}
if ($siblingName === '') {
if ($after) {
array_push($this->_sortedChildren, $name);
} else {
array_unshift($this->_sortedChildren, $name);
}
} else {
$key = array_search($siblingName, $this->_sortedChildren);
if (false !== $key) {
if ($after) {
$key++;
}
array_splice($this->_sortedChildren, $key, 0, $name);
} else {
if ($after) {
array_push($this->_sortedChildren, $name);
} else {
array_unshift($this->_sortedChildren, $name);
}
}
$this->_sortInstructions[$name] = array($siblingName, (bool)$after, false !== $key);
}
return $this;
}
ローカルxmlパラメーターは重要です。したがって、名前ではなく(具体的には)、順番に次のようになります。
<reference name="left">
<action method="insert">
<block>catalog.product.related</block>
<siblingName>catalog.leftnav</siblingName>
<after>1</after>
<alias>catalog_product_related</alias>
</action>
</reference>
最終的に、これによりlocal.xmlはシステムを操作するための非常に強力な方法になりますが、local.xmlとmagentoシステムに慣れていない場合は、数週間または数か月の作業に備えて、実際に頭を悩ませてください。
乾杯
さらに別のアップデート
移動したいブロックが削除されたという問題に何度か遭遇しました。レイアウトから削除されたブロックは永久に削除されるため、これは問題です。
ただし、Alan Stormの非常に便利なUnremoveプラグインを使用すると、実行した内容を元に戻すことができます。
<checkout_onepage_index>
<x-unremove name="left" />
<reference name="right">
<action method="unsetChild">
<alias>checkout.progress.wrapper</alias>
</action>
</reference>
<reference name="left">
<action method="insert">
<block>checkout.progress.wrapper</block>
</action>
</reference>
</checkout_onepage_index>
レイアウトオブジェクトを監視し、後で参照できる削除されたブロックのリストを作成することで、この偉業を管理します。
良い!