Ich habe eine benutzerdefinierte Tabelle mit einer Produktreferenz product_id
. Jetzt möchte ich Produktinformationen (SKU, Name) in meinem Backend-Raster anzeigen , bin mir aber nicht sicher, wie dies am besten funktioniert.
Meine beste Vermutung für SKU
ist wie folgt:
$collection->join(
'catalog/product',
'product_id=`catalog/product`.entity_id',
array('product_sku' => 'sku')
)
(Code aus der _prepareCollection()
Methode in meiner Gitterblockklasse)
Aber was ist mit dem Produktnamen? Es kann in catalog_product_entity_varchar gefunden werden. Mein Verständnis ist, dass Sie es ziemlich einfach bekommen können, wenn Ihr eigenes Ressourcenmodell und Ihre eigene Sammlung darauf basieren, Mage_Eav_Model_Entity_Collection_Abstract
weil Sie dann Methoden wie verwenden können joinAttribute
. Aber mein Modell basiert auf einer einfachen Tabelle und erstreckt sich von Mage_Core_Model_Resource_Db_Collection_Abstract
und es gibt keine joinAttribute
Methode zur Verfügung.
Was ist in diesem Fall der beste Weg, um den Produktnamen zu erhalten?
Danke für deine Zeit und Hilfe :-)
Update: Genauer gesagt habe ich über mein Ressourcenmodell und meine Sammlung gesprochen. Es passt zu einem einfachen flachen Tisch mit nur wenigen Attributen wie
entity_id product_id created_at user_id
Meine Absicht ist es, im Backend zu rasteren, wo ich einige Statistiken zeige:
ProductSku Count(ProductSku) MAX(created_at)
Soweit ich weiß, ist der beste Ansatz, dies zu tun, die Rasterblockklasse, und die Methode ist zu gehen _prepareCollection()
.
Meine Methode sieht so aus:
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();
}
Dies funktioniert gut für die SKU (die ich in der _prepareColums()
Methode als product_sku bezeichne. Aber was join
muss ich hier einfügen, um den Namen (und z. B. den Hersteller) zu erhalten?
Mache ich etwas falsch, weil ich es nicht benutzen kann joinLeft()
?
quelle
Mage_Core_Model_Resource_Db_Collection_Abstract
und ich erhalte eine FehlermeldungCall to undefined method Mycompany_Module_Model_Resource_Mymodel_Collection::joinLeft()
. Ich denke, das liegt daran, dass ich kein EAV-Ressourcenmodell verwende.$this->_map['fields']['sku'] = 'sku'
in diesem Fall nicht einmal unbedingt verwenden oder ähnliches. Sie benötigen es nur, wenn Sie mehrere identische Feldnamen haben und eine Übersetzung durchführen müssen, um Konflikte zu vermeiden. Es wird lediglich der Overhead für diesen Anwendungsfall hinzugefügt. In einem anderen Anwendungsfall, können Sie verwenden ,$this->_map['fields']['my_sku'] = 'sku'
dann können Sie mit der Sammlung verwenden und_prepareColumns
:$this->addColumn('my_sku', array(…))
, es wird Ihnen helfen Konflikt für die Filterung oder Spalten zu verhindern Sortierung , wenn Sie ein Feld habensku
in verschiedenen DB - Tabellen gemeinsam mit der Sammlung verwendet$this->getSelect()->group('main_table.product_id');
löst das Problem, aber vielleicht kann der Code optimiert werden, so dass überhaupt keine Duplikate erstellt werden?Hallo Celldweller, ich hoffe es geht dir gut :-)
Vielleicht haben Sie sich in Ihrer Erklärung zur Klasse geirrt.
Mage_Core_Model_Resource_Db_Collection_Abstract
Sie erweitern eine Ressourcensammlung und nicht das Modell, da Sie ein Modell nicht um eine Sammlungsklasse erweitern dürfen, wenn Sie die Magento-Struktur respektieren möchten. Habe ich recht?Aufgrund meiner Korrektur sehe ich unterschiedliche Ansätze, je nachdem, wie oft Sie das Produktnamenattribut erhalten möchten. In jedem Fall denke ich, dass eine SQL-Abfrage über das Magento Framework der beste und effizienteste Weg ist. Es ist schneller als
Mage::getModel('catalog/product')->load(1234)->getName()
für jeden geladenen Gegenstand eine. Tatsächlich ist es dem Code, den Sie für das verwenden, sehr ähnlichsku
CODE NICHT GETESTET
Sie möchten diese Informationen jedes Mal, wenn eine Sammlung geladen wird
Sie können in Ihrer Sammlungsklasse einen
_beforeLoad
solchen Code in eine Methode setzen:Sie möchten diese Informationen NUR für das Raster
In Ihrem
_prepareCollection
müssen Sie Ihrer Sammlung eine Methode mit demselben Code wie oben hinzufügen,_beforeLoad
dann können Sie die Sammlung mit dieser Methode vorbereiten. Verwenden Sie nicht beide, ich meine, verwenden Sie nicht denselben Code_beforeLoad
und dieselbenaddProductName
Methoden zusammen, sondern nur einen. Hier ist ein Beispiel:In deine
grid.php
:In Ihre Collection.php:
quelle
Ich hatte fast das gleiche Problem, aber ich kann keinen Kommentar hinzufügen, weil ich keinen Ruf habe. Ich habe viel Zeit damit verbracht herauszufinden, was falsch ist (ich habe den Code von Sylvain Rayé verwendet). Meine Produktkollektion wurde aus irgendeinem Grund gefiltert. Also habe ich einen Grund gefunden.
Wenn Sie einige Importwerkzeuge (Magmi usw.) verwenden, werden häufig keine leeren Attribute gleichzeitig erstellt. Daher wird die Verwendung von
->where("product_attribute.attribute_id = ?", $productName->getId())
Produkten, die dieses Attribut nicht haben, aus der Auswahl entfernt.Der richtige Weg ist,
joinLeft
Folgendes zu verwenden:Hoffe das hilft jemandem.
quelle
Benutzerdefiniertes Attribut im Produktraster anzeigen.
Bitte überschreiben Sie diesen Block Mage_Adminhtml_Block_Catalog_Product_Grid in Ihrer Erweiterung und kopieren Sie die Funktionen _prepareCollection und _prepareColumns in die Blockdatei Ihrer Erweiterung.
Fügen Sie den folgenden Code hinzu, um das Attribut in der _prepareCollection-Funktion des Produktrasters Mage_Adminhtml_Block_Catalog_Product_Grid vor der Zeile $ this-> setCollection ($ collection) auszuwählen.
Und dann unten Code für Spalte in _prepareColumns Funktion des Rasters.
quelle
new SomeModel()