Warstwa danych czyli o modelach i kolekcjach w Magento

Oceń ten post

Pierwszą rzeczą jaka mi przyszła do głowy ucząc się Magento, było pytanie jak pobrać cokolwiek z  bazy danych przy użyciu SQL. Da się, ale z różnych względów nie jest to praktykowane. Magento ma w swojej strukturze abstrakcyjną warstwę bazodanową. Oznacza to, że nie formułuje się bezpośrednio zapytań w SQL a używa się klas i metod do pobierania i zapisywania danych.

Operacje na modelach przebiegają praktycznie tak samo dla wszystkich typów obiektów. W przykładzie posłużę się najczęściej używanym typem danych jakim jest produkt. W dowolnym miejscu można użyć tego kodu.

Najpierw chcemy załadować produkt:

$product = Mage::getModel('catalog/product')->load(111);

Aby pobrać wszystkie dane z produktu o id 111:

$product->getData();

Aby pobrać konkretny atrybut:

$product->getData('sku');

lub przy użyciu metody magicznej

$product->getSku();

To chyba najpopularniejsze zastosowanie, które może przydać się w szczególności twórcom szablonów Magento.

Teraz chcemy dokonać zmian w naszym produkcie:

$product->setData('sku','nowe_sku');

lub

$product->setSku('nowe_sku');

i zapisać produkt:

$product->save();

Możemy też usunąć produkt:

$product->delete();

 Kolekcje produktów

Powyższe przykłady dotyczyły pojedynczego produktu, ale często zależy nam na operacjach na pewnej grupie. Z pomocą przychodzą nam kolekcje danych.

$collection = Mage::getModel('catalog/product')->getCollection();

W tym momencie w naszej kolekcji znajdują się wszystkie produkty ze sklepu Magento. Co zrobić aby zawęzić ten zbiór? Dodajemy atrybut do filtra:

$collection->addAttributeToFilter('sku', array('like' => 'SKU%'));

$collection->addAttributeToFilter('status', array('eq' => 1));

Kolekcje domyślnie nie ładują wszystkich atrybutów, więc warto dodać te, które nam będą potrzebne:

$collection->addAttributeToSelect(array('name', 'product_url', 'small_image'));

Kolekcje w Magento implementują interfejs IteratorAggregate, co pozwala nam na poruszanie się po niej jak po tablicy przy użyciu pętli for lub foreach.

foreach($collection as $product){
echo $product->getSku();
}

Iterując po kolekcji możemy dokonywać modyfikacji produktów przy pomocy metod opisanych powyżej.