Các mô hình CRUD của Magento có ba loại lớp cơ bản.
Một "mô hình" là những gì bạn sẽ sử dụng phổ biến nhất. Điều này thể hiện dữ liệu của một loại cụ thể theo cách bất khả tri của cơ sở dữ liệu (sản phẩm, danh mục, Trang CMS, Đánh giá, v.v.)
"Mô hình tài nguyên" là một lớp, đằng sau hậu trường, thực hiện việc tìm nạp dữ liệu thực tế từ Magento. Mỗi mô hình có một mô hình tài nguyên được sử dụng để tải một thể hiện của một mô hình từ cơ sở dữ liệu.
"Bộ sưu tập" là một lớp tải một mảng giống như cấu trúc của nhiều mô hình dựa trên một bộ quy tắc. Hãy nghĩ về nó giống như một SQL WHERE clause
.
Điều khó hiểu phần nào là, đằng sau hậu trường, Magento cũng coi một bộ sưu tập là một mô hình tài nguyên. Vì vậy, có các mô hình tài nguyên thu thập và các mô hình tài nguyên cá nhân .
Nói chung, khi bạn muốn tải một mục cụ thể, bạn sử dụng một mô hình . Khi bạn muốn tải một số mục, bạn sử dụng mô hình tài nguyên bộ sưu tập .
//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());
}
Một điều cần lưu ý về việc tải thông qua một mô hình tài nguyên bộ sưu tập là mỗi phương thức của từng mô hình riêng lẻ afterLoad
sẽ không được gọi tự động, điều đó có nghĩa là một số dữ liệu có thể không được tải.
Các lớp mô hình tài nguyên individua thường không được truy cập trực tiếp. Tuy nhiên, đôi khi một mô hình cụ thể sẽ có một mô hình tài nguyên với một phương thức hữu ích trên nó. Những người này sẽ khám phá theo thời gian sử dụng hệ thống.
Cuối cùng, có thêm một sự khác biệt nữa được thực hiện. Các mô hình CRUD thông thường của Magento có một cú pháp đặc biệt để tải thông qua một cái gì đó không phải là ID số. Ví dụ: đây là cách tải mô hình trang CMS theo tiêu đề
$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());
Tuy nhiên, một vài mẫu Magento là mẫu EAV. Đó là viết tắt của "giá trị thuộc tính thực thể" và là một cách thú vị để nói rằng các mô hình này không có một bộ trường cố định. Điều này bao gồm các mô hình sản phẩm và mô hình thể loại. Tính năng này là những gì cho phép bạn chọn các thuộc tính khác nhau cho các loại sản phẩm khác nhau. Mỗi trường trên một mô hình EAV được gọi là một thuộc tính. Cú pháp trên sẽ không hoạt động với các mô hình này, thay vào đó bạn cần sử dụng loadByAttribute
phương thức.
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');
Về vấn đề cụ thể của bạn, nếu bạn gặp lỗi với văn bản cụ thể "phương pháp không xác định", thì có gì đó không ổn với hệ thống của bạn. Ngay cả khi getSku
phương thức không tồn tại, Magento có các phương thức setter và getter ma thuật đảm bảo get
cuộc gọi trên bất kỳ mô hình nào sẽ luôn trả về một cái gì đó, ngay cả khi nó không có giá trị.
Những gì có nhiều khả năng là bạn đang gặp lỗi như sau
Call to a member function getSku() on a non-object
Lỗi này xảy ra vì loadByAttribute
phương thức trả về false
nếu nó không thể tải đối tượng.
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false
Hãy thử một cái gì đó như thế này trong mã của bạn.
$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");
}
Ngoài các điều kiện, chú ý getData()
phương pháp. Điều này sẽ trả về một mảng của tất cả dữ liệu của đối tượng dưới dạng một mảng.
Hy vọng điều này là đủ để bạn di chuyển. Chúc may mắn!
$product
trong ví dụ của bạn là một ví dụMage_Catalog_Model_Product
, đó là một "mô hình" theo cách nói của Magento.