Informacje o modelu kolekcji i modelu zasobów

29

Jestem trochę zdezorientowany w kwestii korzystania z modelu zasobów i modelu kolekcji. Czasami, gdy widzę przykłady ładowania produktów przy użyciu określonych atrybutów, w niektórych przykładach używają modelu kolekcji, a czasem używają modelu zasobów.

Także wtedy, gdy mogę użyć konkretnej metody get...i set...wraz z nazwą tabeli wiersz? Jak getName, getId. Próbowałem użyć, ale nie mogłem pobrać wartości i wyświetla się błąd: „wywołanie niezdefiniowanej metody w obiekcie”

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

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

Pokazuje „niezdefiniowaną metodę getSku()

Jeśli var_dump($product)użyję, SKU pokazuje się w obiekcie, jednak nie można uzyskać SKU przy użyciu getSku()...

MagentoBoy
źródło
Dla jasności - $productw twoim przykładzie jest instancja Mage_Catalog_Model_Product, która jest „modelem” w języku Magento.
zyskuje
Tak, racja. ale jestem zdezorientowany, kiedy użyć modelu kolekcji i modelu zasobów oraz jakie metody są dostępne. Jak widzę modele kolekcji są dostępne w Model >> folder kolekcji modułu, a zasoby są dostępne w modelu zasobów, ale kiedy i który model należy użyć, więc trochę się
myliłem
Wiem, że musimy użyć dostępnych metod, które są dostępne w kolekcji i na zewnątrz. Ale trudno mi znaleźć odpowiedni model. Poza tym nie jestem w stanie uzyskać wyniku z zestawu wyników za pomocą metod „Get” oznacza getName () przy użyciu nazwy wiersza tabeli bazy danych. Pokazuje niezdefiniowaną metodę w obiekcie, co oznacza, że ​​uzyskuję dostęp do niewłaściwego modelu lub metody, której muszę użyć, więc nie potwierdzam, której muszę użyć.
MagentoBoy,
1
Dzięki, że
zadałeś

Odpowiedzi:

63

Modele CRUD Magento mają trzy podstawowe typy klas.

„Model” jest najczęściej używany. Reprezentuje to dane określonego typu w sposób agnostyczny z bazą danych (produkt, kategoria, strona CMS, przegląd itp.)

„Model zasobów” to klasa, która za kulisami faktycznie pobiera dane z Magento. Każdy model ma model zasobów, który służy do ładowania pojedynczej instancji modelu z bazy danych.

„Kolekcja” to klasa, która ładuje tablicową strukturę wielu modeli na podstawie zestawu reguł. Pomyśl o tym jak o SQL WHERE clause.

Mylące rzeczy nieco to, za kulisami, Magento również uważa kolekcję być wzorem zasobów. Istnieją więc modele zasobów kolekcji i indywidualne modele zasobów .

Mówiąc ogólnie, gdy chcesz załadować określony przedmiot, używasz modelu . Gdy chcesz załadować kilka elementów, korzystasz z modelu zasobów kolekcji .

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

Jedną z rzeczy, o których należy pamiętać przy ładowaniu za pomocą modelu zasobów kolekcji, jest to, że afterLoad metoda każdego modelu nie będzie wywoływana automatycznie, co oznacza, że ​​niektóre dane mogą nie zostać załadowane.

W modelu zasobów individua zajęcia zazwyczaj nie są dostępne bezpośrednio. Czasami jednak określony model będzie miał model zasobów z przydatną metodą. Te odkryjesz z czasem za pomocą systemu.

Wreszcie należy wprowadzić jeszcze jedno rozróżnienie. Zwykłe modele CRUD Magento mają specjalną składnię do ładowania przez coś, co nie jest identyfikatorem numerycznym. Na przykład, oto jak załadować model strony CMS według tytułu

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

Jednak kilka modeli Magento to modele EAV. Oznacza to „wartość atrybutu bytu” i jest fantazyjnym sposobem powiedzenia, że ​​te modele nie mają ustalonego zestawu pól. Dotyczy to modeli produktów i modeli kategorii. Ta funkcja pozwala wybrać różne atrybuty dla różnych rodzajów produktów. Każde pole w modelu EAV jest znane jako atrybut. Powyższa składnia nie będzie działać z tymi modelami, zamiast tego musisz użyć loadByAttributemetody.

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

Jeśli chodzi o konkretny problem, jeśli pojawia się błąd z niezdefiniowaną metodą „tekst”, oznacza to, że coś jest bardzo nie tak z twoim systemem. Nawet jeśli getSkumetoda nie istnieje, Magento ma metody ustawiające magię i metody pobierające, które zapewniają, że getwywołanie dowolnego modelu zawsze coś zwróci, nawet jeśli jest zerowe.

Bardziej prawdopodobne jest, że wystąpi błąd podobny do następującego

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

Ten błąd występuje, ponieważ loadByAttributemetoda zwraca, falsejeśli nie może załadować obiektu.

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

Wypróbuj coś takiego w swoim kodzie.

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

Oprócz warunkowej zwróć uwagę na getData()metodę. Zwróci tablicę wszystkich danych obiektu jako tablicę.

Mam nadzieję, że to wystarczy, abyś się poruszał. Powodzenia!

Alan Storm
źródło
@Alan .. Bardzo fajny opis ... Przeczytałem wiele twoich postów na Magento :) .. Cieszę się, widząc twoją odpowiedź na mój post. Pójdę naprzód z twoimi informacjami. Jeśli otrzymam jakiś problem, mam nadzieję, że otrzymam dobre wsparcie od tej społeczności. Jako, że jestem nowy w Magento, a także w programowaniu, moje pytanie może być nie tyle koncepcyjne, ale nadal chcę się uczyć. Naprawdę lubię dużo Magento Framework :) .. Dziękuję, proszę pana :)
MagentoBoy
Przepraszam, mam jeszcze jedno pytanie. Jeśli zadzwonię do $ product = Mage :: getModel ('catalog / product'); a następnie jeśli wywołam getName () i getSku (). Czy mogę uzyskać wartości, jeśli iteruję produkt $ w foreachloop? czy muszę wywołać metodę loadByAttribute ()?
MagentoBoy,
@MagentoBoy Przepraszam, ale wydaje się, że bariera językowa maskuje twoje pytanie. Nie jestem pewien, o co pytasz.
Alan Storm,
przepraszam. Z podniecenia nie wyraziłem jasno swojego pytania. Ale próbowałem i teraz jestem w stanie uzyskać listy produktów i jak teraz mogę pobrać produkty przy użyciu różnych atrybutów poprawnie. :) i tak moje pytanie brzmiało: czy mogę używać metod get, takich jak getName (), getPrice (), getSku (), bez wywoływania funkcji addAttributeToSelect ('*'), addAttributeToFilter () lub loadByAttribute (); na przykład $ product = Mage :: getModel („katalog / produkt”); foreach ($ produkt jako $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Ponieważ get model utworzy instancję klasy produktu, wówczas będziemy mogli uzyskać dostęp do metod uzyskiwania i ustawiania .
MagentoBoy,
1
@ user8009 Ten komunikat o błędzie może się zdarzyć z wielu powodów. Jeśli nie możesz uzyskać dostępu do FTP lub odtworzyć problemu w lokalnej / rozwojowej wersji systemu, nigdy nie rozwiążesz problemu.
Alan Storm,