I modelli CRUD di Magento hanno tre tipi di classe di base.
Un "modello" è ciò che utilizzerai più comunemente. Ciò rappresenta i dati di un determinato tipo in modo agnostico nel database (prodotto, categoria, pagina CMS, revisione, ecc.)
Un "modello di risorsa" è una classe che, dietro le quinte, esegue l'effettivo recupero di dati da Magento. Ogni modello ha un modello di risorsa che viene utilizzato per caricare una singola istanza di un modello dal database.
Una "raccolta" è una classe che carica una struttura simile a matrice di più modelli basata su un insieme di regole. Pensalo come un SQL WHERE clause
.
Un po 'di confusione è che dietro le quinte Magento considera anche una collezione un modello di risorsa. Quindi ci sono modelli di risorse di raccolta e modelli di risorse individuali .
In generale, quando si desidera caricare un articolo specifico, si utilizza un modello . Quando si desidera caricare un numero di elementi, si utilizza un modello di risorsa di raccolta .
//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());
}
Una cosa da tenere a mente sul caricamento tramite un modello di risorsa di raccolta è che il afterLoad
metodo di ogni singolo modello non verrà chiamato automaticamente, il che significa che alcuni dati potrebbero non essere caricati.
Le classi dei singoli modelli di risorse di solito non sono accessibili direttamente. Tuttavia, a volte un modello specifico avrà un modello di risorsa con un metodo utile su di esso. Questi li scoprirai nel tempo usando il sistema.
Infine, c'è ancora una distinzione da fare. I normali modelli CRUD di Magento hanno una sintassi speciale per il caricamento tramite qualcosa che non è l'ID numerico. Ad esempio, ecco come caricare un modello di pagina CMS per titolo
$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());
Tuttavia, alcuni modelli Magento sono modelli EAV. Questo significa "valore dell'attributo entità" ed è un modo elegante per dire che questi modelli non hanno un set fisso di campi. Ciò include i modelli di prodotto e i modelli di categoria. Questa funzione consente di scegliere attributi diversi per diversi tipi di prodotti. Ogni campo su un modello EAV è noto come un attributo. La sintassi sopra non funziona con questi modelli, invece è necessario utilizzare il loadByAttribute
metodo
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');
Per quanto riguarda il tuo problema specifico, se ricevi un errore con il testo specifico "metodo non definito", allora qualcosa non va nel tuo sistema. Anche se il getSku
metodo non esiste, Magento ha metodi di settaggio magico e getter che assicurano che una get
chiamata su qualsiasi modello restituisca sempre qualcosa, anche se è nulla.
La cosa più probabile è che stai ricevendo un errore come il seguente
Call to a member function getSku() on a non-object
Questo errore si verifica perché il loadByAttribute
metodo restituisce false
se non è possibile caricare l'oggetto.
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false
Prova qualcosa di simile nel tuo codice.
$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");
}
Oltre al condizionale, notare il getData()
metodo. Ciò restituirà un array di tutti i dati dell'oggetto come un array.
Spero che questo sia abbastanza per farti muovere. In bocca al lupo!
$product
nel tuo esempio è un'istanza diMage_Catalog_Model_Product
, che è un "modello" nel linguaggio Magento.