J'ai un tableau personnalisé avec une référence de produit product_id
. Maintenant, je voudrais afficher les informations sur les produits (sku, nom) dans ma grille principale , mais je ne sais pas quelle est la meilleure pratique pour le faire?
Ma meilleure estimation SKU
est la suivante:
$collection->join(
'catalog/product',
'product_id=`catalog/product`.entity_id',
array('product_sku' => 'sku')
)
(code de la _prepareCollection()
méthode dans ma classe de bloc de grille)
Mais qu'en est-il du nom du produit? Il peut être trouvé dans catalog_product_entity_varchar. Ma compréhension est que vous pouvez plutôt facilement l'obtenir si votre propre modèle de ressources et collection est basé sur, Mage_Eav_Model_Entity_Collection_Abstract
car alors vous pouvez utiliser des méthodes comme joinAttribute
. Mais mon modèle est basé sur une table simple et s'étend de Mage_Core_Model_Resource_Db_Collection_Abstract
et il n'y a pas de joinAttribute
méthode disponible.
Alors, quelle est la meilleure façon d'obtenir le nom du produit dans ce cas?
Merci pour votre temps et votre aide :-)
Mise à jour: Pour être plus précis, je parlais de mon modèle de ressources et de ma collection. Il correspond à une simple table plate avec seulement quelques attributs comme
entity_id product_id created_at user_id
Mon intention est de grille dans le backend où je montre quelques statistiques:
ProductSku Count(ProductSku) MAX(created_at)
Pour autant que je sache, la meilleure approche pour ce faire, est via la classe de bloc de grille et la méthode à suivre est _prepareCollection()
.
Ma méthode ressemble à ceci:
protected function _prepareCollection()
{
// Get and set our collection for the grid
$collection = Mage::getResourceModel($this->_getCollectionClass());
$collection
->join(
'catalog/product',
'product_id=`catalog/product`.entity_id',
array('product_sku' => 'sku')
)
->addExpressionFieldToSelect('product_count', 'COUNT({{product_id}})', 'product_id')
->addExpressionFieldToSelect('newest', 'MAX({{created_at}})', array('created_at'=>'main_table.created_at'))
->getSelect()->group('product_id');
$this->setCollection($collection);
return parent::_prepareCollection();
}
Cela fonctionne bien pour le sku (que j'appelle product_sku dans la _prepareColums()
méthode. Mais que join
dois-je insérer ici pour obtenir le nom (et par exemple le fabricant)?
Suis-je en train de faire quelque chose de mal parce que je ne peux pas l'utiliser joinLeft()
?
la source
Mage_Core_Model_Resource_Db_Collection_Abstract
et j'obtiens une erreurCall to undefined method Mycompany_Module_Model_Resource_Mymodel_Collection::joinLeft()
. Je suppose que c'est parce que je n'utilise pas de modèle de ressource EAV?$this->_map['fields']['sku'] = 'sku'
ou similaire dans ce cas. Vous n'en avez besoin que si vous avez plusieurs noms de champs identiques et devez faire une traduction pour éviter les conflits. Il ajoute simplement des frais généraux pour ce cas d'utilisation. Dans un autre cas d'utilisation, vous pouvez utiliser$this->_map['fields']['my_sku'] = 'sku'
ensuite vous pouvez utiliser avec la collection et_prepareColumns
:,$this->addColumn('my_sku', array(…))
cela vous aidera à éviter les conflits pour le filtrage ou le tri des colonnes si vous avez un champsku
utilisé dans différentes tables de base de données communes à la collection$this->getSelect()->group('main_table.product_id');
résout le problème, mais peut-être que le code peut être optimisé, afin que les doublons ne soient pas créés en premier lieu?Salut Celldweller j'espère que tu vas bien :-)
Vous vous êtes peut-être trompé dans votre explication sur la classe
Mage_Core_Model_Resource_Db_Collection_Abstract
, vous étendez une collection de ressources et non le modèle car vous ne devez pas étendre un modèle avec une classe de collection si vous voulez respecter la structure Magento. Ai-je raison?Sur la base de ma correction, je vois différents types d'approche, selon la fréquence à laquelle vous souhaitez obtenir l'attribut de nom de produit. Dans tous les cas, je pense que faire une requête SQL via le Magento Framework est le meilleur moyen et efficace. C'est plus rapide que de faire un
Mage::getModel('catalog/product')->load(1234)->getName()
pour chaque élément chargé. Donc, en fait, il sera très similaire au code que vous utilisez pour lesku
CODE NON TESTÉ
Vous voulez ces informations chaque fois qu'une collection est chargée
Vous pouvez dans votre classe de collection définir une
_beforeLoad
méthode comme un code:Vous voulez ces informations UNIQUEMENT pour la grille
Dans votre
_prepareCollection
, vous devrez ajouter une méthode dans votre collection avec le même code que cela a été fait ci-dessus dans le_beforeLoad
puis vous pouvez préparer la collection en utilisant cette méthode. N'utilisez pas les deux, je veux dire n'utilisez pas ensemble le même code_beforeLoad
et les mêmesaddProductName
méthodes, n'utilisez qu'une seule d'entre elles. Voici un exemple:Dans votre
grid.php
:Dans votre Collection.php:
la source
J'ai eu presque le même problème, mais je ne peux pas ajouter de commentaire, car je n'ai pas 50 points de réputation. J'ai passé beaucoup de temps à essayer de comprendre ce qui ne va pas (j'ai utilisé le code de Sylvain Rayé). Ma collection de produits a été filtrée pour une raison quelconque. J'ai donc trouvé une raison.
Si vous utilisez des outils d'importation (magmi, etc.), ils ne créent souvent pas d'attributs vides à la fois. Par conséquent, l'utilisation de
->where("product_attribute.attribute_id = ?", $productName->getId())
produits ne possédant pas cet attribut disparaîtra de la sélection.La bonne façon utilise
joinLeft
comme ça:J'espère que cela aide quelqu'un.
la source
Afficher l'attribut personnalisé sur la grille du produit.
Veuillez remplacer ce bloc Mage_Adminhtml_Block_Catalog_Product_Grid dans votre extension et copier les fonctions _prepareCollection et _prepareColumns dans le fichier de blocage de votre extension.
Ajoutez le code ci-dessous pour sélectionner l'attribut dans la fonction _prepareCollection de la grille de produits Mage_Adminhtml_Block_Catalog_Product_Grid avant la ligne $ this-> setCollection ($ collection).
Et puis ci-dessous le code pour la colonne dans la fonction _prepareColumns de la grille.
la source
new SomeModel()