Изменение макета многоуровневой навигации


14

У меня многоуровневая навигация, и клиент хочет иметь <select/>поля вместо длинного списка ссылок.

Я думал о том, чтобы просто поменять шаблон с наблюдателем, если имя / идентификатор фильтра совпадают.

Есть лучшие идеи или рекомендации? Альтернативы изменению шаблона, может быть, перезаписать / переписать блок или изменить класс блока только для двух фильтров?

Какое событие использовать для изменения шаблона?

У меня тогда та же проблема, что и здесь /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629, потому что у меня есть наблюдатель, который меняет макет. Это только тема актуальна. Так что проверка темы перед запуском обновлений может быть хорошей идеей?


«Клиент хочет иметь поля вместо длинного списка ссылок» Я понятия не имею, что вы подразумеваете под этим.
Рик Кейперс

Черт, обмен стека съел мой <select>
Фабиан Блехшмидт

1
Я бы сказал, просто переписать catalog/layer/filter.phtmlшаблон и изменить то, что вам нужно, это будет также и тема. Единственное, с чем вам придется иметь дело, это биты выбранных фильтров. Я предполагаю, что вы хотите показать все фильтры, выбранные в, <select>которые могут потребовать добавления некоторых функций блока, потому что после выбора фильтра другие опции исчезают.
Рик Кейперс

нет, клиент хочет иметь категории и «подкатегории» (атрибут) в качестве полей выбора, все остальное с флажками (работа, которую нужно выполнить) и дополнительно фильтровать по рейтингу :-) Но тогда я реализую все в шаблоне.
Фабиан Блехшмидт

1
Этот комментарий служит запиской для меня. У меня есть ответ на это, но я нахожусь на моем телефоне. Люблю работать в многослойной навигации. Я расширил его, чтобы поддержать выбор нескольких полей в предыдущем проекте (думаю, флажки)
Тим Рейнольдс

Ответы:


6

Хорошо, что нужно сделать: 1. Переопределить блок 'catalog / layer_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; ?>

Наконец, вам нужно создать выпадающий файл filter.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>

зачем делать переписывание макета? Почему бы просто не скопировать базовый шаблон в папку темы сайтов? Я что-то здесь
упускаю

@dedmeet поздравляем твою дочь и у меня такой же вопрос. Простое переопределение шаблона темы подойдет.
Рик Кейперс

@Tim: Кажется, мой мобильный пост проглотил [на] Тима, так что это просто, чтобы Тим получил уведомление.
ProxiBlue

@dedmeet Когда вы комментируете, оригинальный постер сообщения всегда будет уведомлен, даже если вы не упомянули его :)
mpaepper

Извините, да, перезапись шаблона будет работать. Я упомянул, что переместил свою многослойную навигацию в центр страницы под меню. Это не имело отношения к ответу, поэтому я должен был пропустить его.
Тим Рейнольдс

10

Вы можете использовать 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

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


Если дочерний блок фильтра получает назначенный attribute_code_filterпсевдоним, почему вы не можете просто установить шаблон в макете XML?
pspahn

1
@pspahn Потому что вы не можете получить к нему доступ по псевдониму через макет. Если вы проверите выходные данные, getNameInLayout()то увидите, что каждый из этих блоков имеет уникальное имя как ANNONYMOUS_30, ANNONYMOUS_23 и т. Д. Таким образом, вы не можете полагаться на него.
Иван Чепурный
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.