Magento Collections

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.

Collections(Kolekcje)

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();
?>

Przykładowy kod pobierze wszystkie rekordy z kategoriami i zwróci nam obiekt kolekcji wraz z modelami odpowiedzialnymi za przechowywanie ich. Mimo że to jest kolekcja jest obiektem, możemy jej użyc jako tablicy jeżeli chcemy np. wyświetlić nazwy wszystkich kategorii. Kod będzie wtedy wyglądał tak:
<?php
$kategorie
=Mage::getModel('catalog/category')->getCollection()->addAttributeToSelect('name')->load();
foreach(
$kategorie as $kategoria){
    echo 
$kategoria->getName();
}
?>

Metoda addAttributeToSelect(), nakazuje pobranie dodatkowego pola name - nazwy naszej kategorii.

Sortowanie

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().')';
}
?>

Przykładowy wynik:

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)

Kryteria doboru

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().')';
}
?>

Tutaj jednak zatrzymamy się chwile dłużej. Pierwszy paramter to oczywiście nazwa pola, dla którego dodajemy kryterium, drugi to wartość. Domyślnie oczywiście jest wykonywane porównanie, jeżeli jednak chcemy zmienić rodzaj, musismy za drugi argument wstawić tablice z nazwą określonego działania i przypisanym im własnością. Dostępne porównania obrazuje poniższa lista:

  • “from”=>$fromValue, “to”=>$toValue //ekwiwalent sql - > AND <
  • “like”=>$likeValue //ekwiwalent sql - LIKE
  • “neq”=>$notEqualValue //ekwiwalent sql - <>
  • “in”=>array($inValues) //ekwiwalent sql - IN
  • “nin”=>array($notInValues) //ekwiwalent sql - NOT IN
  • “eq”=>$equal //ekwiwalent sql - =
  • “nlike”=>$notlike //ekwiwalent sql - NOT LIKE
  • “is”=>$is //ekwiwalent sql - IS
  • “gt”=>$greaterthan //ekwiwalent sql - >
  • “lt”=>$lessthan //ekwiwalent sql - <
  • “gteq”=>$greterthanequal //ekwiwalent sql - >=
  • “lteq”=>$lessthanequal //ekwiwalent sql - <=
  • “finset”=>$unknown //ekwiwalent sql - brak
  • “date”=>true, “to” => $now //ekwiwalent sql - brak

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.

Your rating: Brak Ocena: 5 (2 votes)

Dodaj nową odpowiedź

Zawartość pola nie będzie udostępniana publicznie.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • You can use the <go> tags just like the <a> for nicer urls.

Więcej informacji na temat formatowania