Mover la barra de herramientas de categoría de producto / lista


8

Estoy tratando de mover la barra de herramientas que muestra las opciones de clasificación y el localizador fuera de la lista de productos para poder agruparlo con las migas de pan y el nombre de la categoría.

Me encontré con este sitio que trabajó para las versiones anteriores de Magento, pero no está funcionando para CE 1.7 o 1.12 EE.

En los comentarios, alguien tenía un código para moverlo a la raíz, pero eso tampoco funciona. Este fue el código para moverlo a categoría / vista que ayudaría:

$toolbar = $this->getChild('product_list')->getToolbarBlock();
$toolbar->setCollection($this->getChild('product_list')->getLoadedProductCollection());
echo $toolbar->toHtml();

Si hay otra forma de agrupar las migas de pan, el nombre de la categoría y la barra de herramientas, hágamelo saber.

Respuestas:


13

Catalog/product_listy catalog/product_list_toolbarestán tan conectados entre sí que no pueden usarlos juntos. Sin embargo, si solo desea mostrar la barra de herramientas, deberá crear una plantilla (casi) vacía de product_list.

Supongamos que desea que se muestre la barra de herramientas en el bloque de migas de pan, pero esto realmente debería funcionar con cualquier bloque.

Coloque la siguiente actualización en algún lugar de su layout/local.xml(es posible que también necesite una para catalog_category_default):

<catalog_category_layered>
    <reference name="breadcrumbs">
        <block type="catalog/product_list" name="toolbar_only" template="catalog/product/list/toolbar_only.phtml">
            <block type="catalog/product_list_toolbar" name="product_list_toolbar_only" template="catalog/product/list/toolbar.phtml">
                <block type="page/html_pager" name="product_list_toolbar_pager"/> 
            </block>    
            <action method="setToolbarBlockName"><name>product_list_toolbar_only</name></action>
        </block>            
    </reference>            
</catalog_category_layered>

Cree una plantilla de lista de productos de una sola línea en template/catalog/product/list/toolbar_only.phtml:

<?php echo $this->getToolbarHtml() ?>

Luego puede insertar el nuevo bloque donde quiera en su plantilla de migas de pan:

template/page/html/breadcrumbs.phtml:

<?php echo $this->getChildHtml('toolbar_only'); ?>

Este también es un método bastante bueno: estoy completamente de acuerdo en mantener juntas las listas de productos y las barras de herramientas a toda costa. Me interesaría escuchar su opinión sobre el método javascript que publiqué anteriormente.
jharrison.au

@ Jan Tomka gran respuesta! Estaba luchando por tratar de empujar un bloque entre la barra de herramientas y los productos mismos, y su solución lo hizo posible. ¡Gracias!
Ronen Ness

El problema con esta respuesta es que termina activando el observador de muestras configurables para que se ejecute nuevamente porque el catalog/product_listbloque existe dos veces, y el catalog_block_product_list_collectionmétodo se despacha dos veces (que el observador está observando). Esto aumenta drásticamente el tiempo de carga de la página de categoría.
Robbie Averill

Eso es cierto. La respuesta original se escribió antes de que aparecieran las muestras configurables (no es que verificara las ejecuciones de múltiples observadores en ese momento). Puede ser mejor usar un tipo de bloque separado extendido de catalog / product_list, con el despacho de eventos eliminado de _beforeToHtml ().
Jan Tomka

4

Después de intentar mover el bloque de la barra de herramientas a través del diseño XML y los hacks de plantillas, decidí que era mucho más fácil moverlo a través de JavaScript. Creo que de esta manera le da más control sin ningún riesgo de romper la funcionalidad.

jQuery(document).ready(function($) {
     $(".breadcrumbs").after($(".category-products > .toolbar"));
});

Tenga en cuenta que este método solo mueve la primera barra de herramientas y no la inferior usando el selector específico .category-products > .toolbar

Algunos razonamientos más sobre por qué este método es el mejor:

  1. La lista de productos y la barra de herramientas están muy entrelazadas, haciendo referencia entre sí en sus bloques, por lo que tiene sentido mantenerlas juntas en términos de código: van de la mano
  2. Menos código y menos cambios en la lógica de bloqueo significa menos probabilidad de que aparezcan errores
  3. Con JavaScript, puede moverlo fácilmente a cualquier lugar de la página
  4. Con el diseño XML solo puede incluir el JavaScript en páginas con una lista de productos
  5. Moverse a través de JavaScript es extensible y está preparado para el futuro: si la lógica detrás de la lista de productos o la barra de herramientas bloquea los cambios en las nuevas versiones de Magento, este método seguirá funcionando.

Seguiría este método por completo, pero estoy tratando de hacer que el sitio use la menor cantidad de JavaScript posible, aunque sé que Magento depende de JavaScript.
Kel

4

El código de LuFFy no está lejos

Para copiar el bloque a otras partes de su sitio, puede obtener el objeto de diseño principal y luego simplemente obtener el bloque de contenido por nombre

      $layout = Mage::app()->getLayout();
      $content = $layout->getBlock('content');
      $categoryProducts = $content->getChild('category.products');
      $productList = $categoryProducts->getChild('product_list');
      $toolbar = $productList->getToolbarBlock();
      $toolbar->setCollection($productList->getLoadedProductCollection());
      echo $toolbar->toHtml();

¿Dónde usar esto?
Pratik

@PratikCJoshi Puse este código directamente en mi archivo catalog / layer / view.phtml y funcionó perfectamente, por lo que debería poder colocarlo en cualquier archivo de plantilla donde desee que aparezca la barra de herramientas.
gregdev

0

Prueba el código:

getParentBlock();
$content = $parent->getChild(‘content’);
$categoryProducts = $content->getChild(‘category.products’);
$productList = $categoryProducts->getChild(‘product_list’);
$toolbar = $productList->getToolbarBlock();
$toolbar->setCollection($productList->getLoadedProductCollection());
echo $toolbar->toHtml();

Ese fue el mismo código en los comentarios y me da este error:Call to undefined function getParentBlock()
kel

Oh...!! Lo mismo que encontré en otro sitio.
LuFFy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.