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()
...
magento-1.7
collection
product-list
resource-model
MagentoBoy
źródło
źródło
$product
w twoim przykładzie jest instancjaMage_Catalog_Model_Product
, która jest „modelem” w języku Magento.Odpowiedzi:
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 .
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
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ć
loadByAttribute
metody.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
getSku
metoda nie istnieje, Magento ma metody ustawiające magię i metody pobierające, które zapewniają, żeget
wywoł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
Ten błąd występuje, ponieważ
loadByAttribute
metoda zwraca,false
jeśli nie może załadować obiektu.Wypróbuj coś takiego w swoim kodzie.
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!
źródło