Зміна компонування шаруватої навігації


14

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

Я думав про те, щоб просто змінити шаблон на спостерігача, якщо ім’я / ідентифікатор фільтра збігається.

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

Яку подію використовувати для зміни шаблону?

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


"Клієнт хоче мати поля замість довгого списку посилань" Я не маю поняття, що ви маєте на увазі під цим.
Рік Куйперс

чорт забирай, stackexchange з'їв мій <вибір>
Фабіан Блешшмідт

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

ні, замовник хоче мати категорії та "підкатегорії" (атрибут) як поля вибору, все інше з прапорцями (робота над цим) та додатково фільтрувати за рейтингом :-) Але тоді я впроваджу все в шаблон.
Фабіан Блешшмідт

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

Відповіді:


6

Добре, що вам потрібно зробити: 1. Замініть блок "каталог / шар_вигляд", щоб встановити власний шаблон. Я розмістив свій шаруватий навичок в області заголовка як частина макета 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>

навіщо турбуватися виконувати перезапис макета? Чому б просто не скопіювати базовий шаблон у папку тем сайтів? Чи щось мені тут не вистачає (трохи втомився, була всю ніч зі своєю хворою новонародженою дочкою)
ProxiBlue

@dedmeet congratz щодо вашої дочки, і у мене те саме питання. Зміна простого шаблону теми.
Рік Куйперс

@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.