Pregunta

Tengo una navegación por capas, y el cliente quiere tener campos <select/> en lugar de una larga lista de enlaces.

pensé en tan solo cambiando la plantilla con un observador si el nombre / ID de las coincidencias de filtro.

Cualquier mejores ideas o recomendaciones? Alternativas a cambiar la plantilla, tal vez de sobrescribir / reescribir el bloque o sólo cambiar la clase de bloque para los dos filtros?

¿Qué evento de usar para cambiar la plantilla?

Tengo entonces el mismo problema que aquí https: / /stackoverflow.com/questions/14524791/magento-enable-or-disable-a-module-in-code/14529629 porque tengo un observador que cambia las cosas de diseño. Esto sólo es relevante el tema. Así chechking el tema antes de ejecutar los cambios podría ser una buena idea?

¿Fue útil?

Solución

Ok, las cosas que tiene que hacer: 1. Reemplazar el 'layer_view Catálogo /' bloque para establecer su propia plantilla. Pongo mi navegador en capas en el área de encabezado como parte de una columna de 1 diseño

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

En este archivo de plantilla debe especificar la plantilla reemplazado por sus elementos individuales.

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

Por último, es necesario crear el menú desplegable filter.phtml. Eso debería ser sencillo. Esto está mal formateado como estoy teniendo problemas con este editor, pero la idea general es aquí. Algunos Javascript será necesaria también.

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

Otros consejos

Puede utilizar el evento core_block_abstract_prepare_layout_after en el bloque Mage_Catalog_Block_Layer_View cambiar la plantilla de su filtro de atributo particular.

Podría ser algo como esto:

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

Resumen:

Cada bloque de filtro niño tiene alias en bloque de navegación en capas como [attribute_code]_filter, y todos ellos creados en el método _prepareLayout() para que pueda modificar fácilmente su plantilla en caso core_block_abstract_prepare_layout_after.

También puede comprobar dentro de su observador que tema actual es el mismo que uno espera llamando a:

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

Atentamente, Ivan

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top