Cambiar el diseño de la navegación en capas

14

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

Pensé en cambiar la plantilla con un observador si el nombre / id del filtro coincide.

¿Alguna mejor idea o recomendación? ¿Alternativas para cambiar la plantilla, tal vez sobrescribir / reescribir el bloque o solo cambiar la clase de bloque para los dos filtros?

¿Qué evento usar para cambiar la plantilla?

Entonces tengo el mismo problema que aquí /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 porque tengo un observador que cambia las cosas de diseño. Este es solo un tema relevante. Entonces, ¿revisar el tema antes de ejecutar las actualizaciones podría ser una buena idea?

Fabian Blechschmidt
fuente
"el cliente quiere tener campos en lugar de una larga lista de enlaces" No tengo idea de qué quiere decir con esto.
Rick Kuipers
maldición, stackexchange se comió mi <select>
Fabian Blechschmidt
1
Yo diría que simplemente sobrescriba la catalog/layer/filter.phtmlplantilla y cambie lo que necesita, también será un tema específico. Lo único con lo que tiene que lidiar es con el bit de filtros seleccionados. Supongo que desea mostrar todos los filtros seleccionados en el <select>que podría requerir agregar algunas funciones de Bloque, porque una vez que se selecciona un filtro, las otras opciones desaparecen.
Rick Kuipers
no, el cliente quiere tener las categorías y "subcategorías" (atributo) como cuadros de selección, todo lo demás con casillas de verificación (trabajo por hacer) y además filtrar por calificación :-) Pero luego implementaré todo en la plantilla.
Fabian Blechschmidt
1
Este comentario sirve como una nota para mí. Tengo una respuesta para esto, pero estoy en mi teléfono. Me encanta trabajar en el Nav en capas. Me extendí para apoyar la selección de varios campos en un proyecto anterior (creo casillas de verificación)
Tim Reynolds

Respuestas:

6

Ok, cosas que debes hacer: 1. Anular el bloque 'catalog / layer_view' para configurar tu propia plantilla. Puse mi navegador en capas en el área del encabezado como parte de un diseño de 1 columna

<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 ese archivo de plantilla, debe especificar la plantilla anulada para 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; ?>

Finalmente, debe crear el menú desplegable filter.phtml. Eso debería ser sencillo. Esto está mal formateado ya que tengo problemas con este editor, pero la idea general está aquí. También se necesitará 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
fuente
¿Por qué molestarse en reescribir el diseño? ¿Por qué no simplemente copiar la plantilla base a la carpeta de temas del sitio? ¿Me estoy perdiendo algo aquí (un poco cansado, he estado despierto toda la noche con mi hija recién nacida enferma)
ProxiBlue
@dedmeet felicidades por tu hija y tengo la misma pregunta. Un reemplazo simple de plantilla de tema sería suficiente.
Rick Kuipers
@Tim: Mi publicación móvil parecía haberse tragado a [a] Tim, así que esto solo para que Tim reciba una notificación.
ProxiBlue
@dedmeet Cuando comentas, el póster original de la publicación siempre será notificado, incluso si no lo mencionas :)
mpaepper
Lo siento, sí, la reescritura de plantilla funcionaría. Mencioné que moví mi navegador en capas al centro de la página debajo del menú. Eso fue irrelevante para la respuesta, así que debería haberlo dejado fuera.
Tim Reynolds
10

Puede usar core_block_abstract_prepare_layout_afterevento en Mage_Catalog_Block_Layer_Viewbloque para 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 secundario tiene un alias en el bloque de navegación en capas como [attribute_code]_filter, y todos ellos creados en el _prepareLayout()método para que pueda modificar fácilmente su plantilla en core_block_abstract_prepare_layout_aftercaso de evento.

También puede verificar dentro de su observador que el tema actual es el mismo que el esperado llamando:

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

Sinceramente, Ivan

Ivan Chepurnyi
fuente
Si al bloque de filtro secundario se le asigna un attribute_code_filteralias, ¿por qué no puede simplemente configurar la plantilla en un diseño xml?
pspahn
1
@pspahn Porque no se puede acceder por alias a través del diseño. Si verifica el resultado getNameInLayout(), verá que cada uno de estos bloques tiene un nombre único como ANNONYMOUS_30, ANNONYMOUS_23, etc. Por lo tanto, no puede confiar en él.
Ivan Chepurnyi