Zmiana układu nawigacji warstwowej

14

Mam nawigację warstwową, a klient chce mieć <select/>pola zamiast długiej listy linków.

Myślałem o zmianie szablonu za pomocą obserwatora, jeśli nazwa / identyfikator filtru pasuje.

Jakieś lepsze pomysły lub rekomendacje? Alternatywy dla zmiany szablonu, może zastąpić / przepisać blok lub zmienić tylko klasę bloku dla dwóch filtrów?

Jakiego zdarzenia użyć do zmiany szablonu?

Mam wtedy taki sam problem jak tutaj /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629, ponieważ mam obserwatora, który zmienia układ. Jest to tylko istotny temat. Więc sprawdzanie motywu przed uruchomieniem aktualizacji może być dobrym pomysłem?

Fabian Blechschmidt
źródło
„Klient chce mieć pola zamiast długiej listy linków” Nie mam pojęcia, co przez to rozumiesz.
Rick Kuipers
cholera, stackexchange zjadł mój <select>
Fabian Blechschmidt
1
Powiedziałbym, że po prostu nadpisz catalog/layer/filter.phtmlszablon i zmień to, czego potrzebujesz, będzie on również dostosowany do tematu. Jedyne, z czym musisz sobie poradzić, to wybrany bit filtrów. Domyślam się, że chcesz pokazać wszystkie wybrane filtry, <select>które mogą wymagać dodania niektórych funkcji Blokowania, ponieważ po wybraniu filtra inne opcje znikają.
Rick Kuipers
nie, klient chce mieć kategorie i „podkategorie” (atrybuty) jako pola wyboru, wszystko inne z polami wyboru (praca do zrobienia) i dodatkowo filtrować według oceny :-) Ale wtedy zaimplementuję wszystko w szablonie.
Fabian Blechschmidt
1
Ten komentarz jest dla mnie notatką. Mam na to odpowiedź, ale rozmawiam przez telefon. Uwielbiam pracować w warstwowym Nav. Rozszerzyłem go, aby obsługiwał wybieranie wielu pól w poprzednim projekcie (pomyśl pola wyboru)
Tim Reynolds

Odpowiedzi:

6

Ok, rzeczy, które musisz zrobić: 1. Zastąp blok „katalog / przegląd_warstwy”, aby ustawić własny szablon. Umieściłem nawigację warstwową w obszarze nagłówka jako część układu 1 kolumny

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

W tym pliku szablonu musisz określić przesłonięty szablon dla poszczególnych elementów.

<?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; ?>

Na koniec musisz utworzyć rozwijany filter.phtml. To powinno być proste. Jest to źle sformatowane, ponieważ mam problemy z tym edytorem, ale ogólna idea jest tutaj. Potrzebne będą również niektóre 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>
Tim Reynolds
źródło
po co zawracać sobie głowę przepisywaniem układu? Dlaczego nie skopiować szablonu podstawowego do folderu motywu witryn? Czy brakuje mi czegoś tutaj (trochę zmęczonego, nie
spałam
@dedmeet congratz na twojej córce i mam to samo pytanie. Wystarczyłoby zastąpienie szablonu kompozycji.
Rick Kuipers
@Tim: Mój post mobilny chyba połknął [at] Tima, więc właśnie dlatego Tim otrzymał powiadomienie.
ProxiBlue
@dedmeet Kiedy komentujesz, oryginalny plakat postu zawsze zostanie powiadomiony, nawet jeśli go nie wspomnisz :)
mpaepper
Przepraszamy, tak, przepisywanie szablonu działałoby. Wspomniałem, że przeniosłem nawigację warstwową na środek strony poniżej menu. To nie miało znaczenia dla odpowiedzi, więc powinienem ją pominąć.
Tim Reynolds,
10

Możesz użyć core_block_abstract_prepare_layout_afterzdarzenia w Mage_Catalog_Block_Layer_Viewbloku, aby zmienić szablon konkretnego filtru atrybutów.

Może to być coś takiego:

public function yourObserver($observer) 
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Layer_View) {
        $block->getChild($yourAttributeCodeGoesHere . '_filter')
           ->setTemplate('your/template.phtml');
    }
}

Streszczenie:

Każdy blok filtru potomnego ma alias w warstwowym bloku nawigacyjnym jako [attribute_code]_filteri wszystkie są tworzone _prepareLayout()metodą, dzięki czemu można łatwo modyfikować jego szablon po core_block_abstract_prepare_layout_afterzdarzeniu.

Możesz także sprawdzić w swoim obserwatorze, że obecny motyw jest taki sam, jak oczekiwany, dzwoniąc:

$design = Mage::getSingleton('core/design_package')
$design->getPackageName(); // Returns current design package
$design->getTheme('layout'); // Returns current design layout

Z poważaniem, Ivan

Ivan Chepurnyi
źródło
Jeśli blok filtru potomnego otrzymuje przypisany attribute_code_filteralias, dlaczego nie możesz po prostu ustawić szablonu w układzie xml?
pspahn
1
@pspahn Ponieważ nie można uzyskać do niego dostępu przez alias poprzez układ. Jeśli sprawdzisz wynik getNameInLayout(), zobaczysz, że każdy z tych bloków ma unikalną nazwę: ANNONYMOUS_30, ANNONYMOUS_23 itd. Więc nie możesz na nim polegać.
Ivan Chepurnyi