Удалить блок из группы
Как удалить блок из группы?
В catalog.xml есть (около строки 210) такие действия, как:
<block type="catalog/product_view_description" name="product.description" as="description" template="catalog/product/view/description.phtml">
<action method="addToParentGroup"><group>detailed_info</group></action>
</block>
Таким образом, product.info
получает группу под названием detailed_info
с блоками product.description
и product.attributes
.
Насколько я знаю, я могу удалить целый блок с помощью
<action method="unsetChild"><name>NAME</name></action>
Но это не работает для групп.
В app/code/core/Mage/Core/Block/Abstract.php
есть реализации для этих действий. Такие методы, как addToParentGroup()
и addToChildGroup()
, а также setChild()
и unsetChild()
. Но нет никаких методы, такие как removeFromParentGroup()
или removeFromChildGroup()
.
Как удалить блок из такой группы?
Идеи:
- Скопируйте весь catalog.xml к моей теме и удалите из нее эту строку.
- Сделайте перезапись для
app/code/core/Mage/Core/Block/Abstract.php
в собственном модуле, чтобы добавить методы для удаления блоков из группы
Первая идея - это наименьшее, что я хотел бы сделать, и я бы не хотел делать вторую.
Существует ли какой-либо стандартный способ magento для этого?
2 answers
Вы можете сделать следующее в своем local.xml
:
<reference name="product.info">
<action method="unsetChild">
<alias>description</alias>
</action>
<action method="insert">
<block>product.description</block>
</action>
</reference>
Или для атрибутов продукта соответственно:
<reference name="product.info">
<action method="unsetChild">
<alias>additional</alias>
</action>
<action method="insert">
<block>product.attributes</block>
</action>
</reference>
Когда вы это сделаете, блок не будет отображаться в группе, но вы сможете отобразить его в другом месте.
Я нашел обходной путь для этой проблемы (который мне действительно был нужен из-за особых представлений продукта).
Оригинальный способ отображения группы в Magento:
<?php foreach ($this->getChildGroup('detailed_info', 'getChildHtml') as $alias => $html):?>
<div class="box-collateral <?php echo "box-{$alias}"?>">
<?php if ($title = $this->getChildData($alias, 'title')):?>
<h2><?php echo $this->escapeHtml($title); ?></h2>
<?php endif;?>
<?php echo $html; ?>
</div>
<?php endforeach;?>
Добавив проверку к псевдониму дочернего блока, вывод можно опустить:
<?php foreach ($this->getChildGroup('detailed_info', 'getChildHtml') as $alias => $html):?>
<?php if($alias != 'description'): ?>
<div class="box-collateral <?php echo "box-{$alias}"?>">
<?php if ($title = $this->getChildData($alias, 'title')):?>
<h2><?php echo $this->escapeHtml($title); ?></h2>
<?php endif;?>
<?php echo $html; ?>
</div>
<?php endif; ?>
<?php endforeach;?>
Этот обходной путь полезен, если вам нужно использовать блок description
обычным способом в другой точке. Если нет, будьте уверены, чтобы проверить решение от Саймона.