Question

Synopsis

J'ai un problème où un magasin Magento je travaille a été configuré pour utiliser des produits regroupés avec des produits simples associés. Ces produits peuvent être filtrés par les attributs / valeurs en tant que produits configurés dans l'administration.

Comportement actuel

  • Les simples de visibilités de produits sont mis à Non visible individuellement .
  • Les produits simples lorsque sont affichés par recherché leur groupe produit.

Quand filtre l'utilisateur final les produits résultats par couleur et par exemple rouge , les produits regroupés avec des produits associés aux simples qui ont une valeur d'attribut pour couleur de rouge sont affichés.

Comportement attendu (après la personnalisation)

  • Les simples de visibilités de produits sont mis à Non visible individuellement .
  • Les produits simples lorsque sont affichés par recherché leur groupe produit.

Quand doit être affiché à l'utilisateur final filtre les résultats produits par couleur (seulement) qu'au lieu des produits regroupés en cours d'affichage, ce produit simple.

Ma logique était - je pouvais détecter les filtres à travers les paramètres de la requête. Lorsque le filtre de couleur a été ensemble, je les résultats des Override produits en quelque sorte .

Quand je dis en quelque sorte ce que je veux dire est, c'est la partie où j'ai du mal à résoudre mon problème simple. Comment puis-je résoudre ce problème?

Conclusion / tentatives

Voici la liste des tentatives que j'ai pensé et joué avec soit trouver cela ne résout pas tout à fait mon problème ou simplement ne résout pas mon problème.

Observer le catalog_controller_category_init_before:

Je pensais que quand je vois la méthode _initCategory() je pourrais passer outre la mise en page que je pourrais potentiellement changer la configuration Magento pour afficher les produits simples et non groupés produits.

Cependant, il semble $this->loadLayout() est jamais appelé, donc je dois remplacer les méthodes de getLayout ou viewAction sur le CategoryController lui-même.

surchargent CategoryController explicitement à mettre en œuvre des changements de mise en page:

Je est revenu ci-dessus et a décidé de poursuivre ma deuxième option de passer outre la fonctionnalité. En commençant par l'extension du contrôleur Mage_Catalog_CategoryController.

Mon premier essai était de passer outre le loadLayout, après avoir appris ce n'est jamais appelé, je décide alors de passer outre le getLayout à ce stade, je ne savais pas ce que je vais faire.

surchargent Mage_Catalog_Block_Product_List:

Je décidé que la meilleure option était d'étendre le bloc réel qui présente les modèles et les collections nécessaires. Au sein de mon bloc-je remplacer la méthode getProductsListHtml, j'apprends rapidement l'ensemble HTML a déjà été analysé, exécuté et généré.

Alors je ne pouvais tout simplement pas.

  • Ecoute le $this->getRequest()->getParams();
  • itérer sur les produits regroupés pour obtenir leurs produits associés qui correspondent à mon filtre;

Observez l'événement catalog_product_collection_load_after:

Cette fois, je pensais bien que je pouvais observer la collection de modèle et changer le Questy de modifier les résultats lorsque mes filtres ont été définis. Je reçois $observer->getEvent()->getCollection() où et mettre à jour la requête en fonction de mes filtres.

Cela ne fonctionne pas parce que je peux retirer les produits groupés, mais les produits simples ne vais pas montrer à cause de la visibilité.

Était-ce utile?

La solution

Bien que cela ne donne pas explicitement une solution, cette réponse est actuellement ce que je l'ai fait pour atteindre mon objectif.

Je essentiellement créé un observateur à catalog_product_collection_load_after. Je Recréez alors la requête pour recueillir uniquement les données que je veux.

$event      = $observer->getEvent();
$collection = $event->getCollection();
$select     = $collection->getSelect();

// Adapter is the database resource adapter (an example, probably not the best)
$adapter = Mage::getResource('core/resource');

// Reset the entire query (using the Zend reset method).
$select->reset();

$select->from([ 'main_table' => $adapter->getTableName('catalog/product') ], [
    // stuff to get
])

// inner joins and things.

Autres conseils

Je n'ai pas un exemple de code complet disponible, mais qu'en est la création d'un module personnalisé et en remplaçant Mage_Catalog_Model_Layer->prepareProductCollection()? Vous pouvez utiliser Mage::app->->getRequest()->getParams() pour trouver si l'attribut que vous souhaitez utiliser est présent, et si elle est, ne pas courir Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection) qui est là maintenant.

Exemple Un:

public function prepareProductCollection($collection)
{
    if (!in_array(Mage::app->->getRequest()->getParams(), 'colour')) {
        return parent::prepareProductCollection($collection);
    }

    $collection
        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->addUrlRewrite($this->getCurrentCategory()->getId());

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
    // Don't filter by "visible in catalog" if filtering by colour
    // Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

    return $this;
}

J'espère que cela au moins vous se rapproche.

Selon vos besoins, je ne trouve pas approprié pour montrer simple produit sur la sélection de filtres. Autant que je peux observateur que vous cherchez à montrer l'image de ce produit de couleur que vous pouvez obtenir dans le produit répertorié configurable ainsi. Vous pouvez avoir les détails du produit associés tout en rendant la liste, juste déclencher les drapeaux pour vérifier si le filtre est sélectionné ou non qui est utilisé pour configurer le produit, si elle est sélectionnée, puis aller chercher l'image respective. La reconstruction de la structure complète n'a pas de sens. Vous pouvez soit créer un fichier de bloc pour rendre les produits simples et changer le rendu de bloc à la sélection du filtre. Mais je préfère la première option. Ecrire pour toute requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top