Изменение макета слоистой навигации
-
16-10-2019 - |
Вопрос
У меня слоистая навигация, и клиент хочет иметь <select/>
Поля вместо длинного списка ссылок.
Я думал о том, чтобы просто изменить шаблон с наблюдателем, соответствует ли имя/идентификатор фильтра.
Есть лучшие идеи или рекомендации? Альтернативы изменению шаблона, может быть, перезаписать/переписать блок или только изменить класс блока для двух фильтров?
Какое событие использовать для изменения шаблона?
У меня такая же проблема, что и здесь https://stackoverflow.com/questions/14524791/magento-enable-or-disable--module-in-code/14529629 Потому что у меня есть наблюдатель, который меняет макет вещи. Это только тема актуальна. Так что, как вы можете запустить обновления, может быть хорошей идеей?
Решение
ОК, вещи, которые вам нужно сделать: 1. Переопределите блок «Каталог/слой_view», чтобы установить свой собственный шаблон. Я положил свой слоистый на оги в зоне заголовка как часть макета 1 колонны
<layout>
<catalog_category_layered>
<reference name="header">
<block type="catalog/layer_view" name="mylayered" template="mymodule/catalog/layer/view.phtml"/>
</reference>
</catalog_category_layered>
</layout>
В этом файле шаблона вам необходимо указать переоборудованный шаблон для ваших отдельных элементов.
<?php if($this->canShowBlock()): ?>
<div class="block block-layered-nav">
<div class="block-title">
<strong><span><?php echo $this->__('Shop By') ?></span></strong>
</div>
<div class="block-content">
<?php echo $this->getStateHtml() ?>
<?php if ($this->getLayer()->getState()->getFilters()): ?>
<div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
<?php endif; ?>
<?php if($this->canShowOptions()): ?>
<p class="block-subtitle"><?php echo $this->__('Shopping Options') ?></p>
<dl id="narrow-by-list">
<?php $_filters = $this->getFilters() ?>
<?php foreach ($_filters as $_filter): ?>
<?php /* !!! HERE !!! */ ?>
<?php if(some_condition == true){ $_filter->setTemplate('path/to/your/new/filter.phtml'); } ?>
<?php if($_filter->getItemsCount()): ?>
<dt><?php echo $this->__($_filter->getName()) ?></dt>
<dd><?php echo $_filter->getHtml() ?></dd>
<?php endif; ?>
<?php endforeach; ?>
</dl>
<script type="text/javascript">decorateDataList('narrow-by-list')</script>
<?php endif; ?>
</div>
</div>
<?php endif; ?>
Наконец, вам нужно создать выпадающий фильтр. Phtml. Это должно быть прямо. Это плохо отформатировано, так как у меня проблемы с этим редактором, но общая идея здесь. Также понадобится какой -то JavaScript.
<ol>
<li><select>
<?php foreach ($this->getItems() as $_item): ?>
<option value="<?php echo $this->urlEscape($_item->getUrl()); ?>">
<?php if ($_item->getCount() > 0): ?>
<a href="<?php echo $this->urlEscape($_item->getUrl()) ?>"><?php echo $_item->getLabel() ?></a>
<?php else: echo $_item->getLabel() ?>
<?php endif; ?>
<?php if ($this->shouldDisplayProductCount()): ?>
(<?php echo $_item->getCount() ?>)
<?php endif; ?>
</option>
<?php endforeach ?>
</select></li>
</ol>
Другие советы
Вы можете использовать core_block_abstract_prepare_layout_after
событие на Mage_Catalog_Block_Layer_View
блокировать, чтобы изменить шаблон вашего конкретного фильтра атрибутов.
Это может быть что -то вроде этого:
public function yourObserver($observer)
{
$block = $observer->getBlock();
if ($block instanceof Mage_Catalog_Block_Layer_View) {
$block->getChild($yourAttributeCodeGoesHere . '_filter')
->setTemplate('your/template.phtml');
}
}
Резюме:
Каждый блок фильтра для детей имеет псевдоним в многослойном навигационном блоке как [attribute_code]_filter
, и все они созданы в _prepareLayout()
метод, чтобы вы могли легко изменить его шаблон на core_block_abstract_prepare_layout_after
мероприятие.
Также вы можете проверить в своем наблюдателе, что текущая тема такая же, как и ожидается, по телефону:
$design = Mage::getSingleton('core/design_package')
$design->getPackageName(); // Returns current design package
$design->getTheme('layout'); // Returns current design layout
С уважением, Иван