Mover a barra de ferramentas da categoria para fora do produto / lista

8

Estou tentando mover a barra de ferramentas que mostra as opções de classificação e o pager para fora da lista de produtos, para que eu possa agrupá-lo com as migalhas de pão e o nome da categoria.

Eu encontrei este site que trabalhou para versões mais antigas do Magento, mas ele não está funcionando para CE 1.7 ou EE 1.12.

Nos comentários, alguém tinha algum código para movê-lo para a raiz, mas isso também não funciona. Este era o código para movê-lo para categoria / exibição, o que ajudaria:

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

Se houver outra maneira de agrupar as trilhas de navegação, o nome da categoria e a barra de ferramentas serão informados.

kel
fonte

Respostas:

13

Catalog/product_liste catalog/product_list_toolbarestão tão conectados uns aos outros que ficam presos em usá-los juntos. Se você quiser exibir apenas a barra de ferramentas, precisará criar um modelo (quase) vazio de product_list.

Digamos que você queira que a barra de ferramentas seja exibida no bloco de trilhas de navegação, mas isso deve funcionar realmente com qualquer bloco.

Coloque a seguinte atualização em algum lugar da sua layout/local.xml(você também pode precisar de uma 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>

Crie um modelo de lista de produtos de uma linha em template/catalog/product/list/toolbar_only.phtml:

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

Em seguida, você pode inserir o novo bloco onde desejar no seu modelo de trilhas de navegação:

template/page/html/breadcrumbs.phtml:

<?php echo $this->getChildHtml('toolbar_only'); ?>
Jan Tomka
fonte
Também é um método muito bom - concordo totalmente em manter as listas de produtos e as barras de ferramentas juntas a todo custo. Gostaria de saber sua opinião sobre o método javascript que publiquei anteriormente.
precisa saber é o seguinte
@ Jan Tomka ótima resposta! Eu estava lutando para tentar empurrar um bloco entre a barra de ferramentas e os próprios produtos, e sua solução tornou isso possível. obrigado!
Ronen Ness
O problema com esta resposta é que ele acaba fazendo com que o observador de amostras configurável seja executado novamente porque o catalog/product_listbloco existe duas vezes e o catalog_block_product_list_collectionmétodo é despachado duas vezes (o que o observador está observando). Isso aumenta drasticamente o tempo de carregamento da página da categoria.
Robbie Averill
Verdade isso. A resposta original foi escrita antes das amostras configuráveis ​​(não que eu tenha verificado várias execuções de observadores naquele momento). Talvez seja melhor usar um tipo de bloco separado estendido de catalog / product_list, com o envio de evento removido de _beforeToHtml ().
Jan Tomka
4

Depois de tentar mover o bloco da barra de ferramentas através de XML de layout e hacks de modelo, decidi que era muito mais fácil movê-lo via javascript. Eu acho que dessa maneira lhe dá mais controle sem nenhum risco de quebrar a funcionalidade.

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

Observe que esse método move apenas a primeira barra de ferramentas e não a inferior usando o seletor específico .category-products > .toolbar

Um pouco mais de raciocínio sobre por que esse método é melhor:

  1. A lista de produtos e a barra de ferramentas estão fortemente interligadas, referenciando-se em seus blocos, por isso faz sentido mantê-las juntas em termos de código - elas andam de mãos dadas
  2. Menos código e menos alterações para bloquear a lógica significa menos probabilidade de erros aparecerem
  3. Usando javascript, você pode movê-lo facilmente para qualquer lugar da página
  4. Usando o XML do layout, você pode incluir apenas o javascript nas páginas com uma lista de produtos
  5. A movimentação via javascript é extensível e à prova de futuro - se a lógica por trás da lista de produtos ou da barra de ferramentas bloquear as alterações nas novas versões do Magento, esse método ainda funcionará.
jharrison.au
fonte
Eu usaria esse método totalmente, mas estou tentando fazer com que o site use o mínimo de javascript possível, mesmo sabendo que o Magento é dependente de javascript.
kel
4

O código de LuFFy não está longe

Para copiar o bloco para outras partes do site, você pode obter o objeto de layout principal e, em seguida, obter o bloco de conteúdo por nome

      $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();
Judder
fonte
Onde usar isso?
Pratik
@PratikCJoshi Coloquei esse código diretamente no meu arquivo catalog / layer / view.phtml e funcionou perfeitamente, portanto, você poderá colocá-lo em qualquer arquivo de modelo em que deseja que a barra de ferramentas apareça.
gregdev
0

Experimente o 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();
LuFFy
fonte
Esse foi o mesmo código nos comentários e me dá esse erro:Call to undefined function getParentBlock()
kel
Oh ... !! O mesmo que encontrei em outro site.
Luffy