Giới thiệu về Mô hình Bộ sưu tập và Mô hình Tài nguyên


29

Tôi hơi bối rối về việc sử dụng mô hình tài nguyên và mô hình bộ sưu tập. Đôi khi tôi thấy các ví dụ để tải sản phẩm bằng các thuộc tính cụ thể, trong một số ví dụ, họ sử dụng mô hình bộ sưu tập và đôi khi họ sử dụng mô hình tài nguyên.

Ngoài ra khi nào tôi có thể sử dụng phương thức cụ thể get...set...cùng với tên hàng của bảng? Giống như getName, getId. Tôi đã thử sử dụng nhưng không thể nhận được các giá trị và nó hiển thị lỗi: "gọi phương thức không xác định trong đối tượng"

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

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

Nó cho thấy "phương thức không xác định getSku()"

Nếu tôi sử dụng var_dump($product), SKU hiển thị trong đối tượng, tuy nhiên không thể lấy SKU bằng getSku()...


Để rõ ràng - $producttrong 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.
đánh dấu

Vâng, phải rồi. nhưng tôi bối rối khi sử dụng mô hình bộ sưu tập và mô hình tài nguyên và phương pháp nào có sẵn để sử dụng. Như tôi thấy các mô hình bộ sưu tập có sẵn trong Mô hình >> thư mục bộ sưu tập của mô-đun và các tài nguyên có sẵn trong mô hình tài nguyên nhưng khi nào và mô hình nào cần sử dụng nên tôi hơi bối rối về nó
MagentoBoy

Tôi biết, chúng ta cần sử dụng các phương thức có sẵn trong bộ sưu tập và cả nguồn bên ngoài. Nhưng tôi khó tìm được để sử dụng đúng mô hình. Và tôi cũng không thể lấy kết quả từ tập kết quả bằng phương thức "Get" có nghĩa là getName () sử dụng tên hàng của bảng cơ sở dữ liệu. Nó cho thấy phương thức không xác định trong đối tượng có nghĩa là tôi đang truy cập sai mô hình hoặc phương thức mà tôi cần sử dụng vì vậy tôi không xác nhận về việc tôi cần sử dụng cái gì.
MagentoBoy

1
Cảm ơn bạn đã hỏi câu hỏi
này..tôi

Câu trả lời:


63

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ậpcá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ẻ afterLoadsẽ 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 loadByAttributephươ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 getSkuphươ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 getcuộ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ì loadByAttributephương thức trả về falsenế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!


@Alan .. Mô tả rất hay ... Tôi đã đọc nhiều bài viết của bạn trên Magento :) .. Tôi rất vui sau khi thấy câu trả lời của bạn cho bài viết của tôi. Tôi sẽ di chuyển về phía trước với thông tin của bạn. Nếu tôi sẽ nhận được bất kỳ vấn đề sau đó, tôi hy vọng tôi sẽ nhận được sự hỗ trợ tốt từ cộng đồng này. Vì tôi mới tham gia magento cũng như vẽ hình, nên câu hỏi của tôi có thể không quá nhiều về khái niệm nhưng tôi vẫn muốn học. Tôi thực sự thích khung magento rất nhiều :) .. Cảm ơn ngài :)
MagentoBoy

Tôi xin lỗi, tôi có một câu hỏi nữa. Nếu tôi gọi $ sản phẩm = Mage :: getModel ('danh mục / sản phẩm'); và sau đó nếu tôi gọi getName () và getSku (). Tôi có thể nhận được các giá trị nếu tôi lặp lại sản phẩm $ trong foreachloop không ?? hoặc tôi phải gọi phương thức loadByAttribution () ??
MagentoBoy

@MagentoBoy Tôi xin lỗi, nhưng rào cản ngôn ngữ dường như đang che dấu câu hỏi của bạn. Tôi không chắc chắn những gì bạn đang hỏi.
Alan Storm

thưa ngài, tôi xin lỗi Trong sự phấn khích tôi đã không thể hiện rõ câu hỏi của mình. Nhưng tôi đã thử và bây giờ tôi có thể lấy danh sách các sản phẩm và bây giờ có thể tìm nạp các sản phẩm bằng cách sử dụng thuộc tính khác nhau một cách chính xác. :) và vâng câu hỏi của tôi là, tôi có thể sử dụng các phương thức get như getName (), getprice (), getSku (), mà không gọi addAttributionToSelect ('*'), addAttributionToFilter () hoặc loadByAttribution (); cho người cũ $ sản phẩm = Mage :: getModel ('danh mục / sản phẩm'); foreach ($ sản phẩm là $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Vì mô hình get sẽ khởi tạo lớp sản phẩm sau đó chúng ta có thể truy cập các phương thức get và set truy cập .
MagentoBoy

1
@ user8009 Thông báo lỗi đó có thể xảy ra vì vô số lý do. Nếu bạn không thể truy cập FTP hoặc tái tạo sự cố trong phiên bản cục bộ / phát triển của hệ thống, bạn sẽ không bao giờ giải quyết được vấn đề.
Alan Storm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.