Os modelos CRUD do Magento têm três tipos básicos de classe.
Um "modelo" é o que você mais usa. Isso representa dados de um tipo específico de uma maneira independente de banco de dados (produto, categoria, página CMS, revisão etc.)
Um "modelo de recursos" é uma classe que, nos bastidores, realiza a busca real de dados do Magento. Todo modelo possui um modelo de recurso usado para carregar uma única instância de um modelo do banco de dados.
Uma "coleção" é uma classe que carrega uma matriz, como a estrutura de vários modelos, com base em um conjunto de regras. Pense nisso como um SQL WHERE clause
.
Confundir um pouco as coisas é que, nos bastidores, o Magento também considera uma coleção um modelo de recursos. Portanto, existem modelos de recursos de coleção e modelos de recursos individuais .
De um modo geral, quando você deseja carregar um item específico, você usa um modelo . Quando você deseja carregar vários itens, você usa um modelo de recurso de coleção .
//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());
}
Um aspecto a ser lembrado sobre o carregamento por meio de um modelo de recurso de coleção é que o afterLoad
método de cada modelo individual não será chamado automaticamente, o que significa que alguns dados podem não ser carregados.
As classes do modelo de recurso individual geralmente não são acessadas diretamente. No entanto, ocasionalmente, um modelo específico terá um modelo de recurso com um método útil. Você descobrirá com o tempo usando o sistema.
Finalmente, há mais uma distinção a ser feita. Os modelos CRUD regulares do Magento têm uma sintaxe especial para carregar através de algo que não é o ID numérico. Por exemplo, veja como carregar um modelo de página do CMS por título
$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());
No entanto, alguns modelos Magento são modelos EAV. Isso significa "valor do atributo da entidade" e é uma maneira elegante de dizer que esses modelos não têm um conjunto fixo de campos. Isso inclui modelos de produtos e modelos de categoria. Esse recurso é o que permite escolher diferentes atributos para diferentes tipos de produtos. Cada campo em um modelo EAV é conhecido como um atributo. A sintaxe acima não funcionará com esses modelos; você precisará usar o loadByAttribute
método
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');
Em relação ao seu problema específico, se você estiver recebendo um erro com o texto específico "método indefinido", algo está muito errado com seu sistema. Mesmo que o getSku
método não exista, o Magento possui métodos de setter e getter mágicos que garantem que uma get
chamada em qualquer modelo sempre retorne algo, mesmo que seja nulo.
O mais provável é que você esteja recebendo um erro como o seguinte
Call to a member function getSku() on a non-object
Este erro está ocorrendo porque o loadByAttribute
método retorna false
se não puder carregar o objeto.
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false
Tente algo assim no seu código.
$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");
}
Além do condicional, observe o getData()
método Isso retornará uma matriz de todos os dados do objeto como uma matriz.
Espero que isso seja suficiente para você se mexer. Boa sorte!
$product
no seu exemplo é uma instância deMage_Catalog_Model_Product
, que é um "modelo" na linguagem Magento.