Navigation en couches personnalisée sans attribut. Est-ce la seule façon de procéder?

8

Aujourd'hui, j'ai créé une option de navigation en couches qui n'est pas basée sur un attribut. C'est pour les cotes, donc l'avant peut montrer de belles étoiles brillantes.

Pour ce faire, j'ai:

  1. Créé un module
  2. Réécriture de catalog_block_layer_view

    <blocks>        
      <catalog>
        <rewrite>
          <layer_view>Bob_Catalog_Block_Layer_View</layer_view>
         </rewrite>                
       </catalog>
    </blocks>
    
  3. Création d'une classe appelée Bob_Catalog_Block_Layer_View qui étend Mage_Catalog_Block_Layer_View

  4. _InitBlocks (), getFilters () et _prepareLayout () créés pour remplacer les méthodes des classes parentes. Ceux-ci appellent tous la classe parent à un moment donné, puis ajoutent ou ajoutent des données supplémentaires à ce qui est retourné.
  5. Créez un bloc de filtre Bob_Catalog_Block_Layer_Filter_Rating qui étend Mage_Catalog_Block_Layer_Filter_Abstract avec un constructeur qui définit le filterModelName et appelle son parent puis définit un modèle personnalisé comme il semble que Mage_Catalog_Block_Layer_Filter_Abstract a le nom du modèle codé en dur.
  6. Créez un modèle Bob_Catalog_Model_Layer_Filter_Rating qui étend Mage_Catalog_Model_Layer_Filter_Abstract et implémente apply (), getName (), _getItemsData ().

Tout cela fonctionne bien. Les belles étoiles brillantes apparaissent dans le nav en couches.

J'ai l'impression de manquer quelque chose, car en ce qui concerne le modèle d'état de calque, j'ai dû y mettre une condition pour récupérer le filtre de notation personnalisé et modifier la mise en page. De plus, certaines des choses que je devais faire (cloner la collection de produits pour que l'événement de chargement ne gâche pas la collecte comptent sur la pagination) me donnent l'impression d'avoir nagé en haut de la colline.

Donc, la question est de savoir si l'un de vous a de meilleures suggestions (ou peut-être un clin d'œil de blog ) sur la façon de créer un filtre de navigation en couches personnalisé sans attribut?

Merci d'avoir lu,

Si

Si Griffiths
la source
Je dois le faire les jours suivants et j'ai pensé à le faire comme ça.
Fabian Blechschmidt

Réponses:

5

Il y a une autre façon de le faire, vous pouvez ajouter un attribut normal à votre produit qui serait la note. Utilisez ensuite un observateur (je ne sais pas comment cette note est formée) pour mettre à jour l'attribut du produit. Ou, si un observateur n'est pas une option, utilisez peut-être un cronjob qui met à jour cet attribut pour chaque produit toutes les x minutes en fonction de la lourdeur du script.

De cette façon, aucune réécriture et modification de Magento n'est impliquée, tous les modules de navigation continueront de fonctionner et seront plus faciles à maintenir.

Bien sûr, la question est, est-ce une option pour vous? D'où viennent les notes?

MODIFICATION Vous devez styliser les étoiles à l'aide de javascript ou vérifier le nom d'attribut dans le modèle.

Rick Kuipers
la source
Je pense que cela couvre à peu près toutes les options. La suggestion de l'observateur est une idée intéressante.
Si Griffiths
Si je me souviens bien, le style d'étoile standard est simplement une largeur CSS basée sur une note moyenne de 5. 1/5 = 20% de largeur, 4,3 / 5 = 86% de largeur, etc. Je doute que cela doive changer ... mais la mise à jour de la valeur d'attribut via un script cron est assez intelligente. +1
pspahn
2

J'ai fouillé dans le code et n'ai trouvé aucun événement. Sans ajouter d'attributs supplémentaires, il n'y a rien à faire sans<rewrite>

Vous devez ajouter votre bloc \Mage_Catalog_Block_Layer_View::_prepareLayout()avant le apply()(sinon vous pourriez utiliser core_block_abstract_prepare_layout_after.

Et vous devez l'ajouter à \Mage_Catalog_Block_Layer_View::getFilters()et il n'y a pas d'événement aussi.

Fabian Blechschmidt
la source
C'est exactement ce que j'ai trouvé. Il semble également qu'il n'y ait aucun moyen de contourner le modèle state.phtml. Il semble qu'une branche conditionnelle soit requise pour modifier n'importe quelle sortie.
Si Griffiths
J'ai réécrit catalog/layer_filter_category, catalog/layer_filter_attributeet catalog_resource/layer_filter_attributepour afficher les options tout le temps sans utiliser state.phtmlpour le moment il n'y a aucun moyen de supprimer les filtres: - /
Fabian Blechschmidt
Mon travail avait un if ($ _filter-> getName () === 'que ce soit') {} pour se déplacer en affichant un état html personnalisé. Ce n'est pas une bonne solution mais c'est quand même une solution. Ps. J'espère que vous allez bien depuis notre dernière rencontre au MDP.
Si Griffiths