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ć loadByAttribute
metody.
$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 getSku
metoda nie istnieje, Magento ma metody ustawiające magię i metody pobierające, które zapewniają, że get
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
Call to a member function getSku() on a non-object
Ten błąd występuje, ponieważ loadByAttribute
metoda zwraca, false
jeś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!
$product
w twoim przykładzie jest instancjaMage_Catalog_Model_Product
, która jest „modelem” w języku Magento.