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

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 и т. Д. Таким образом, вы не можете полагаться на него.
Иван Чепурный