Informazioni sul modello di raccolta e sul modello di risorsa


29

Sono un po 'confuso sull'uso del modello delle risorse e del modello di raccolta. A volte quando vedo esempi per il caricamento di prodotti che utilizzano attributi specifici, in alcuni esempi usano il modello di raccolta e talvolta usano il modello di risorsa.

Inoltre, quando posso usare un metodo specifico get...e set...insieme al nome della riga della tabella? Come getName, getId. Ho provato a usare ma non sono riuscito a ottenere i valori e mostra l'errore: "chiamare metodo indefinito nell'oggetto"

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

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

Mostra "metodo indefinito getSku()"

Se uso var_dump($product), lo SKU viene mostrato nell'oggetto, tuttavia non riesco a ottenere lo SKU utilizzando getSku()...


Per essere chiari - $productnel tuo esempio è un'istanza di Mage_Catalog_Model_Product, che è un "modello" nel linguaggio Magento.
benmarks

Sì giusto. ma sono confuso quando utilizzare il modello di raccolta e il modello delle risorse e quali metodi sono disponibili per l'uso. Come vedo, i modelli di raccolta sono disponibili nella cartella Modello >> raccolta del modulo e le risorse sono disponibili nel modello di risorse, ma quando e quale modello è necessario utilizzare, quindi mi sono un po 'confuso al riguardo
MagentoBoy

Lo so, dobbiamo usare i metodi disponibili che sono disponibili anche in raccolta e in outsourcing. Ma ho difficoltà a trovare il modello corretto. Inoltre, non sono in grado di ottenere il risultato dal set di risultati utilizzando i metodi "Get" significa getName () utilizzando il nome della riga della tabella del database. Mostra un metodo indefinito nell'oggetto significa che sto accedendo a un modello o metodo sbagliato che devo usare, quindi non sono d'accordo su quale devo usare.
MagentoBoy,

1
Grazie per aver posto questa domanda ... stavo cercando una risposta per questa domanda da molto tempo .. +1 ..
Elavarasan

Risposte:


63

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 loadByAttributemetodo

$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 getSkumetodo non esiste, Magento ha metodi di settaggio magico e getter che assicurano che una getchiamata 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 loadByAttributemetodo restituisce falsese 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!


@Alan .. Molto bella descrizione ... Ho letto molti dei tuoi post su Magento :) .. Sono così felice dopo aver visto la tua risposta al mio post. Continuerò con le tue informazioni. Se avrò qualche problema, spero di ottenere un buon supporto da questa community. Dato che sono nuovo di Magento, oltre a pogramming, la mia domanda potrebbe non essere tanto concettuale, ma comunque voglio imparare. Mi piace molto il framework magento :) .. Grazie signore :)
MagentoBoy,

Mi dispiace, ho ancora una domanda. Se chiamo $ product = Mage :: getModel ('catalog / product'); e poi se chiamo getName () e getSku (). sono in grado di ottenere i valori se eseguo l'iterazione del prodotto $ in foreachloop ?? o devo chiamare il metodo loadByAttribute () ??
MagentoBoy,

@MagentoBoy Mi scuso, ma la barriera linguistica sembra mascherare la tua domanda. Non sono sicuro di quello che stai chiedendo.
Alan Storm,

signore, mi dispiace. Per l'eccitazione non ho espresso chiaramente la mia domanda. Ma ho provato e ora sono in grado di ottenere gli elenchi di prodotti e come ora in grado di recuperare i prodotti utilizzando correttamente l'attributo diverso. :) e sì, la mia domanda era: posso usare metodi get come getName (), getPrice (), getSku (), senza chiamare addAttributeToSelect ('*'), addAttributeToFilter () o loadByAttribute (); per es. $ product = Mage :: getModel ('catalogue / product'); foreach ($ product as $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Poiché get model istanzia la classe di prodotti, possiamo accedere ai metodi get e set di accesso .
MagentoBoy,

1
@ user8009 Questo messaggio di errore può accadere per una miriade di ragioni. Se non riesci ad ottenere l'accesso FTP o riprodurre il problema in una versione locale / di sviluppo del sistema, non risolverai mai il problema.
Alan Storm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.