Моделі CRUD Magento мають три основні типи класів.
"Модель" - це те, що ви найчастіше використовуєте. Це відображає дані певного типу в агностично базі даних (продукт, категорія, сторінка CMS, огляд тощо)
"Ресурсна модель" - це клас, який за лаштунками здійснює фактичне отримання даних з Magento. Кожна модель має ресурсну модель, яка використовується для завантаження одного екземпляра моделі з бази даних.
"Колекція" - це клас, що завантажує масив, схожий на структуру з декількох моделей на основі набору правил. Думайте про це як про SQL WHERE clause
.
Дещо плутаючи речі, поза лаштунками Magento також розглядає колекцію як ресурсну модель. Отже, існують моделі колекційних ресурсів та індивідуальні моделі ресурсів .
Взагалі кажучи, коли ви хочете завантажити певний елемент, ви використовуєте модель . Коли ви хочете завантажити ряд елементів, ви використовуєте модель ресурсу колекції .
//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());
}
Слід пам’ятати про завантаження через модель ресурсу колекції - метод кожної окремої моделі afterLoad
не буде викликаний автоматично, це означає, що деякі дані можуть не завантажуватися.
У моделі індивідів ресурсів класи, як правило , не доступні безпосередньо. Однак інколи конкретна модель матиме ресурсну модель з корисним методом. Це ви дізнаєтесь з часом за допомогою системи.
Нарешті, є ще одне розрізнення. У звичайних моделях CRUD Magento є спеціальний синтаксис для завантаження через щось, що не є числовим ідентифікатором. Наприклад, ось як завантажити модель сторінки CMS за заголовком
$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());
Однак кілька моделей Magento є моделями EAV. Це означає "значення атрибуту сутності" і є химерним способом сказати, що ці моделі не мають фіксованого набору полів. Сюди входять моделі товарів та моделі категорій. Ця функція дозволяє вибрати різні атрибути для різних видів продукції. Кожне поле на моделі EAV відоме як атрибут. Наведений вище синтаксис не працюватиме з цими моделями, замість цього вам потрібно використовувати loadByAttribute
метод.
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');
Що стосується вашої конкретної проблеми, якщо ви отримуєте помилку з конкретним текстом "метод не визначений", то з вашою системою щось не так. Навіть якщо getSku
методу не існує, Magento має методи магічного встановлення та отримання, які забезпечують, що get
виклик будь-якої моделі завжди поверне щось, навіть якщо це недійсне.
Що більше ймовірно, ви отримуєте помилку, як описано нижче
Call to a member function getSku() on a non-object
Ця помилка трапляється тому, що loadByAttribute
метод повертається, false
якщо він не може завантажити об'єкт.
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false
Спробуйте щось подібне у своєму коді.
$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");
}
Крім умовного, помітьте getData()
метод. Це поверне масив усіх даних об'єкта у вигляді масиву.
Сподіваємось, цього достатньо, щоб ви рухалися. Удачі!
$product
у вашому прикладі є примірникMage_Catalog_Model_Product
, який є "моделлю" в Magento парламенті.