Модели 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.