Saya memiliki tabel khusus dengan referensi produk product_id
. Sekarang saya ingin menunjukkan informasi produk (sku, nama) di grid backend saya , tetapi saya tidak yakin apa praktik terbaik untuk melakukan ini?
Tebakan terbaik saya SKU
adalah sebagai berikut:
$collection->join(
'catalog/product',
'product_id=`catalog/product`.entity_id',
array('product_sku' => 'sku')
)
(kode dari _prepareCollection()
metode di kelas blok kotak saya)
Tapi bagaimana dengan nama produk? Itu dapat ditemukan di catalog_product_entity_varchar. Pemahaman saya adalah bahwa Anda dapat dengan mudah mendapatkannya jika model sumber daya Anda sendiri dan koleksi didasarkan Mage_Eav_Model_Entity_Collection_Abstract
karena Anda dapat menggunakan metode seperti joinAttribute
. Tetapi model saya didasarkan pada tabel sederhana dan memanjang dari Mage_Core_Model_Resource_Db_Collection_Abstract
dan tidak ada joinAttribute
metode yang tersedia.
Jadi apa cara terbaik untuk mendapatkan nama produk dalam kasus ini?
Terima kasih atas waktu dan bantuan Anda :-)
Pembaruan: Untuk lebih tepatnya, saya berbicara tentang model dan koleksi sumber daya saya. Ini cocok dengan tabel datar sederhana dengan hanya beberapa atribut seperti
entity_id product_id created_at user_id
Niat saya adalah menyambungkan di backend tempat saya menampilkan beberapa statistik:
ProductSku Count(ProductSku) MAX(created_at)
Sejauh yang saya tahu, pendekatan terbaik untuk melakukan ini, adalah melalui kelas kotak blok dan metode untuk pergi adalah _prepareCollection()
.
Metode saya terlihat seperti ini:
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();
}
Ini berfungsi dengan baik untuk sku (yang saya sebut sebagai product_sku dalam _prepareColums()
metode. Tapi apa yang join
harus saya masukkan di sini untuk mendapatkan nama (dan misalnya produsen)?
Apakah saya melakukan sesuatu yang salah karena saya tidak dapat menggunakan joinLeft()
?
sumber
Mage_Core_Model_Resource_Db_Collection_Abstract
dan saya mendapatkan kesalahanCall to undefined method Mycompany_Module_Model_Resource_Mymodel_Collection::joinLeft()
. Saya kira ini karena saya tidak menggunakan Model Sumber Daya EAV?$this->_map['fields']['sku'] = 'sku'
atau serupa dalam hal ini. Anda memerlukannya hanya jika Anda memiliki beberapa nama bidang yang identik dan perlu melakukan terjemahan untuk mencegah konflik. Itu hanya menambahkan overhead untuk use case ini. Dalam kasus penggunaan yang berbeda, Anda dapat menggunakan$this->_map['fields']['my_sku'] = 'sku'
maka Anda dapat menggunakan dengan koleksi dan_prepareColumns
:$this->addColumn('my_sku', array(…))
, itu akan membantu Anda untuk mencegah konflik untuk penyaringan atau kolom menyortir jika Anda telah lapangansku
digunakan dalam berbagai tabel DB umum untuk koleksi$this->getSelect()->group('main_table.product_id');
memecahkan masalah, tetapi mungkin kode dapat dioptimalkan, sehingga duplikat tidak dibuat di tempat pertama?Hai Celldweller Saya harap Anda baik-baik saja :-)
Mungkin Anda salah dalam menjelaskan tentang kelas
Mage_Core_Model_Resource_Db_Collection_Abstract
, Anda memperluas koleksi sumber daya bukan model karena Anda tidak harus memperluas model dengan kelas koleksi jika Anda ingin menghormati struktur Magento. Apakah saya benar?Berdasarkan koreksi saya, saya melihat berbagai jenis pendekatan, tergantung pada seberapa sering Anda ingin mendapatkan atribut nama produk. Bagaimanapun, saya pikir untuk melakukan kueri sql melalui Magento Framework adalah cara terbaik dan efisien. Ini lebih cepat daripada melakukan
Mage::getModel('catalog/product')->load(1234)->getName()
untuk setiap item yang dimuat. Jadi sebenarnya itu akan sangat mirip dengan kode yang Anda gunakan untuksku
KODE TIDAK DIUJI
Anda ingin informasi itu setiap kali koleksi dimuat
Anda mungkin dalam kelas koleksi Anda menetapkan
_beforeLoad
metode seperti kode:Anda ingin HANYA informasi itu untuk grid
Di Anda
_prepareCollection
, Anda harus menambahkan metode dalam koleksi Anda dengan kode yang sama seperti yang dilakukan di atas ke dalam_beforeLoad
maka Anda dapat menyiapkan koleksi dengan menggunakan metode ini. Jangan gunakan keduanya, maksud saya jangan gunakan bersama-sama kode_beforeLoad
danaddProductName
metode yang sama, gunakan hanya satu saja. Berikut ini contohnya:Ke dalam Anda
grid.php
:Ke dalam Collection.php Anda:
sumber
Saya memiliki masalah yang hampir sama, tetapi saya tidak dapat menambahkan komentar, karena saya tidak memiliki 50 reputasi. Saya menghabiskan banyak waktu untuk mencari tahu apa yang salah (saya menggunakan kode Sylvain Rayé). Koleksi produk saya karena alasan tertentu difilter. Jadi saya menemukan alasannya.
Jika Anda menggunakan beberapa alat impor (magmi, dll), mereka sering tidak membuat atribut kosong sekaligus. Karenanya menggunakan
->where("product_attribute.attribute_id = ?", $productName->getId())
produk yang tidak memiliki atribut ini, akan hilang dari seleksi.Cara yang benar menggunakan
joinLeft
seperti itu:Semoga ini bisa membantu seseorang.
sumber
Tampilkan atribut khusus pada kisi produk.
Timpa blok ini Mage_Adminhtml_Block_Catalog_Product_Grid di ekstensi Anda dan salin fungsi _prepareCollection dan _prepareColumns ke dalam file blok ekstensi Anda.
Tambahkan kode di bawah ini untuk memilih attribuet di fungsi _prepareCollection dari kisi produk Mage_Adminhtml_Block_Catalog_Product_Grid sebelum $ this-> setCollection ($ collection) line.
Dan kemudian di bawah ini kode untuk kolom dalam fungsi _prepareColumns dari kisi.
sumber
new SomeModel()