不知道为什么这如此困难。如果我理解正确的话,我应该能够迅速实现我的目标......但没有快乐。
所以 - 我正在构建我的第一个主题,并且仍然在考虑布局......
我专门在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>
我会为其他处理此问题的人记下一个关键点:
布局 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 成为一种非常强大的系统操作方法,但如果您不熟悉它和 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>
它通过观察布局对象来管理这一壮举,并构建一个已删除块的列表,以后可以引用该列表。
好的!