Informationen zum Sammlungsmodell und zum Ressourcenmodell

29

Ich bin etwas verwirrt über die Verwendung von Ressourcenmodellen und Sammlungsmodellen. Manchmal, wenn ich Beispiele zum Laden von Produkten mit bestimmten Attributen sehe, verwenden sie in einigen Beispielen das Sammlungsmodell und manchmal das Ressourcenmodell.

Auch wenn kann ich bestimmte Methode get...und set...zusammen mit Tabellenzeile Namen? Wie getName, getId. Ich habe versucht, die Werte zu verwenden, konnte sie jedoch nicht abrufen. Es wird der Fehler "Aufrufen einer undefinierten Methode im Objekt" angezeigt.

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

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

Es zeigt "undefinierte Methode getSku()"

Wenn ich benutze var_dump($product), wird die SKU im Objekt angezeigt, die SKU kann jedoch nicht mit getSku()... abgerufen werden .

MagentoBoy
quelle
Um es klar auszudrücken: $productIn Ihrem Beispiel ist dies eine Instanz von Mage_Catalog_Model_Product, die im Magento-Sprachgebrauch ein "Modell" darstellt.
benmarks
Ja richtig. Ich bin jedoch verwirrt, wann das Sammlungsmodell und das Ressourcenmodell zu verwenden sind und welche Methoden zur Verfügung stehen. Wie ich sehe, sind Sammlungsmodelle im Modell >> Sammlungsordner des Moduls verfügbar und Ressourcen sind im Ressourcenmodell verfügbar, aber wann und welches Modell verwendet werden muss, darüber bin ich ein bisschen verwirrt
MagentoBoy
Ich weiß, wir müssen die verfügbaren Methoden verwenden, die auch in der Sammlung und im Outsourcing verfügbar sind. Aber ich bin schwer zu finden, um das richtige Modell zu verwenden. Und ich bin auch nicht in der Lage, das Ergebnis aus der Ergebnismenge mit "Get" -Methoden zu erhalten, dh getName () unter Verwendung des Zeilennamens der Datenbanktabelle. Es zeigt undefinierte Methode in Objekt bedeutet, dass ich auf ein falsches Modell oder eine falsche Methode zugreife, die ich verwenden muss, damit ich nicht feststelle, welche Methode ich verwenden muss.
MagentoBoy
1
Vielen Dank, dass Sie diese Frage gestellt haben.
Ich habe

Antworten:

63

Die CRUD-Modelle von Magento verfügen über drei grundlegende Klassentypen.

Ein "Modell" wird am häufigsten verwendet. Dies stellt Daten eines bestimmten Typs datenbankunabhängig dar (Produkt, Kategorie, CMS-Seite, Überprüfung usw.).

Ein "Ressourcenmodell" ist eine Klasse, die hinter den Kulissen das eigentliche Abrufen von Daten aus Magento ausführt. Jedes Modell verfügt über ein Ressourcenmodell , mit dem eine einzelne Instanz eines Modells aus der Datenbank geladen wird .

Eine "Sammlung" ist eine Klasse, die eine Array-ähnliche Struktur mehrerer Modelle basierend auf einer Reihe von Regeln lädt. Stellen Sie es sich wie eine SQL vor WHERE clause.

Dinge etwas verwirrend ist, hinter den Kulissen, Magento auch eine Sammlung der Ansicht , ein Ressourcenmodell sein. Es gibt also Sammlungsressourcenmodelle und einzelne Ressourcenmodelle .

Wenn Sie einen bestimmten Artikel laden möchten, verwenden Sie im Allgemeinen ein Modell . Wenn Sie mehrere Elemente laden möchten, verwenden Sie ein Sammlungsressourcenmodell .

//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());
}

Beachten Sie beim Laden über ein Sammlungsressourcenmodell, dass die afterLoad Methode jedes einzelnen Modells nicht automatisch aufgerufen wird. Dies bedeutet, dass einige Daten möglicherweise nicht geladen werden.

Auf die einzelnen Ressourcenmodellklassen wird normalerweise nicht direkt zugegriffen. Gelegentlich verfügt ein bestimmtes Modell jedoch über ein Ressourcenmodell mit einer nützlichen Methode. Diese werden Sie im Laufe der Zeit mithilfe des Systems feststellen.

Schließlich ist noch eine Unterscheidung zu treffen. Magentos reguläre CRUD-Modelle haben eine spezielle Syntax zum Laden über etwas, das nicht die numerische ID ist. Beispiel: So laden Sie ein CMS-Seitenmodell nach Titel

$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());

Einige Magento-Modelle sind jedoch EAV-Modelle. Dies steht für "Entitätsattributwert" und ist eine originelle Art zu sagen, dass diese Modelle keine feste Menge von Feldern haben. Dies umfasst Produktmodelle und Kategoriemodelle. Mit dieser Funktion können Sie verschiedene Attribute für verschiedene Produkttypen auswählen. Jedes Feld in einem EAV-Modell wird als Attribut bezeichnet. Die obige Syntax funktioniert bei diesen Modellen nicht, stattdessen müssen Sie die loadByAttributeMethode verwenden.

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

Wenn Sie in Bezug auf Ihr spezifisches Problem eine Fehlermeldung mit dem spezifischen Text "Methode undefiniert" erhalten, stimmt etwas mit Ihrem System nicht. Auch wenn die getSkuMethode nicht vorhanden ist, verfügt Magento über Methoden zum Setzen und Abrufen von Zaubersprüchen, mit denen sichergestellt wird, dass ein getAufruf eines Modells immer etwas zurückgibt, auch wenn es null ist.

Wahrscheinlicher ist, dass Sie einen Fehler wie den folgenden erhalten

Call to a member function getSku() on a non-object

Dieser Fehler tritt auf, weil die loadByAttributeMethode zurückgibt, falsewenn das Objekt nicht geladen werden kann.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false

Versuchen Sie so etwas in Ihrem Code.

$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");
}

Beachten Sie zusätzlich zur Bedingung die getData()Methode. Dadurch wird ein Array aller Objektdaten als Array zurückgegeben.

Hoffentlich ist das genug, um dich in Bewegung zu bringen. Viel Glück!

Alan Storm
quelle
@Alan .. Sehr nette Beschreibung ... Ich habe viele Ihrer Beiträge auf Magento gelesen :) .. Ich freue mich so über Ihre Antwort auf meinen Beitrag. Ich werde mit Ihren Informationen weitermachen. Wenn ich dann ein Problem bekomme, hoffe ich, dass ich von dieser Community gute Unterstützung bekomme. Da ich neu in Magento bin und auch programmiere, ist meine Aussage vielleicht nicht so konzeptionell, aber ich möchte es trotzdem lernen. Ich mag Magento Framework sehr viel :) .. Vielen Dank, Sir :)
MagentoBoy
Es tut mir leid, ich habe noch eine Frage. Wenn ich $ product = Mage :: getModel ('catalog / product') aufrufe; und dann, wenn ich getName () und getSku () aufrufe. Kann ich die Werte abrufen, wenn ich das $ -Produkt in foreachloop iteriere? oder muss ich loadByAttribute () Methode aufrufen ??
MagentoBoy
@MagentoBoy Ich entschuldige mich, aber die Sprachbarriere scheint Ihre Frage zu überdecken. Ich bin nicht sicher, was Sie fragen.
Alan Storm
Sir, es tut mir leid. Vor Aufregung habe ich meine Frage nicht klar ausgedrückt. Aber ich habe es versucht und jetzt bin ich in der Lage, die Produktlisten abzurufen und die Produkte mit anderen Attributen richtig abzurufen. :) und ja, meine Frage war: Kann ich get-Methoden wie getName (), getPrice (), getSku () verwenden, ohne addAttributeToSelect ('*'), addAttributeToFilter () oder loadByAttribute () aufzurufen? zum Beispiel. $ product = Mage :: getModel ('Katalog / Produkt'); foreach ($ product as $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Da get model die Produktklasse instanziiert, können wir auf die Methoden access get und set zugreifen .
MagentoBoy
1
@ user8009 Diese Fehlermeldung kann aus unzähligen Gründen auftreten. Wenn Sie keinen FTP-Zugang erhalten oder das Problem nicht in einer lokalen / Entwicklungsversion des Systems reproduzieren können, können Sie das Problem niemals lösen.
Alan Storm