Déplacer la barre d'outils des catégories hors du produit / de la liste

8

J'essaie de déplacer la barre d'outils qui affiche les options de tri et le pager de la liste des produits afin que je puisse les regrouper avec le fil d'Ariane et le nom de la catégorie.

J'ai trouvé ce site qui fonctionnait pour les anciennes versions de Magento mais il ne fonctionne pas pour CE 1.7 ou EE 1.12.

Dans les commentaires, quelqu'un avait du code pour le déplacer à la racine, mais cela ne fonctionne pas non plus. C'était le code pour le déplacer dans la catégorie / vue qui aiderait:

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

S'il existe un autre moyen de regrouper le fil d'Ariane, le nom de la catégorie et la barre d'outils ensemble, faites le moi savoir.

Kel
la source

Réponses:

13

Catalog/product_listet catalog/product_list_toolbarsont tellement câblés les uns avec les autres que vous êtes obligé de les utiliser ensemble. Si vous souhaitez uniquement afficher la barre d'outils, vous devrez créer un modèle de liste de produits (presque) vide.

Disons que vous voulez que la barre d'outils soit affichée dans le bloc de fil d'Ariane, mais cela devrait vraiment fonctionner avec n'importe quel bloc.

Mettez la mise à jour suivante quelque part dans votre layout/local.xml(vous pourriez aussi en avoir besoin pour 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>

Créez un modèle de liste de produits à une ligne dans template/catalog/product/list/toolbar_only.phtml:

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

Vous pouvez ensuite insérer le nouveau bloc où vous le souhaitez dans votre modèle de fil d'Ariane:

template/page/html/breadcrumbs.phtml:

<?php echo $this->getChildHtml('toolbar_only'); ?>
Jan Tomka
la source
C'est aussi une très bonne méthode - je suis entièrement d'accord pour que les listes de produits et les barres d'outils restent ensemble à tout prix. Je serais intéressé à entendre votre avis sur la méthode javascript que j'ai postée plus tôt.
jharrison.au
@Jan Tomka excellente réponse! J'avais du mal à essayer de pousser un bloc entre la barre d'outils et les produits eux-mêmes, et votre solution l'a rendu possible. Merci!
Ronen Ness du
Le problème avec cette réponse est qu'elle finit par déclencher à nouveau l'observateur de nuances configurable car le catalog/product_listbloc existe deux fois et la catalog_block_product_list_collectionméthode est envoyée deux fois (ce que l'observateur observe). Cela augmente considérablement le temps de chargement des pages de catégorie.
Robbie Averill
Vrai que. La réponse originale a été écrite avant que les échantillons configurables ne soient apparus (pas que j'ai vérifié les exécutions de plusieurs observateurs à ce moment). Il peut être préférable d'utiliser un type de bloc distinct étendu à partir de catalog / product_list, avec la répartition des événements supprimée de _beforeToHtml ().
Jan Tomka
4

Après avoir essayé de déplacer le bloc de la barre d'outils à travers la mise en page XML et les hacks de modèle, j'ai décidé qu'il était beaucoup plus facile de le déplacer via javascript. Je pense que cette façon vous donne plus de contrôle sans risque de rupture de fonctionnalité.

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

Notez que cette méthode déplace uniquement la première barre d'outils et non celle du bas à l'aide du sélecteur spécifique .category-products > .toolbar

Un peu plus de raisonnement pour expliquer pourquoi cette méthode est la meilleure:

  1. La liste des produits et la barre d'outils sont fortement imbriquées, se référencant dans leurs blocs, il est donc logique de les garder ensemble en termes de code - elles vont de pair
  2. Moins de code et moins de modifications à la logique de blocage signifie moins de probabilité que des bogues apparaissent
  3. En utilisant javascript, vous pouvez facilement le déplacer n'importe où sur la page
  4. En utilisant la mise en page XML, vous pouvez uniquement inclure le javascript sur les pages avec une liste de produits
  5. Le déplacement via javascript est extensible et à l'épreuve du temps - si la logique derrière la liste de produits ou la barre d'outils bloque les changements dans les nouvelles versions de Magento, cette méthode fonctionnera toujours.
jharrison.au
la source
J'irais totalement dans cette méthode, mais j'essaie de rendre le site aussi peu javascript que possible, même si je sais que Magento dépend de javascript.
kel
4

Le code de LuFFy n'est pas loin

Pour copier le bloc dans d'autres parties de votre site, vous pouvez obtenir l'objet de mise en page principal, puis simplement obtenir le bloc de contenu par son nom

      $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
la source
Où l'utiliser?
Pratik
@PratikCJoshi J'ai mis ce code directement dans mon fichier catalogue / layer / view.phtml et cela a fonctionné parfaitement, vous devriez donc pouvoir le placer dans n'importe quel fichier de modèle où vous voulez que la barre d'outils apparaisse.
gregdev
0

Essayez le code:

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
la source
C'était le même code dans les commentaires et cela me donne cette erreur:Call to undefined function getParentBlock()
kel
Oh...!! Idem que j'ai trouvé sur un autre site.
LuFFy