7
votes

Comment choisir parmi les tables de Magento EAV lorsque le catalogue plat Les données du produit sont activées

J'ai ce code pour sélectionner les meilleurs produits de vente à partir de Magento:

$productCollection = Mage::getResourceModel('reports/product_collection')
            ->addOrderedQty($startTime, $currentTime)
            ->addAttributeToSelect('*')
            ->setStoreId($storeId)
            ->addStoreFilter($storeId)
            ->setOrder('ordered_qty', 'desc')
            ->setPageSize($this->limit());
    }


0 commentaires

6 Réponses :


9
votes

Créer une nouvelle classe de modèle ('myCatalog / produit') qui étend la classe de produit d'origine mais le code dur qu'il utilise le modèle de ressource EAV et la collecte de ressources EAV, puis utilisez ce modèle dans votre Code de requête.


1 commentaires

J'ai eu du mal aux dernières heures pour essayer de comprendre pourquoi mon module fonctionne parfaitement sur une installation et non sur une autre. Il a créé une collection de produits et appliqua éventuellement un filtre de catégorie. Problème est, mage_catalog_model_resource_product addCategoryFilter () s'appuie sur $ Catégorie-> getid (getid () .... Identifiant n'est pas présent dans un modèle de catégorie plate, dont l'idée brillante ... Je vais essayer ce qui précède et voir ce que je peux venir avec. Merci comme toujours Alan.



4
votes

J'exécuterais mon code à partir d'un fichier PHP autonome seul, dès que j'ai déplacé mon code dans un module d'administrateur, il s'est arrêté à l'aide de l'appartement_file et est retourné à EAV.

Si vous regardez: Mage_Catalog_model_resource_év_mysql4_product_collection

Il y a une méthode: xxx

Vous pouvez modifier cela pour ajouter une condition supplémentaire qui retourne faux en fonction de vos propres critères.

BTW, la collection de rapports mentionnée dans le premier message par BLAZO est une extension de cette collection.


0 commentaires

1
votes

Ceci est un ancien poste mais je pensais qu'un point important n'a pas été indiqué. 1. Une fois que vous avez défini le catalogue plat sur vous devez exécuter indexeur via Cron ou via admin / shell afin que les tables de catalogue plat soient remplies.

  1. Si vous avez de nombreux produits dans votre table de consolidation de la table de catalogue plat ralentiront votre site et que chaque code de recherche consommera de nombreuses ressources.

0 commentaires

2
votes

Pour développer la réponse d'Alan:

$category = Mage::getModel('namespace_module/category')->load($id)


0 commentaires

-2
votes

J'ai trouvé que la solution la plus simple consistait à éteindre les tables plats, puis à obtenir la requête SQL que Magento s'exécute à l'aide du paramètre -> Charger (true)

$resource = Mage::getSingleton('core/resource');
$readConnection = $resource->getConnection('core_read');
$query = "SELECT `e`.*, `at_ig_unifeed_ids`.`value` AS `ig_unifeed_ids` FROM `catalog_category_entity` AS `e` INNER JOIN `catalog_category_entity_varchar` AS `at_ig_unifeed_ids` ON (`at_ig_unifeed_ids`.`entity_id` = `e`.`entity_id`) AND (`at_ig_unifeed_ids`.`attribute_id` = '139') AND (`at_ig_unifeed_ids`.`store_id` = 0) WHERE (`e`.`entity_type_id` = '3') AND ((at_ig_unifeed_ids.value LIKE '%:".$this->getId().":%'))";
$collection = $readConnection->fetchAll($query);


1 commentaires

Cela avait déjà 2 bowvotes quand je l'ai trouvé, mais aucune explication de pourquoi. Je suppose que c'est parce que cela va casser lorsque vous exécutez le code dans un autre magasin. Il ne pouvait fonctionner que si cet autre magasin avait exactement le même identifiant d'attribut et n'utilisait pas de préfixes de noms de table. Même si vous deviez résoudre ces problèmes, cette solution semble toujours très fragile et hacky au mieux. Là encore, beaucoup de telles solutions de hacky réussissent à trouver leur chemin dans le code de production. Utilisez votre propre sagesse pour décider si c'est juste pour votre cas d'utilisation.



2
votes

J'ai utiliser xxx

avant xxx

et il commence à extraire des données à partir du système basé sur EAV.


1 commentaires

Cela a fonctionné pour moi, j'ai fait $ Sthetid = Mage :: App () -> GetStore () -> GetStoreID (); AVANT, je pourrais ensuite revenir à mon magasin préféré avant.