Navegación personalizada en capas sin atributos. ¿Es esta la única manera de hacerlo?

8

Hoy he estado activando una opción de navegación en capas que no se basa en un atributo. Es para clasificaciones, por lo que la parte delantera puede mostrar bonitas estrellas brillantes.

Para hacer esto tengo:

  1. Creado un módulo
  2. Reescrito catalog_block_layer_view

    <blocks>        
      <catalog>
        <rewrite>
          <layer_view>Bob_Catalog_Block_Layer_View</layer_view>
         </rewrite>                
       </catalog>
    </blocks>
    
  3. Creó una clase llamada Bob_Catalog_Block_Layer_View que extiende Mage_Catalog_Block_Layer_View

  4. Creó _initBlocks (), getFilters () y _prepareLayout () para anular los métodos de las clases principales. Todos ellos llaman a la clase padre en algún momento y luego anteponen o agregan datos adicionales a lo que se devuelve.
  5. Cree un bloque de filtro Bob_Catalog_Block_Layer_Filter_Rating que extiende Mage_Catalog_Block_Layer_Filter_Abstract con un constructor que establece el filterModelName y llama a su padre y luego establece una plantilla personalizada, ya que parece que Mage_Catalog_Block_Layer_Filter_Abstract tiene el nombre de la plantilla en el constructor.
  6. Cree un modelo Bob_Catalog_Model_Layer_Filter_Rating que extienda Mage_Catalog_Model_Layer_Filter_Abstract e implemente apply (), getName (), _getItemsData ().

Todo esto funciona bien. Las bonitas estrellas brillantes se muestran en la navegación en capas.

Tengo el presentimiento de que me falta algo porque cuando se trata de una plantilla de estado de capa, tuve que poner un condicional para recoger el filtro de calificación personalizado y alterar el diseño. Además, algunas de las cosas que necesito hacer (clonar la colección de productos para que el evento de carga no arruine la colección cuenta con la paginación) me hacen sentir que he estado nadando cuesta arriba.

Entonces, la pregunta es si alguno de ustedes tiene mejores sugerencias (o tal vez un guiño de publicación de blog ) sobre cómo construir un filtro de navegación en capas personalizado sin respaldo de atributos.

Gracias por leer,

Si

Si Griffiths
fuente
Tengo que hacerlo los próximos días y pensé hacerlo así.
Fabian Blechschmidt

Respuestas:

5

Hay otra forma de hacerlo, podría agregar un atributo normal a su producto, que sería la calificación. Luego use un observador (no sé cómo se forma esta calificación) para actualizar el atributo del producto. O, si un observador no es una opción, tal vez use un cronjob que actualice ese atributo para cada producto cada x minutos dependiendo de qué tan pesado sea el script.

De esta manera, no hay reescritura ni alteración de Magento, todos los módulos de navegación seguirán funcionando y es más fácil de mantener.

Por supuesto, la pregunta es, ¿es esta una opción para usted? ¿De dónde vienen las calificaciones?

EDITAR Tendría que diseñar las estrellas usando javascript o verificar el nombre del atributo en la plantilla.

Rick Kuipers
fuente
Creo que esto cubre casi todas las opciones. La sugerencia del observador es una idea interesante.
Si Griffiths
Si recuerdo, el estilo de estrella estándar viene como un ancho CSS basado en una calificación promedio de 5. 1/5 = 20% de ancho, 4.3 / 5 = 86% de ancho, etc. Dudo que deba cambiar ... pero actualizar el valor del atributo a través de un script cron es bastante inteligente. +1
pspahn
2

Excavé el código y no encontré ningún evento. Sin agregar atributos adicionales no hay nada que hacer sin<rewrite>

Tienes que agregar tu bloque \Mage_Catalog_Block_Layer_View::_prepareLayout()antes del apply()(si no, puedes usarlo core_block_abstract_prepare_layout_after.

Y debe agregarlo \Mage_Catalog_Block_Layer_View::getFilters()y no hay ningún evento también.

Fabian Blechschmidt
fuente
Esto es exactamente lo que encontré. También parece que no hay forma de evitar la plantilla state.phtml. Parece que se requiere una rama condicional para alterar cualquiera de los resultados.
Si Griffiths
Reescribí catalog/layer_filter_category, catalog/layer_filter_attributey catalog_resource/layer_filter_attributepara mostrar las opciones todo el tiempo sin usar el state.phtmlen este momento no hay forma de eliminar los filtros: - /
Fabian Blechschmidt
Mi trabajo tenía un if ($ _filter-> getName () === 'lo que sea') {} Para moverse mostrando html de estado personalizado. No es una gran solución, pero no obstante es una solución. PD. Espero que estés bien desde la última vez que nos vimos en MDP.
Si Griffiths