Ändern des Layouts der geschichteten Navigation

14

Ich habe eine geschichtete Navigation, und der Kunde möchte <select/>Felder anstelle einer langen Liste von Links haben.

Ich dachte nur daran, die Vorlage mit einem Beobachter zu ändern, wenn der Name / die ID des Filters übereinstimmt.

Bessere Ideen oder Empfehlungen? Alternativen zum Ändern der Vorlage, vielleicht den Block überschreiben / neu schreiben oder nur die Blockklasse für die beiden Filter ändern?

Welches Ereignis zum Ändern der Vorlage verwenden?

Ich habe dann das gleiche Problem wie hier /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629, weil ich einen Beobachter habe, der Layout-Dinge ändert. Dies ist nur themenrelevant. Es ist also eine gute Idee, das Thema vor dem Ausführen der Updates zu überprüfen.

Fabian Blechschmidt
quelle
"Kunde möchte Felder anstelle einer langen Liste von Links haben" Ich habe keine Ahnung, was Sie damit meinen.
Rick Kuipers
verdammt, stackexchange aß meine <select>
Fabian Blechschmidt
1
Ich würde sagen, überschreibe einfach die catalog/layer/filter.phtmlVorlage und ändere, was du brauchst. Es wird auch themenspezifisch sein. Das einzige, was Sie zu tun haben, ist das ausgewählte Filterbit. Ich nehme an, Sie möchten alle in ausgewählten Filter anzeigen, für die <select>möglicherweise einige Blockfunktionen hinzugefügt werden müssen, da nach Auswahl eines Filters die anderen Optionen nicht mehr angezeigt werden.
Rick Kuipers
nein, der kunde möchte die kategorien und "unterkategorien" (attribut) als auswahlfelder haben, alles andere mit ankreuzfeldern (work to do) und zusätzlich nach bewertung filtern :-) aber dann implementiere ich alles in die vorlage.
Fabian Blechschmidt
1
Dieser Kommentar dient als Notiz für mich. Ich habe eine Antwort darauf, bin aber auf meinem Handy. Lieben Sie es, in der geschichteten Navigation zu arbeiten. Ich habe es erweitert, um die Auswahl mehrerer Felder in einem früheren Projekt zu unterstützen (siehe Ankreuzfelder)
Tim Reynolds

Antworten:

6

Ok, Dinge, die Sie tun müssen: 1. Überschreiben Sie den Block 'catalog / layer_view', um Ihre eigene Vorlage festzulegen. Ich habe meine geschichtete Navigation als Teil eines 1-Spalten-Layouts in den Kopfbereich eingefügt

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

In dieser Vorlagendatei müssen Sie die überschriebene Vorlage für Ihre einzelnen Elemente angeben.

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

Zum Schluss müssen Sie noch die Dropdown-Datei filter.phtml erstellen. Das sollte einfach sein. Dies ist schlecht formatiert, da ich Probleme mit diesem Editor habe, aber die allgemeine Idee ist hier. Etwas Javascript wird ebenfalls benötigt.

<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
quelle
Warum sollte man sich die Mühe machen, das Layout neu zu schreiben? Warum kopieren Sie nicht einfach die Basisvorlage in den Site-Themenordner? Vermisse ich hier etwas (ein bisschen müde, war die ganze Nacht mit meiner kranken neugeborenen Tochter
wach
@dedmeet congratz auf deine Tochter und ich haben die gleiche Frage. Ein einfaches Überschreiben der Themenvorlage würde ausreichen.
Rick Kuipers
@Tim: Mein Handypost schien den [at] Tim verschluckt zu haben, also das nur, damit Tim eine Benachrichtigung bekommt.
ProxiBlue
@dedmeet Wenn Sie einen Kommentar abgeben, wird das Original-Poster des Beitrags immer benachrichtigt, auch wenn Sie ihn nicht erwähnen :)
mpaepper
Entschuldigung, ja, das Umschreiben der Vorlage würde funktionieren. Ich erwähnte, dass ich meine geschichtete Navigation in die Mitte der Seite unter dem Menü verschoben habe. Das war für die Antwort irrelevant, also hätte ich es weglassen sollen.
Tim Reynolds
10

Sie können core_block_abstract_prepare_layout_afterevent on Mage_Catalog_Block_Layer_Viewblock verwenden, um die Vorlage Ihres bestimmten Attributfilters zu ändern.

Es könnte so etwas sein:

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

Zusammenfassung:

Jeder untergeordnete Filterblock verfügt über einen Alias ​​im geschichteten Navigationsblock als [attribute_code]_filterund alle werden in einer _prepareLayout()Methode erstellt, sodass Sie die Vorlage bei einem core_block_abstract_prepare_layout_afterEreignis problemlos ändern können .

Sie können auch in Ihrem Beobachter überprüfen, ob das aktuelle Thema dem erwarteten entspricht, indem Sie Folgendes aufrufen:

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

Mit freundlichen Grüßen Ivan

Ivan Chepurnyi
quelle
Wenn dem untergeordneten Filterblock ein attribute_code_filterAlias zugewiesen wird , warum können Sie die Vorlage nicht einfach in einer Layout-XML festlegen?
Pspahn
1
@pspahn Weil Sie über das Layout nicht per Alias ​​darauf zugreifen können. Wenn Sie die Ausgabe von überprüfen, werden getNameInLayout()Sie feststellen, dass jeder dieser Blöcke einen eindeutigen Namen wie ANNONYMOUS_30, ANNONYMOUS_23 usw. hat. Sie können sich also nicht darauf verlassen.
Ivan Chepurnyi