Tentang Model Koleksi dan Model Sumber Daya

29

Saya agak bingung menggunakan model sumber daya dan model koleksi. Terkadang ketika saya melihat contoh untuk memuat produk menggunakan atribut tertentu, dalam beberapa contoh, mereka menggunakan model koleksi dan kadang-kadang mereka menggunakan model sumber daya.

Juga kapan saya bisa menggunakan metode tertentu get...dan set...bersama dengan nama baris tabel? Seperti getName, getId. Saya mencoba menggunakan tetapi tidak bisa mendapatkan nilai dan itu menunjukkan kesalahan: "memanggil metode yang tidak ditentukan dalam objek"

$product = Mage::getModel('catalog/product')
    ->loadByAttribute('name', 'product_name');

echo $product->getName(); 
echo $product->getSku();

Ini menunjukkan "metode tidak terdefinisi getSku()"

Jika saya menggunakan var_dump($product), SKU ditampilkan di objek, namun tidak bisa mendapatkan SKU menggunakan getSku()...

MagentoBoy
sumber
Untuk menjadi jelas - $productdalam contoh Anda adalah contoh dari Mage_Catalog_Model_Product, yang merupakan "model" dalam bahasa Magento.
manfaat
Ya benar. tapi saya bingung kapan harus menggunakan model koleksi dan model sumber daya dan metode apa yang tersedia untuk digunakan. Seperti yang saya lihat model koleksi tersedia di Model >> folder koleksi modul dan sumber daya tersedia dalam model sumber daya tetapi kapan dan model mana yang perlu digunakan jadi saya agak bingung tentang hal itu
MagentoBoy
Saya tahu, kita perlu menggunakan metode yang tersedia yang tersedia dalam pengumpulan dan sumber daya juga. Tetapi saya kesulitan menemukan untuk menggunakan model yang benar. Dan saya juga saya tidak bisa mendapatkan hasil dari set hasil menggunakan metode "Get" berarti getName () menggunakan nama baris tabel database. Ini menunjukkan metode yang tidak terdefinisi dalam objek berarti saya mengakses model atau metode yang salah yang perlu saya gunakan jadi saya tidak tahu tentang yang harus saya gunakan.
MagentoBoy
1
Terima kasih telah mengajukan pertanyaan ini .. Saya sudah lama mencari jawaban untuk pertanyaan ini .. +1 ..
Elavarasan

Jawaban:

63

Model CRUD Magento memiliki tiga tipe kelas dasar.

"Model" adalah yang paling sering Anda gunakan. Ini mewakili data jenis tertentu dengan cara agnostik basis data (produk, kategori, Halaman CMS, Tinjauan, dll.)

"Model sumber daya" adalah kelas yang, di belakang layar, melakukan pengambilan data aktual dari Magento. Setiap model memiliki model sumber daya yang digunakan untuk memuat satu contoh model dari database.

"Koleksi" adalah kelas yang memuat struktur mirip array dari beberapa model berdasarkan seperangkat aturan. Anggap saja seperti SQL WHERE clause.

Yang agak membingungkan adalah, di balik layar, Magento juga menganggap koleksi sebagai model sumber daya. Jadi ada model sumber daya koleksi dan model sumber daya individu .

Secara umum, ketika Anda ingin memuat item tertentu, Anda menggunakan model . Saat Anda ingin memuat sejumlah item, Anda menggunakan model sumber daya koleksi .

//loads one
$product = Mage::getModel('catalog/product')->load($id);

//loads many products where price is greater than 100
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*') //load all fields, see EAV below
->addAttributeToFilter('price', array('gt'=>'100'));

foreach($products as $product)
{
    var_dump($product->getSku());
}

Satu hal yang perlu diingat tentang memuat melalui model sumber daya koleksi adalah metode masing-masing model individu afterLoadtidak akan dipanggil secara otomatis, yang berarti beberapa data mungkin tidak dimuat.

The model sumber daya individua kelas biasanya tidak diakses secara langsung. Namun, kadang-kadang model tertentu akan memiliki model sumber daya dengan metode yang bermanfaat. Ini Anda akan menemukan dari waktu ke waktu menggunakan sistem.

Akhirnya, ada satu lagi perbedaan yang harus dibuat. Model CRUD reguler Magento memiliki sintaks khusus untuk memuat melalui sesuatu yang bukan ID numerik. Misalnya, berikut ini cara memuat model halaman CMS berdasarkan judul

$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());

Namun, beberapa model Magento adalah model EAV. Itu singkatan dari "nilai atribut entitas", dan merupakan cara yang bagus untuk mengatakan model ini tidak memiliki set bidang yang tetap. Ini termasuk model produk, dan model kategori. Fitur ini memungkinkan Anda memilih atribut yang berbeda untuk berbagai jenis produk. Setiap bidang pada model EAV dikenal sebagai atribut. Sintaks di atas tidak akan berfungsi dengan model-model ini, Anda harus menggunakan loadByAttributemetode ini.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');

Mengenai masalah spesifik Anda, jika Anda mendapatkan kesalahan dengan "metode tidak terdefinisi" teks tertentu, maka ada sesuatu yang sangat salah dengan sistem Anda. Bahkan jika getSkumetode ini tidak ada, Magento memiliki metode penyetel dan pengambil sihir yang memastikan getpanggilan pada model apa pun akan selalu mengembalikan sesuatu, bahkan jika itu nol.

Yang lebih mungkin adalah Anda mendapatkan kesalahan seperti berikut ini

Call to a member function getSku() on a non-object

Kesalahan ini terjadi karena loadByAttributemetode ini kembali falsejika tidak dapat memuat objek.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false

Coba sesuatu seperti ini dalam kode Anda.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'sku-value');
if($product)
{
    var_dump($product->getName());
    var_dump($product->getSku());
    var_dump($product->getData());
}
else
{
    var_dump("Could not load product");
}

Selain persyaratan, perhatikan getData()metode ini. Ini akan mengembalikan larik semua data objek sebagai larik.

Semoga ini cukup untuk membuat Anda bergerak. Semoga berhasil!

Alan Storm
sumber
@Alan .. Deskripsi yang sangat bagus ... Saya telah membaca banyak posting Anda di Magento :) .. Saya sangat senang setelah melihat balasan Anda ke posting saya. Saya akan bergerak maju dengan informasi Anda. Jika saya akan mendapatkan masalah apa pun, saya harap saya akan mendapatkan dukungan yang baik dari komunitas ini. Karena saya baru di Magento dan juga pogram, jadi pertanyaan saya mungkin tidak begitu banyak konsep tetapi saya masih ingin belajar. Saya sangat suka kerangka kerja Magento :) :) Terima kasih, Pak :)
MagentoBoy
Maaf, saya punya satu pertanyaan lagi. Jika saya memanggil $ product = Mage :: getModel ('catalog / product'); dan kemudian jika saya memanggil getName () dan getSku (). Apakah saya bisa mendapatkan nilai jika saya mengulangi $ produk di foreachloop ?? atau saya harus memanggil metode loadByAttribute () ??
MagentoBoy
@ MagentoBoy Saya minta maaf, tetapi kendala bahasa tampaknya menutupi pertanyaan Anda. Saya tidak yakin apa yang Anda minta.
Alan Storm
Pak, saya minta maaf. Dalam kegembiraan saya tidak mengungkapkan pertanyaan saya dengan jelas. Tetapi saya mencoba dan sekarang saya bisa mendapatkan daftar produk dan sekarang dapat mengambil produk menggunakan atribut yang berbeda dengan benar. :) dan ya pertanyaan saya adalah, dapatkah saya menggunakan metode get seperti getName (), getPrice (), getSku (), tanpa memanggil addAttributeToSelect ('*'), addAttributeToFilter () atau loadByAttribute (); misalnya $ product = Mage :: getModel ('catalog / product'); foreach ($ product as $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Karena get model akan instantiate kelas produk maka kita dapat mengakses get get dan mengatur metode .
MagentoBoy
1
@ user8009 Pesan kesalahan itu bisa terjadi karena berbagai alasan. Jika Anda tidak bisa mendapatkan akses FTP, atau mereproduksi masalah dalam versi lokal / pengembangan sistem Anda tidak akan pernah menyelesaikan masalah.
Alan Storm