Modifica del layout della navigazione a più livelli


14

Ho una navigazione a più livelli e il cliente desidera avere <select/>campi anziché un lungo elenco di collegamenti.

Ho pensato di cambiare il modello con un osservatore se il nome / ID del filtro corrispondono.

Qualche idea o raccomandazione migliore? Alternative alla modifica del modello, forse sovrascrivere / riscrivere il blocco o modificare solo la classe di blocco per i due filtri?

Quale evento utilizzare per modificare il modello?

Ho quindi lo stesso problema qui /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 perché ho un osservatore che cambia le cose del layout. Questo è solo un tema rilevante. Quindi chechking il tema prima di eseguire gli aggiornamenti potrebbe essere una buona idea?


"il cliente vuole avere dei campi anziché un lungo elenco di collegamenti" Non ho idea di cosa tu voglia dire con questo.
Rick Kuipers,

accidenti, stackexchange ha mangiato il mio <select>
Fabian Blechschmidt,

1
Direi solo di sovrascrivere il catalog/layer/filter.phtmlmodello e cambiare ciò di cui hai bisogno, sarà anche specifico del tema. L'unica cosa che devi affrontare è il bit di filtri selezionato. Immagino che tu voglia mostrare tutto il filtro selezionato nel <select>che potrebbe richiedere l'aggiunta di alcune funzioni di blocco, perché una volta selezionato un filtro le altre opzioni scompaiono.
Rick Kuipers,

no, il cliente desidera avere le categorie e le "sottocategorie" (attributo) come caselle di selezione, tutto il resto con caselle di controllo (lavoro da fare) e inoltre filtrare per valutazione :-) Ma poi implementerò tutto nel modello.
Fabian Blechschmidt,

1
Questo commento funge da nota per me. Ho una risposta per questo, ma sono sul mio telefono. Adoro lavorare nel Nav a strati. L'ho esteso per supportare la selezione di più campi in un precedente progetto (pensa alle caselle di controllo)
Tim Reynolds,

Risposte:


6

Ok, cose che devi fare: 1. Sostituisci il blocco 'catalog / layer_view' per impostare il tuo modello. Ho messo il mio nav a strati nell'area dell'intestazione come parte di un layout a 1 colonna

<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 quel file modello è necessario specificare il modello sovrascritto per i singoli elementi.

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

Infine, è necessario creare il menu a discesa filter.phtml. Questo dovrebbe essere semplice. Questo è mal formattato perché ho problemi con questo editor, ma l'idea generale è qui. Sarà necessario anche un po 'di 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>

perché preoccuparsi di riscrivere il layout? Perché non copiare semplicemente il modello di base nella cartella del tema dei siti? Mi sto perdendo qualcosa qui (un po 'stanco, sono stato sveglio tutta la notte con mia figlia malata)
ProxiBlue

@dedmeet congratz su tua figlia e ho la stessa domanda. Farebbe una semplice sostituzione del modello del tema.
Rick Kuipers,

@Tim: il mio post mobile sembra aver ingoiato Tim [at], quindi Tim ha ricevuto una notifica.
ProxiBlue,

@dedmeet Quando commenti, il poster originale del post verrà sempre avvisato anche se non lo menzioni :)
mpaepper

Spiacenti, sì, la riscrittura del modello funzionerebbe. Ho detto che ho spostato il mio nav a strati al centro della pagina sotto il menu. Era irrilevante per la risposta, quindi avrei dovuto lasciarla fuori.
Tim Reynolds,

10

È possibile utilizzare l' core_block_abstract_prepare_layout_afterevento su Mage_Catalog_Block_Layer_Viewblocco per modificare il modello del filtro di attributo specifico.

Potrebbe essere qualcosa del genere:

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

Sommario:

Ogni blocco filtro figlio ha un alias nel blocco di navigazione a strati come [attribute_code]_filtere tutti sono stati creati con il _prepareLayout()metodo in modo da poter modificare facilmente il suo modello in core_block_abstract_prepare_layout_aftercaso di evento.

Inoltre puoi verificare nel tuo osservatore che il tema attuale sia lo stesso di quello atteso chiamando:

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

Cordiali saluti, Ivan


Se al blocco filtro figlio viene assegnato un attribute_code_filteralias, perché non puoi semplicemente impostare il modello in un layout xml?
pspahn,

1
@pspahn Perché non puoi accedervi con lo pseudonimo di layout. Se controlli l'output di getNameInLayout()vedrai, che ciascuno di questi blocchi ha un nome univoco come ANNONYMOUS_30, ANNONYMOUS_23, ecc. Quindi non puoi fare affidamento su di esso.
Ivan Chepurnyi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.