Вопрос

У меня слоистая навигация, и клиент хочет иметь <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

С уважением, Иван

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top