Ostatnie dwa tygodnie, większość mojej pracy było związane z projektem opartym na Zend Framework, a było nim Magento. Niestety z początku praca nie wydawała mi sie z nim przyjemna, dokumentacja mizerna, najczęściej do wcześniejszych wersji, niekoniecznie kompatybilna z bieżącą wersją. Z tej bitwy jednak wyszedłem zwycięsko, więc powoli postaram się dzilić swoją więdzą. W pierwszej kolejności postaram się opisać troche zabawy z Collections, na przykładzie katalogu z produktami.
Kolekcje(Collections), jest to zestaw danych pobranych z bazy bądź innego źródła wraz z kryteriami doboru. Najprostszym przykładem jest pobranie zawartości całej tabeli dla modelu kategorii z katalogu.
<?php
$kategorie=Mage::getModel('catalog/category')->getCollection()->load();
?><?php
$kategorie=Mage::getModel('catalog/category')->getCollection()->addAttributeToSelect('name')->load();
foreach($kategorie as $kategoria){
echo $kategoria->getName();
}
?>Dzięki developerom magento, w przypadku jeżeli chcemy utworzyć pełne drzewo kategorii, nie musimy wcale męczyć sie z rekurencyjnym pobieraniem kategorii. W ów tabeli został zastowany sposób budowy drzewa kategorii w płaskiej strukturze danych(jaką jest baza mysql) zwany "materialized path". W tabeli posiadamy pole o nazwie path, w którym zapisane położenie naszego elementu w drzewie. Nie będe tłumaczył tutaj metody budowy drzewa, ponieważ na to możnaby poświęcić oddzielny artykuł, najważniejsza jest prostota pobrania całości, a mianowicie wystraczy posortować ascendentalnie wyniki po polu path. Głębokość w strukturze możemy określić albo na podstawie tego pola lub dzięki zaimplemetowanej metodzie getLevel(). Abo posortować odpowiednio wyniki do naszego kodu musimy dodać metodę, którą nasza kolekcja dziedziczy po rodzicu, czyli addAttributeToSort(). Metoda ta przyjmuje dwa argumenty pierwszy to pole sortowania, a drugie kierunek. W przykładzie dodamy wcięcie dla elementów potomnych, aby dokładnie zobrazować strukture kategorii.
<?php
$kategorie=Mage::getModel('catalog/category')->getCollection()->addAttributeToSelect('name')->addAttributeToSort('path','ASC')->load();
foreach($kategorie as $kategoria){
$wciecie='';
for($i=0; $i<$kategoria->getLevel();$i++){
$wciecie.='--';
}
echo $wciecie.$kategoria->getName().' ('.$kategoria->getId().')';
}
?>Root Catalog (1) --Kategoria 1 (2) --Kategoria 2 (3) ----Kategoria 2.1 (6) --Kategoria 3 (4) ----Kategoria 3.1 (5) ------Kategoria 3.1.1 (7) ----Kategoria 3.2 (11) --Kategoria 4 (10) ----Kategoria 4.1 (9)
Mamy już pobrane posortowane, "ułożone" kategorie, ale wsród kolekcji są pozycje aktywne oraz nie aktywne. Naszym zadaniem teraz będzie wyświetlić tylko kategorie aktywne. Do tego celu posłuży nam metoda addFieldToFilter() oraz pole is_active, które zawiera cyfry 0(niektywna)/1(aktywna). Nasz kod więc będzie wyglądał nastepująco:
<?php
$kategorie=Mage::getModel('catalog/category')->getCollection()->addFieldToFilter('is_active',array('eq'=>1))->addAttributeToSelect('name')->addAttributeToSort('path','ASC')->load();
foreach($kategorie as $kategoria){
$wciecie='';
for($i=0; $i<$kategoria->getLevel();$i++){
$wciecie.='--';
}
echo $wciecie.$kategoria->getName().' ('.$kategoria->getId().')';
}
?>Filtry oczywiście możemy dodawać, są one łączone za pomoca AND w zapytaniu, a więc jak np. chcemy pobrać aktywne kategorie zaczynające się od litery "N", mysimy wykonać:
<?php
$kategorie=Mage::getModel('catalog/category')->getCollection()->addAttributeToSelect('name')->addFieldToFilter('is_active',array('eq'=>1))->addFieldToFilter('name',array('like'=>'N%'))->addAttributeToSort('path','ASC')->load();
foreach($kategorie as $kategoria){
echo $kategoria->getName();
}
?>W nastepnym artykule postaram się wyjaśnić zawiły proces tworzenia modułów dla Magento.
Dodaj nową odpowiedź