Tytuł oryginału Magento PHP Developers Guide
Tłumaczenie Daniel Kaczmarek
ISBN 978-83-246-8940-8
Copyright copy 2013 Packt Publishing
First published in the English language under the title bdquoMagento PHP Developers Guiderdquo
Polish edition copyright copy 2014 by Helion SA All rights reserved
All rights reserved No part of this book may be reproduced or transmitted in any form or by any means electronic or mechanical including photocopying recording or by any information storage retrieval system without permission from the Publisher
Wszelkie prawa zastrzeżone Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione Wykonywanie kopii metodą kserograficzną fotograficzną a także kopiowanie książki na nośniku filmowym magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań by zawarte w tej książce informacje były kompletne i rzetelne Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich Autor oraz Wydawnictwo HELION nie ponoszą roacutewnież żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce
Wydawnictwo HELIONul Kościuszki 1c 44-100 GLIWICEtel 32 231 22 19 32 230 98 63e-mail helionhelionplWWW httphelionpl (księgarnia internetowa katalog książek)
Drogi CzytelnikuJeżeli chcesz ocenić tę książkę zajrzyj pod adres httphelionpluseropiniemagphpMożesz tam wpisać swoje uwagi spostrzeżenia recenzję
Printed in Poland
bull Kup książkębull Poleć książkę bull Oceń książkę
bull Księgarnia internetowabull Lubię to raquo Nasza społeczność
Spis tre ci
O autorze 7
O redaktorach 9
Przedmowa 11
O czym jest ta ksi ka 11Wymagania pocz tkowe 12Dla kogo jest ta ksi ka 12Konwencje zastosowane w ksi ce 13Przyk adowe kody roacuted owe 13
Rozdzia 1 Rozpoznanie i instalacja rodowiska rozwojowego 15
Podstawowe informacje na temat LAMP 15Uruchamianie VirtualBox 16Uruchomienie maszyny wirtualnej 19Instalacja serwera Apache2 23Instalacja PHP 24Instalacja serwera MySQL 25Konfiguracja rodowiska docelowego 25
Konfiguracja i uruchamianie rodowiska przy u yciu Vagrant 28Instalacja narz dzia Vagrant 29
Wyboacuter zintegrowanego rodowiska programistycznego 31Korzystanie z systemu kontroli wersji 31Podsumowanie 32
Rozdzia 2 Podstawy Magento dla programistoacutew 33
Zend Framework mdash podstawa Magento 33Struktura folderoacutew Magento 35Architektura modu owa 36
Modu automatycznego adowania 37Pule kodu 38
Kup książkę Poleć książkę
Spis tre ci
4
Obiekty cie ek i przep yw da 39MVC w wersji Magento 43
Modele 47Widoki 47Analiza pliku uk adu 48Kontrolery 50
Witryny WWW i zasi gi sklepoacutew 51Nazwy i funkcje wytwoacutercze 52Zdarzenia i obserwatory 55
Generator zdarzenia 56Wi zania obserwatoroacutew 58
Podsumowanie 59
Rozdzia 3 ORM i kolekcje danych 61
Struktura modelu Magento 62Metody magiczne 64
Model EAV 68Czym jest model EAV 68Odczytywanie danych 73
Korzystanie z kolekcji Magento 76Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 78Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 79Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 80Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 80Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 81Dodanie wielu kryterioacutew porz dkowania 81
Wykonywanie bezpo rednich zapyta j zyka SQL 82Odczyt 83Zapisywanie 84
Podsumowanie 84
Rozdzia 4 Programowanie interfejsu u ytkownika 85
Rozszerzenie Magento 85Scenariusz 85Funkcje 86Dalszy rozwoacutej 86
Witaj Magento 87Konfiguracja XML modu u 90Modele i zapisywanie danych 92
Tworzenie modeli 93Zasoby konfiguracyjne 98Czego si dowiedzieli my 106
Definiowanie cie ek 107Kontroler indeksu 108Kontroler wyszukiwania 113Kontroler widoku 115
Kup książkę Poleć książkę
Spis tre ci
5
Bloki i uk ady 116Bloki i widoki kontrolera IndexController 117Bloki i widoki kontrolera SearchController 123Bloki i widoki kontrolera ViewController 127Dodawanie produktoacutew do listy prezentoacutew 128
Podsumowanie 128
Rozdzia 5 Programowanie modu u administracyjnego 129
Rozbudowa modu u Adminhtml 130Powroacutet do konfiguracji 132
Wid et siatki 136Zarz dzanie listami prezentoacutew 140Uprawnienia i lista kontroli dost pu 141Zbiorcza zmiana danych za pomoc akcji masowych 145
Wid et formularza 147adowanie danych 151
Zapisywanie danych 152Podsumowanie 153
Rozdzia 6 API Magento 155
Core API 155XML-RPC 156SOAP 157API REST 159
Korzystanie z API 160Definiowanie danych logowania dla protoko oacutew XML-RPC i SOAP 160Definiowanie danych logowania dla protoko u REST API 162adowanie i odczytywanie danych 164
Zmienianie danych 165Usuwanie produktu 166
Rozszerzanie API 167Rozszerzanie API REST 175
Zabezpieczanie API 177Podsumowanie 178
Rozdzia 7 Testowanie i zapewnienie jako ci 179
Testowanie Magento 180Testy jednostkowe 180Testy regresyjne 180Testy funkcjonalne 181Programowanie sterowane przez testy (TDD) 181
Platformy i narz dzia do testowania 182Testy jednostkowe z wykorzystaniem PHPUnit 182Testy funkcjonalne z wykorzystaniem biblioteki Mink 195
Pierwszy test 196Podsumowanie 199
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 8 Wdra anie i dystrybucja 201
Minimalizacja czasu wdro enia 201Od pocz tku stosuj zalecane praktyki 202Upewnij si e na roacute nych rodowiskach uzyskasz identyczne wyniki 202Jak gotowe to gotowe 203
Rola systemoacutew kontroli wersji w procesie wdro enia 204SVN 204Git 204
Dystrybucja 206Umieszczanie rozszerzenia w pakiecie 207
Publikowanie rozszerzenia 212Podsumowanie 214
Dodatek A Witaj Magento 215
Konfiguracja 215Kontroler 216Test dzia ania cie ki 217
Skorowidz 219
Kup książkę Poleć książkę
O autorze
Allan McGregor posiada certyfikat Magento Certified Developer Plus i od czterech lat pracujez Magento Uzyska tak e certyfikat Linux System Administration wydany przez firm IBM
Swoj przygod z Magento rozpocz jako samodzielny programista ktoacutery szuka najlepszegonarz dzia do tworzenia rozwi za e-commercersquoowych Obecnie pracuje jako g oacutewny progra-mista Magento w firmie Demac Media (wwwdemacmediacom) Allan jest te pasjonatem pro-gramowania stale poszukuj cym nowych lepszych technologii i narz dzi programistycznych
W Demac Media Allan wspoacute tworzy rozwi zania dla roacute norodnych klientoacutew Dzi ki temuzdoby do wiadczenie oraz wiedz ktoacutera pozwala mu stawia czo a nawet najtrudniejszymwyzwaniom zwi zanym z wykorzystaniem Magento
W ramach jednego z projektoacutew wewn trznych prowadzonych w Demac Media Allan tworzynarz dzie Triplecheckio (httptriplecheckio) mdash pioniersk us ug ktoacutera monitoruje i audy-tuje poprawno kodu roacuted owego sklepu stworzonego w Magento Wpisy McGregora mo naledzi na Twitterze pod adresem httpwwwtwittercomallanmcgregor
Praca nad t ksi k by a dla mnie ogromnym wyzwaniem ktoacutere jednak w pe ni si op aci o W trakciepisania dowiedzia em si wielu nowych rzeczy na temat Magento a tak e kilku o samym sobie mdash za-roacutewno o cz owieku jak i o programi cie
W pierwszej kolejno ci chc podzi kowa mojej wspania ej onie za jej bezwarunkowe wsparcie i zro-zumienie ktoacutere okazuje mi gdy pracuj nad coraz to nowymi projektami
Dzi kuj te Matthew Bertulliemu i Dimitriemu Colomvakosowi wspoacute za o ycielom Demac Mediaza wsparcie ktoacutere mi okazywali
Michael Krietzer i Corey Slavnik moi przyjaciele i wspoacute pracownicy z wielk ochot po wi cali swoacutejwolny czas aby zredagowa t ksi k
Specjalne podzi kowania kieruj do ca ej rodziny Demac Media
To co uda o mi si zdoby osi gn em dzi ki Wam
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
8
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Spis tre ci
O autorze 7
O redaktorach 9
Przedmowa 11
O czym jest ta ksi ka 11Wymagania pocz tkowe 12Dla kogo jest ta ksi ka 12Konwencje zastosowane w ksi ce 13Przyk adowe kody roacuted owe 13
Rozdzia 1 Rozpoznanie i instalacja rodowiska rozwojowego 15
Podstawowe informacje na temat LAMP 15Uruchamianie VirtualBox 16Uruchomienie maszyny wirtualnej 19Instalacja serwera Apache2 23Instalacja PHP 24Instalacja serwera MySQL 25Konfiguracja rodowiska docelowego 25
Konfiguracja i uruchamianie rodowiska przy u yciu Vagrant 28Instalacja narz dzia Vagrant 29
Wyboacuter zintegrowanego rodowiska programistycznego 31Korzystanie z systemu kontroli wersji 31Podsumowanie 32
Rozdzia 2 Podstawy Magento dla programistoacutew 33
Zend Framework mdash podstawa Magento 33Struktura folderoacutew Magento 35Architektura modu owa 36
Modu automatycznego adowania 37Pule kodu 38
Kup książkę Poleć książkę
Spis tre ci
4
Obiekty cie ek i przep yw da 39MVC w wersji Magento 43
Modele 47Widoki 47Analiza pliku uk adu 48Kontrolery 50
Witryny WWW i zasi gi sklepoacutew 51Nazwy i funkcje wytwoacutercze 52Zdarzenia i obserwatory 55
Generator zdarzenia 56Wi zania obserwatoroacutew 58
Podsumowanie 59
Rozdzia 3 ORM i kolekcje danych 61
Struktura modelu Magento 62Metody magiczne 64
Model EAV 68Czym jest model EAV 68Odczytywanie danych 73
Korzystanie z kolekcji Magento 76Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 78Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 79Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 80Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 80Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 81Dodanie wielu kryterioacutew porz dkowania 81
Wykonywanie bezpo rednich zapyta j zyka SQL 82Odczyt 83Zapisywanie 84
Podsumowanie 84
Rozdzia 4 Programowanie interfejsu u ytkownika 85
Rozszerzenie Magento 85Scenariusz 85Funkcje 86Dalszy rozwoacutej 86
Witaj Magento 87Konfiguracja XML modu u 90Modele i zapisywanie danych 92
Tworzenie modeli 93Zasoby konfiguracyjne 98Czego si dowiedzieli my 106
Definiowanie cie ek 107Kontroler indeksu 108Kontroler wyszukiwania 113Kontroler widoku 115
Kup książkę Poleć książkę
Spis tre ci
5
Bloki i uk ady 116Bloki i widoki kontrolera IndexController 117Bloki i widoki kontrolera SearchController 123Bloki i widoki kontrolera ViewController 127Dodawanie produktoacutew do listy prezentoacutew 128
Podsumowanie 128
Rozdzia 5 Programowanie modu u administracyjnego 129
Rozbudowa modu u Adminhtml 130Powroacutet do konfiguracji 132
Wid et siatki 136Zarz dzanie listami prezentoacutew 140Uprawnienia i lista kontroli dost pu 141Zbiorcza zmiana danych za pomoc akcji masowych 145
Wid et formularza 147adowanie danych 151
Zapisywanie danych 152Podsumowanie 153
Rozdzia 6 API Magento 155
Core API 155XML-RPC 156SOAP 157API REST 159
Korzystanie z API 160Definiowanie danych logowania dla protoko oacutew XML-RPC i SOAP 160Definiowanie danych logowania dla protoko u REST API 162adowanie i odczytywanie danych 164
Zmienianie danych 165Usuwanie produktu 166
Rozszerzanie API 167Rozszerzanie API REST 175
Zabezpieczanie API 177Podsumowanie 178
Rozdzia 7 Testowanie i zapewnienie jako ci 179
Testowanie Magento 180Testy jednostkowe 180Testy regresyjne 180Testy funkcjonalne 181Programowanie sterowane przez testy (TDD) 181
Platformy i narz dzia do testowania 182Testy jednostkowe z wykorzystaniem PHPUnit 182Testy funkcjonalne z wykorzystaniem biblioteki Mink 195
Pierwszy test 196Podsumowanie 199
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 8 Wdra anie i dystrybucja 201
Minimalizacja czasu wdro enia 201Od pocz tku stosuj zalecane praktyki 202Upewnij si e na roacute nych rodowiskach uzyskasz identyczne wyniki 202Jak gotowe to gotowe 203
Rola systemoacutew kontroli wersji w procesie wdro enia 204SVN 204Git 204
Dystrybucja 206Umieszczanie rozszerzenia w pakiecie 207
Publikowanie rozszerzenia 212Podsumowanie 214
Dodatek A Witaj Magento 215
Konfiguracja 215Kontroler 216Test dzia ania cie ki 217
Skorowidz 219
Kup książkę Poleć książkę
O autorze
Allan McGregor posiada certyfikat Magento Certified Developer Plus i od czterech lat pracujez Magento Uzyska tak e certyfikat Linux System Administration wydany przez firm IBM
Swoj przygod z Magento rozpocz jako samodzielny programista ktoacutery szuka najlepszegonarz dzia do tworzenia rozwi za e-commercersquoowych Obecnie pracuje jako g oacutewny progra-mista Magento w firmie Demac Media (wwwdemacmediacom) Allan jest te pasjonatem pro-gramowania stale poszukuj cym nowych lepszych technologii i narz dzi programistycznych
W Demac Media Allan wspoacute tworzy rozwi zania dla roacute norodnych klientoacutew Dzi ki temuzdoby do wiadczenie oraz wiedz ktoacutera pozwala mu stawia czo a nawet najtrudniejszymwyzwaniom zwi zanym z wykorzystaniem Magento
W ramach jednego z projektoacutew wewn trznych prowadzonych w Demac Media Allan tworzynarz dzie Triplecheckio (httptriplecheckio) mdash pioniersk us ug ktoacutera monitoruje i audy-tuje poprawno kodu roacuted owego sklepu stworzonego w Magento Wpisy McGregora mo naledzi na Twitterze pod adresem httpwwwtwittercomallanmcgregor
Praca nad t ksi k by a dla mnie ogromnym wyzwaniem ktoacutere jednak w pe ni si op aci o W trakciepisania dowiedzia em si wielu nowych rzeczy na temat Magento a tak e kilku o samym sobie mdash za-roacutewno o cz owieku jak i o programi cie
W pierwszej kolejno ci chc podzi kowa mojej wspania ej onie za jej bezwarunkowe wsparcie i zro-zumienie ktoacutere okazuje mi gdy pracuj nad coraz to nowymi projektami
Dzi kuj te Matthew Bertulliemu i Dimitriemu Colomvakosowi wspoacute za o ycielom Demac Mediaza wsparcie ktoacutere mi okazywali
Michael Krietzer i Corey Slavnik moi przyjaciele i wspoacute pracownicy z wielk ochot po wi cali swoacutejwolny czas aby zredagowa t ksi k
Specjalne podzi kowania kieruj do ca ej rodziny Demac Media
To co uda o mi si zdoby osi gn em dzi ki Wam
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
8
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Spis tre ci
4
Obiekty cie ek i przep yw da 39MVC w wersji Magento 43
Modele 47Widoki 47Analiza pliku uk adu 48Kontrolery 50
Witryny WWW i zasi gi sklepoacutew 51Nazwy i funkcje wytwoacutercze 52Zdarzenia i obserwatory 55
Generator zdarzenia 56Wi zania obserwatoroacutew 58
Podsumowanie 59
Rozdzia 3 ORM i kolekcje danych 61
Struktura modelu Magento 62Metody magiczne 64
Model EAV 68Czym jest model EAV 68Odczytywanie danych 73
Korzystanie z kolekcji Magento 76Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 78Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 79Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 80Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 80Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 81Dodanie wielu kryterioacutew porz dkowania 81
Wykonywanie bezpo rednich zapyta j zyka SQL 82Odczyt 83Zapisywanie 84
Podsumowanie 84
Rozdzia 4 Programowanie interfejsu u ytkownika 85
Rozszerzenie Magento 85Scenariusz 85Funkcje 86Dalszy rozwoacutej 86
Witaj Magento 87Konfiguracja XML modu u 90Modele i zapisywanie danych 92
Tworzenie modeli 93Zasoby konfiguracyjne 98Czego si dowiedzieli my 106
Definiowanie cie ek 107Kontroler indeksu 108Kontroler wyszukiwania 113Kontroler widoku 115
Kup książkę Poleć książkę
Spis tre ci
5
Bloki i uk ady 116Bloki i widoki kontrolera IndexController 117Bloki i widoki kontrolera SearchController 123Bloki i widoki kontrolera ViewController 127Dodawanie produktoacutew do listy prezentoacutew 128
Podsumowanie 128
Rozdzia 5 Programowanie modu u administracyjnego 129
Rozbudowa modu u Adminhtml 130Powroacutet do konfiguracji 132
Wid et siatki 136Zarz dzanie listami prezentoacutew 140Uprawnienia i lista kontroli dost pu 141Zbiorcza zmiana danych za pomoc akcji masowych 145
Wid et formularza 147adowanie danych 151
Zapisywanie danych 152Podsumowanie 153
Rozdzia 6 API Magento 155
Core API 155XML-RPC 156SOAP 157API REST 159
Korzystanie z API 160Definiowanie danych logowania dla protoko oacutew XML-RPC i SOAP 160Definiowanie danych logowania dla protoko u REST API 162adowanie i odczytywanie danych 164
Zmienianie danych 165Usuwanie produktu 166
Rozszerzanie API 167Rozszerzanie API REST 175
Zabezpieczanie API 177Podsumowanie 178
Rozdzia 7 Testowanie i zapewnienie jako ci 179
Testowanie Magento 180Testy jednostkowe 180Testy regresyjne 180Testy funkcjonalne 181Programowanie sterowane przez testy (TDD) 181
Platformy i narz dzia do testowania 182Testy jednostkowe z wykorzystaniem PHPUnit 182Testy funkcjonalne z wykorzystaniem biblioteki Mink 195
Pierwszy test 196Podsumowanie 199
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 8 Wdra anie i dystrybucja 201
Minimalizacja czasu wdro enia 201Od pocz tku stosuj zalecane praktyki 202Upewnij si e na roacute nych rodowiskach uzyskasz identyczne wyniki 202Jak gotowe to gotowe 203
Rola systemoacutew kontroli wersji w procesie wdro enia 204SVN 204Git 204
Dystrybucja 206Umieszczanie rozszerzenia w pakiecie 207
Publikowanie rozszerzenia 212Podsumowanie 214
Dodatek A Witaj Magento 215
Konfiguracja 215Kontroler 216Test dzia ania cie ki 217
Skorowidz 219
Kup książkę Poleć książkę
O autorze
Allan McGregor posiada certyfikat Magento Certified Developer Plus i od czterech lat pracujez Magento Uzyska tak e certyfikat Linux System Administration wydany przez firm IBM
Swoj przygod z Magento rozpocz jako samodzielny programista ktoacutery szuka najlepszegonarz dzia do tworzenia rozwi za e-commercersquoowych Obecnie pracuje jako g oacutewny progra-mista Magento w firmie Demac Media (wwwdemacmediacom) Allan jest te pasjonatem pro-gramowania stale poszukuj cym nowych lepszych technologii i narz dzi programistycznych
W Demac Media Allan wspoacute tworzy rozwi zania dla roacute norodnych klientoacutew Dzi ki temuzdoby do wiadczenie oraz wiedz ktoacutera pozwala mu stawia czo a nawet najtrudniejszymwyzwaniom zwi zanym z wykorzystaniem Magento
W ramach jednego z projektoacutew wewn trznych prowadzonych w Demac Media Allan tworzynarz dzie Triplecheckio (httptriplecheckio) mdash pioniersk us ug ktoacutera monitoruje i audy-tuje poprawno kodu roacuted owego sklepu stworzonego w Magento Wpisy McGregora mo naledzi na Twitterze pod adresem httpwwwtwittercomallanmcgregor
Praca nad t ksi k by a dla mnie ogromnym wyzwaniem ktoacutere jednak w pe ni si op aci o W trakciepisania dowiedzia em si wielu nowych rzeczy na temat Magento a tak e kilku o samym sobie mdash za-roacutewno o cz owieku jak i o programi cie
W pierwszej kolejno ci chc podzi kowa mojej wspania ej onie za jej bezwarunkowe wsparcie i zro-zumienie ktoacutere okazuje mi gdy pracuj nad coraz to nowymi projektami
Dzi kuj te Matthew Bertulliemu i Dimitriemu Colomvakosowi wspoacute za o ycielom Demac Mediaza wsparcie ktoacutere mi okazywali
Michael Krietzer i Corey Slavnik moi przyjaciele i wspoacute pracownicy z wielk ochot po wi cali swoacutejwolny czas aby zredagowa t ksi k
Specjalne podzi kowania kieruj do ca ej rodziny Demac Media
To co uda o mi si zdoby osi gn em dzi ki Wam
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
8
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Spis tre ci
5
Bloki i uk ady 116Bloki i widoki kontrolera IndexController 117Bloki i widoki kontrolera SearchController 123Bloki i widoki kontrolera ViewController 127Dodawanie produktoacutew do listy prezentoacutew 128
Podsumowanie 128
Rozdzia 5 Programowanie modu u administracyjnego 129
Rozbudowa modu u Adminhtml 130Powroacutet do konfiguracji 132
Wid et siatki 136Zarz dzanie listami prezentoacutew 140Uprawnienia i lista kontroli dost pu 141Zbiorcza zmiana danych za pomoc akcji masowych 145
Wid et formularza 147adowanie danych 151
Zapisywanie danych 152Podsumowanie 153
Rozdzia 6 API Magento 155
Core API 155XML-RPC 156SOAP 157API REST 159
Korzystanie z API 160Definiowanie danych logowania dla protoko oacutew XML-RPC i SOAP 160Definiowanie danych logowania dla protoko u REST API 162adowanie i odczytywanie danych 164
Zmienianie danych 165Usuwanie produktu 166
Rozszerzanie API 167Rozszerzanie API REST 175
Zabezpieczanie API 177Podsumowanie 178
Rozdzia 7 Testowanie i zapewnienie jako ci 179
Testowanie Magento 180Testy jednostkowe 180Testy regresyjne 180Testy funkcjonalne 181Programowanie sterowane przez testy (TDD) 181
Platformy i narz dzia do testowania 182Testy jednostkowe z wykorzystaniem PHPUnit 182Testy funkcjonalne z wykorzystaniem biblioteki Mink 195
Pierwszy test 196Podsumowanie 199
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 8 Wdra anie i dystrybucja 201
Minimalizacja czasu wdro enia 201Od pocz tku stosuj zalecane praktyki 202Upewnij si e na roacute nych rodowiskach uzyskasz identyczne wyniki 202Jak gotowe to gotowe 203
Rola systemoacutew kontroli wersji w procesie wdro enia 204SVN 204Git 204
Dystrybucja 206Umieszczanie rozszerzenia w pakiecie 207
Publikowanie rozszerzenia 212Podsumowanie 214
Dodatek A Witaj Magento 215
Konfiguracja 215Kontroler 216Test dzia ania cie ki 217
Skorowidz 219
Kup książkę Poleć książkę
O autorze
Allan McGregor posiada certyfikat Magento Certified Developer Plus i od czterech lat pracujez Magento Uzyska tak e certyfikat Linux System Administration wydany przez firm IBM
Swoj przygod z Magento rozpocz jako samodzielny programista ktoacutery szuka najlepszegonarz dzia do tworzenia rozwi za e-commercersquoowych Obecnie pracuje jako g oacutewny progra-mista Magento w firmie Demac Media (wwwdemacmediacom) Allan jest te pasjonatem pro-gramowania stale poszukuj cym nowych lepszych technologii i narz dzi programistycznych
W Demac Media Allan wspoacute tworzy rozwi zania dla roacute norodnych klientoacutew Dzi ki temuzdoby do wiadczenie oraz wiedz ktoacutera pozwala mu stawia czo a nawet najtrudniejszymwyzwaniom zwi zanym z wykorzystaniem Magento
W ramach jednego z projektoacutew wewn trznych prowadzonych w Demac Media Allan tworzynarz dzie Triplecheckio (httptriplecheckio) mdash pioniersk us ug ktoacutera monitoruje i audy-tuje poprawno kodu roacuted owego sklepu stworzonego w Magento Wpisy McGregora mo naledzi na Twitterze pod adresem httpwwwtwittercomallanmcgregor
Praca nad t ksi k by a dla mnie ogromnym wyzwaniem ktoacutere jednak w pe ni si op aci o W trakciepisania dowiedzia em si wielu nowych rzeczy na temat Magento a tak e kilku o samym sobie mdash za-roacutewno o cz owieku jak i o programi cie
W pierwszej kolejno ci chc podzi kowa mojej wspania ej onie za jej bezwarunkowe wsparcie i zro-zumienie ktoacutere okazuje mi gdy pracuj nad coraz to nowymi projektami
Dzi kuj te Matthew Bertulliemu i Dimitriemu Colomvakosowi wspoacute za o ycielom Demac Mediaza wsparcie ktoacutere mi okazywali
Michael Krietzer i Corey Slavnik moi przyjaciele i wspoacute pracownicy z wielk ochot po wi cali swoacutejwolny czas aby zredagowa t ksi k
Specjalne podzi kowania kieruj do ca ej rodziny Demac Media
To co uda o mi si zdoby osi gn em dzi ki Wam
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
8
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Spis tre ci
6
Rozdzia 8 Wdra anie i dystrybucja 201
Minimalizacja czasu wdro enia 201Od pocz tku stosuj zalecane praktyki 202Upewnij si e na roacute nych rodowiskach uzyskasz identyczne wyniki 202Jak gotowe to gotowe 203
Rola systemoacutew kontroli wersji w procesie wdro enia 204SVN 204Git 204
Dystrybucja 206Umieszczanie rozszerzenia w pakiecie 207
Publikowanie rozszerzenia 212Podsumowanie 214
Dodatek A Witaj Magento 215
Konfiguracja 215Kontroler 216Test dzia ania cie ki 217
Skorowidz 219
Kup książkę Poleć książkę
O autorze
Allan McGregor posiada certyfikat Magento Certified Developer Plus i od czterech lat pracujez Magento Uzyska tak e certyfikat Linux System Administration wydany przez firm IBM
Swoj przygod z Magento rozpocz jako samodzielny programista ktoacutery szuka najlepszegonarz dzia do tworzenia rozwi za e-commercersquoowych Obecnie pracuje jako g oacutewny progra-mista Magento w firmie Demac Media (wwwdemacmediacom) Allan jest te pasjonatem pro-gramowania stale poszukuj cym nowych lepszych technologii i narz dzi programistycznych
W Demac Media Allan wspoacute tworzy rozwi zania dla roacute norodnych klientoacutew Dzi ki temuzdoby do wiadczenie oraz wiedz ktoacutera pozwala mu stawia czo a nawet najtrudniejszymwyzwaniom zwi zanym z wykorzystaniem Magento
W ramach jednego z projektoacutew wewn trznych prowadzonych w Demac Media Allan tworzynarz dzie Triplecheckio (httptriplecheckio) mdash pioniersk us ug ktoacutera monitoruje i audy-tuje poprawno kodu roacuted owego sklepu stworzonego w Magento Wpisy McGregora mo naledzi na Twitterze pod adresem httpwwwtwittercomallanmcgregor
Praca nad t ksi k by a dla mnie ogromnym wyzwaniem ktoacutere jednak w pe ni si op aci o W trakciepisania dowiedzia em si wielu nowych rzeczy na temat Magento a tak e kilku o samym sobie mdash za-roacutewno o cz owieku jak i o programi cie
W pierwszej kolejno ci chc podzi kowa mojej wspania ej onie za jej bezwarunkowe wsparcie i zro-zumienie ktoacutere okazuje mi gdy pracuj nad coraz to nowymi projektami
Dzi kuj te Matthew Bertulliemu i Dimitriemu Colomvakosowi wspoacute za o ycielom Demac Mediaza wsparcie ktoacutere mi okazywali
Michael Krietzer i Corey Slavnik moi przyjaciele i wspoacute pracownicy z wielk ochot po wi cali swoacutejwolny czas aby zredagowa t ksi k
Specjalne podzi kowania kieruj do ca ej rodziny Demac Media
To co uda o mi si zdoby osi gn em dzi ki Wam
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
8
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
O autorze
Allan McGregor posiada certyfikat Magento Certified Developer Plus i od czterech lat pracujez Magento Uzyska tak e certyfikat Linux System Administration wydany przez firm IBM
Swoj przygod z Magento rozpocz jako samodzielny programista ktoacutery szuka najlepszegonarz dzia do tworzenia rozwi za e-commercersquoowych Obecnie pracuje jako g oacutewny progra-mista Magento w firmie Demac Media (wwwdemacmediacom) Allan jest te pasjonatem pro-gramowania stale poszukuj cym nowych lepszych technologii i narz dzi programistycznych
W Demac Media Allan wspoacute tworzy rozwi zania dla roacute norodnych klientoacutew Dzi ki temuzdoby do wiadczenie oraz wiedz ktoacutera pozwala mu stawia czo a nawet najtrudniejszymwyzwaniom zwi zanym z wykorzystaniem Magento
W ramach jednego z projektoacutew wewn trznych prowadzonych w Demac Media Allan tworzynarz dzie Triplecheckio (httptriplecheckio) mdash pioniersk us ug ktoacutera monitoruje i audy-tuje poprawno kodu roacuted owego sklepu stworzonego w Magento Wpisy McGregora mo naledzi na Twitterze pod adresem httpwwwtwittercomallanmcgregor
Praca nad t ksi k by a dla mnie ogromnym wyzwaniem ktoacutere jednak w pe ni si op aci o W trakciepisania dowiedzia em si wielu nowych rzeczy na temat Magento a tak e kilku o samym sobie mdash za-roacutewno o cz owieku jak i o programi cie
W pierwszej kolejno ci chc podzi kowa mojej wspania ej onie za jej bezwarunkowe wsparcie i zro-zumienie ktoacutere okazuje mi gdy pracuj nad coraz to nowymi projektami
Dzi kuj te Matthew Bertulliemu i Dimitriemu Colomvakosowi wspoacute za o ycielom Demac Mediaza wsparcie ktoacutere mi okazywali
Michael Krietzer i Corey Slavnik moi przyjaciele i wspoacute pracownicy z wielk ochot po wi cali swoacutejwolny czas aby zredagowa t ksi k
Specjalne podzi kowania kieruj do ca ej rodziny Demac Media
To co uda o mi si zdoby osi gn em dzi ki Wam
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
8
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
8
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
3
ORM i kolekcje danych
Kolekcje i modele to chleb powszedni dla wszystkich programistoacutew ktoacuterzy pracuj z MagentoW tym rozdziale opisany zostanie system ORM obecny w Magento Poka tak e jak nale yprawid owo korzysta z kolekcji danych oraz z systemu EAV
Magento podobnie jak wi kszo wspoacute czesnych systemoacutew implementuje system mapowaniaobiektowo-relacyjnego (ang object-relational mapping mdash ORM)
Mapowanie obiektowo-relacyjne (ORM ORM lub mapowanie OR) w technologiachinformatycznych to technika programowania w ktoacuterej dane wyst puj ce w roacute nychniezgodnych formatach przekszta cane s na j zyki programowania zorientowanegoobiektowo W ten sposoacuteb tworzy si bdquobaz danych wirtualnych obiektoacutewrdquo ktoacuterejmo na u ywa w konstrukcjach j zyka programowania
W tym rozdziale przedstawione zostan nast puj ce zagadnienia modele Magento struktura modelu danych Magento EAV i modele EAV wykorzystanie bezpo rednich zapyta j zyka SQL
W rozdziale wykorzystane zostan roacutewnie liczne fragmenty przyk adowego kodu roacuted owegona podstawie ktoacuterych atwiej b dzie zrozumie sposoacuteb dzia ania Magento
Uruchomienie przyk adowych kodoacutew prezentowanych w tym rozdziale wymaga domy lnej instalacjiMagento na maszynie VagrantBox lub instalacji Magento z danymi przyk adowymi
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
62
Dla celoacutew tego rozdzia u stworzy em interaktywn konsol Magento (ang Interactive MagentoConsole mdash IMC) ktoacutera jest skryptem pow oki zaimplementowanym specjalnie na potrzeby tejksi ki Inspiracj dla niej jest przeznaczona dla Ruby interaktywna konsola Ruby (ang InteractiveRuby Console mdash IRC) W celu uruchomienia IMC nale y wykona nast puj ce czynno ci
1 Zainstalowa IMC W tym celu trzeba pobra pliki roacuted owe ze stronyhttpsgithubcomamacgregormdg_imc i rozpakowa je w testowej instalacjiMagento IMC jest prostym skryptem pow oki Magento ktoacutery pozwoli namtestowa kod w czasie rzeczywistym
2 Po rozpakowaniu skryptu nale y zalogowa si w pow oce maszyny wirtualnej 3 W kolejnym kroku trzeba przej do g oacutewnego folderu Magento Je eli korzysta siz domy lnej maszyny Vagrant instalacja jest ju w niej obecna Folderem g oacutewnymjest srvwwwce1720public_html a aby do niego przej nale y wpisa w wierszupolece nast puj ce polecenie
$ cd srvwwwce1720public_html
4 Na koniec mo na uruchomi IMC nast puj cym poleceniem
$ php shellimcphp
5 Je eli instalacja przebieg a poprawnie nowy wiersz w wierszu polece powinienzaczyna si symbolem magento gt
Struktura modelu MagentoJak powiedziano w poprzednim rozdziale modele danych Magento s u do manipulowaniadanymi i ich odczytywania Warstwa modeli podzielona jest na dwa podstawowe typy modeleproste i modele EAV
Modele proste Tego typu implementacje modeli s zwyk ymi odwzorowaniamijednego obiektu na jedn tabel co oznacza e atrybuty obiektu odpowiadajka demu polu oraz strukturze tabeli
Modele encja ndash atrybut ndash warto (EAV) W modelach tego rodzaju encje opisujesi atrybutami o zmiennej liczbie
Nale y podkre li e nie wszystkie modele Magento u ywaj systemu ORM lub rozszerzaj jego mo li-wo ci Obserwatory s doskona ym przyk adem prostych klas modeli ktoacutere to modele nie s odwzoro-wane na konkretn tabel lub encj bazy danych
Dodatkowo ka dy typ modelu jest kszta towany przez nast puj ce warstwy Klasa modelu W niej implementuje si logik biznesow Modele s u do
manipulowania danymi lecz nie maj bezpo redniego dost pu do tych danych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
63
Klasa modelu zasoboacutew Modele zasoboacutew komunikuj si z baz danych w imieniumodeli Modele zasoboacutew wykonuj wszelkie operacje typu CRUD
Klasa modelu kolekcji Ka dy model danych zawiera klas kolekcji Kolekcjes obiektami ktoacutere przechowuj jedn lub wi cej instancji modelu Magento
CRUD oznacza cztery podstawowe operacje na danych w bazie danych Create (tworzenie) Read (odczyt)Update (zmiana) Delete (usuwanie)
Modele Magento nie zawieraj adnej logiki komunikacji z baz danych mdash wr cz s one nie-zale ne od bazy danych Odpowiedni kod implementuje si w warstwie modelu zasoboacutew
Dzi ki opisanej konstrukcji Magento mo e obs ugiwa roacute ne rodzaje baz danych i platformWprawdzie na chwil obecn oficjalnie obs ugiwany jest jedynie serwer MySQL bez trudumo na jednak napisa now klas zasobu przeznaczon dla nowej bazy danych ktoacutera to klasanie b dzie w aden sposoacuteb wp ywa na logik modeli
Schemat struktury modeli Magento przedstawiono na rysunku 31
Rysunek 31 Schemat struktury modeli Magento
Wykonajmy zatem pewien eksperyment ktoacutery b dzie polega na stworzeniu instancji obiektu pro-duktu i ustawieniu jego wybranych atrybutoacutew Nale y w tym celu wykona nast puj ce czynno ci
1 Uruchomi interaktywn konsol Magento w g oacutewnym folderze rozwojowejinstalacji narz dzia
php shellimcphp
2 Pierwszy krok polega na stworzeniu nowej instancji obiektu produktu do czegos u y nast puj ce polecenie
magentogt $product = MagegetModel(catalogproduct)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
64
3 Poni szym poleceniem potwierdzimy e jest to pusta instancja klasy produktu
magentogt echo get_class($product)
4 Je eli wszystko poacutejdzie dobrze w konsoli powinien pojawi si nast puj cy komunikat
magentogt Magento_Catalog_Model_Product
5 Aby dowiedzie si wi cej na temat metod klasy mo na wykona polecenieo poni szej tre ci
magentogt print_r(get_class_methods($product))
W efekcie zwroacutecona zostanie tablica w ktoacuterej widnie b d wszystkie metody udost pnianeprzez klas Sproacutebujmy zatem wykona poni szy fragment kodu roacuted owego aby zmodyfikowacen i nazw produktu
$product = MagegetModel(catalogproduct)-gtload(2)$name = $product-gtgetName() -TEST$price = $product-gtgetPrice()$product-gtsetPrice($price + 15)$product-gtsetName($name)$product-gtsave()
W pierwszym wierszu przyk adowego kodu roacuted owego tworzona jest instancja wskazanegoobiektu po czym odczytywana jest warto atrybutu obiektu w ktoacuterym zapisana jest nazwaproduktu Nast pnie ustawiana jest cena i nazwa po czym obiekt zostaje zapisany
Analiza implementacji klasy produktu Magento Mage_Catalog_Model_Product szybko wyka ee o ile funkcje getName() i getPrice() s w niej zaimplementowane o tyle ju definicji funkcjisetPrice() i setName() w niej nie ma
Powstaje zatem kluczowe pytanie w jaki to magiczny sposoacuteb Magento definiuje okre lone meto-dy ustawiania i odczytywania danych w obiekcie produktu Wprawdzie getPrice() i getName()s jawnie zaimplementowane jednak nigdzie nie ma definicji metod ustawiaj cych i odczy-tuj cych inne atrybuty produktu takie jak kolor albo nazwa producenta
Metody magiczneCoacute rzeczywi cie zdarza si e dzia anie systemu ORM Magento ociera si o magi Moacutewi cbardziej precyzyjnie w systemie ORM wykorzystuje si jeden z najciekawszych mechanizmoacutewdost pnych w PHP ktoacutery umo liwia definiowanie metod ustawiaj cych i odczytuj cych danemdash mechanizm ten opiera si na magicznej metodzie __call() Dzi ki niej metod Magentomo na u ywa do ustawiania usuwania sprawdzania i odczytywania danych
Gdy podj ta zostanie proacuteba wywo ania metody ktoacutera nie jest zaimplementowana w klasie PHPzacznie szuka w klasach rodzicoacutew deklaracji tej metody Je eli odpowiednia funkcja nie zostanieznaleziona w adnej z klas rodzicoacutew podj ta zostanie ostatnia proacuteba ktoacutera polega na wywo aniumetody __call() Je eli funkcja zostanie znaleziona Magento (a w a ciwie PHP) wywo a ma-giczn metod i przeka e do niej nazw pierwotnie wywo ywanej metody oraz jej argumenty
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
65
Model Product nie ma zdefiniowanej metody __call() lecz dziedziczy j z klasy Varien_Objectktoacutera jest klas podstawow dla wszystkich modeli Magento Drzewo dziedziczenia dla klasyMage_Catalog_Model_Product znajduje si na schemacie przedstawionym na rysunku 32
Rysunek 32 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Ka dy model Magento dziedziczy po klasie Varien_Object
Przyjrzyjmy si bli ej klasie Varien_Object W tym celu nale y wykona nast puj ce czynno ci 1 Otworzy plik folder_g oacutewny_magentolibVarienObjectphp 2 Klasa Varien_Object ma zdefiniowan metod __call() a tak e implementuje dwieprzestarza e metody __set() i __get() Te dwie ostatnie metody s zast pione metod__call() i dlatego ju si ich nie u ywa
public function __call($method $args) switch (substr($method 0 3)) case get Varien_Profilerstart(GETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $data = $this-gtgetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(GETTER get_class($this)$method) return $data case set Varien_Profilerstart(SETTER get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtsetData($key isset($args[0]) $args[0] null) Varien_Profilerstop(SETTER get_class($this)$method) return $result case uns Varien_Profilerstart(UNS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) $result = $this-gtunsetData($key) Varien_Profilerstop(UNS get_class($this)$method) return $result case has
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
66
Varien_Profilerstart(HAS get_class($this)$method) $key = $this-gt_underscore(substr($method3)) Varien_Profilerstop(HAS get_class($this)$method) return isset($this-gt_data[$key]) throw new Varien_Exception(Invalid method get_class($this)$method(print_r($args1)))
W metodzie __call() znajduje si instrukcja switch ktoacutera obs uguje nie tylko funkcje usta-wiania (set) i odczytywania (get) danych ale roacutewnie funkcje unset i has
Po uruchomieniu debuggera i prze ledzeniu wywo a metody __call() w przyk adowymfragmencie kodu oka e si e przyjmuje ona dwa argumenty nazw metody (na przyk adsetName()) oraz argumenty pochodz ce z wywo ania oryginalnego
Co ciekawe Magento proacutebuje zidentyfikowa typ metody na podstawie pierwszych trzechliter nazwy metody wywo ywanej Operacja ta zachodzi w momencie gdy instrukcja switchwykonuje funkcj substr()
substr($method 0 3)
Pierwsz czynno ci wykonywan w ka dym przypadku analizowanym przez instrukcj switchjest wykonanie funkcji _underscore() ktoacutera przyjmuje parametr w postaci reszty znakoacutew nazwymetody oproacutecz trzech pierwszych liter W naszym przyk adzie argumentem dla _underscore()b dzie Name
Funkcja _underscore() zwraca klucz danych Klucz ten jest wykorzystywany w ka dym przy-padku analizowanym przez instrukcj aby wykona odpowiednie operacje na danych Istniejcztery podstawowe operacje na danych i ka da z nich jest wywo ywana w odpowiadaj cym jejprzypadku instrukcji switch
setData($parameters) getData($parameters) unsetData($parameters) isset($parameters)
Ka da z wymienionych funkcji wykonuje odpowiednie dla niej operacje na tablicy danychklasy Varien_Object W wi kszo ci przypadkoacutew wywo ywana jest magiczna metoda setgetktoacutera wykonuje odpowiednie czynno ci na atrybutach obiektu Istnieje tylko kilka wyj tkoacutewod tej regu y mdash na przyk ad gdy wymagana jest dodatkowa logika biznesowa metody usta-wiania i odczytywania danych s definiowane jawnie W naszym przyk adzie takimi metodamis getName() i getPrice()
public function getPrice() if ($this-gt_calculatePrice || $this-gtgetData(price)) return $this-gtgetPriceModel()-gtgetPrice($this)
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
67
else return $this-gtgetData(price)
Nie b dziemy si na razie wg bia w szczegoacute y dzia ania funkcji getPrice() Na jej podstawiewida jednak wyra nie e dla niektoacuterych cz ci modelu konieczne mo e by zaimplemento-wanie dodatkowej logiki
public function getName() return $this-gt_getData(name)
Natomiast metoda getName() nie zosta a jawnie zaimplementowana po to by realizowa dodat-kow logik biznesow ale po to by zoptymalizowa dzia anie kluczowego elementu MagentoFunkcja getName() klasy Mage_Catalog_Model_Product mo e by teoretycznie wykonywana setkirazy przy ka dym adowaniu strony i jest jedn z najcz ciej u ywanych w ca ym MagentoW ko cu czym by aby platforma e-commercersquoowa gdyby nie skupia a si na produktach
Zaroacutewno w interfejsie u ytkownika jak i w modu ach wewn trznych funkcja getName() zostaniepr dzej czy poacute niej wywo ana Na przyk ad je eli adujemy stron kategorii z 24 produktamioznacza to konieczno wykonania 24 niezale nych wywo a funkcji getName() i w ka dym z tychwywo a poszukiwana b dzie metoda getName() na ka dej klasie rodzica nast pnie podj tazostanie proacuteba wykonania magicznej metody __call() Ostatecznie ca y proces mo e zaj d ugiemilisekundy
Modele zasoboacutew zawieraj kompletn logik komunikacji z baz danych i tworz instancjewymaganych adapteroacutew odczytywania danych i zapisywania ich do odpowiadaj cych im roacutededanych Wroacute my do przyk adu z produktami i spoacutejrzmy na model zasoboacutew produktoacutew z ry-sunku 33 zlokalizowany w klasie Mage_Catalog_Model_Resource_Product
Rysunek 33 Model zasoboacutew produktoacutew
Modele zasoboacutew wyst puj w dwoacutech odmianach Entity oraz MySQL4 Drugi z nich jeststandardow implementacj relacji jedna tabela ndash jeden model natomiast pierwszy jest zde-cydowanie bardziej skomplikowany
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
68
Model EAVEAV jest skroacutetowcem s oacutew entity (encja) attribute (atrybut) i value (warto ) i oznacza kon-cepcj z ktoacuterej zrozumieniem pocz tkuj cy programi ci Magento maj zwykle najwi kszetrudno ci Koncepcja EAV jest w Magento do powszechnie wykorzystywana jednak w innychwspoacute czesnych systemach informatycznych spotyka si j stosunkowo rzadko Poza tym im-plementacja modelu w Magento sama w sobie jest do z o ona
Schemat modelu EAV przedstawiono na rysunku 34
Rysunek 34 Schemat modelu EAV
Czym jest model EAVAby zrozumie czym w ogoacutele jest model EAV oraz jak funkcj pe ni w Magento trzeba naj-pierw opisa jego cz ci sk adowe
Encja Encja reprezentuje pojedyncze dane w obiektach Magento mdash produktachklientach kategoriach i zamoacutewieniach Ka da encja jest przechowywana w baziedanych i ma unikatowy identyfikator
Atrybut Atrybut reprezentuje w a ciwo ci obiektoacutew Poszczegoacutelne atrybuty nie sumieszczane w oddzielnych kolumnach tabeli produktoacutew mdash wszystkie atrybuty sprzechowywane w odr bnych zbiorach tabel
Warto Jak wskazuje nazwa jest to zwyk a warto skojarzona z okre lonym atrybutem
To w a nie ten wzorzec projektowy stoi za niespotykan elastyczno ci i niemal nieograniczonymimo liwo ciami Magento poniewa dzi ki niemu mo na dodawa i usuwa nowe w a ciwo cibez konieczno ci wprowadzania jakichkolwiek zmian w kodzie roacuted owym czy szablonach
Podczas gdy model w uj ciu Magento mo na postrzega jako mechanizm rozrostu bazy da-nych w pionie (nowe atrybuty dodawane s w postaci nowych wierszy) model tradycyjny po-wi ksza baz danych w poziomie (nowe atrybuty oznaczaj nowe kolumny) poniewa wi esi z konieczno ci ka dorazowej zmiany w schemacie bazy danych gdy zachodzi potrzebadodania nowego atrybutu
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
69
Oproacutecz tego e model EAV umo liwia dokonywanie coraz to nowych zmian w bazie danychto roacutewnie dzia a bardziej wydajnie poniewa przetwarzane s tylko atrybuty niepuste Nietrzeba wi c rezerwowa dodatkowego miejsca w bazie danych na atrybuty null
Wi cej szczegoacute owych informacji na temat struktury bazy danych Magento mo na znale na stroniewwwmagereversecom
Dodawanie nowego atrybutu produktu jest bardzo proste i sprowadza si do okre leniaw Magento jego typu mdash mo e to by kolor rozmiar marka i tym podobne Roacutewnie prosta jestczynno odwrotna gdy trzeba pozby si nieu ywanych atrybutoacutew w modelach produktoacutewalbo klientoacutew
Wi cej informacji na temat zarz dzania atrybutami mo na znale na stronie httpwwwmagentocommercecomknowledge-baseentryhow-do-attributes-work-in-magento
Magento w wersji Community Edition obecnie obs uguje osiem roacute nych typoacutew obiektoacutew EAVS to
klient adres klienta produkty kategorie produktoacutew zamoacutewienia faktury noty kredytowe wysy ki
W Magento Enterprise Edition obs ugiwany jest jeszcze jeden typ mdash obiekt RMA symbolizuj cy zlecenieodbioru stosowane w przypadku zwrotu towaroacutew Jest on cz ci systemu Return Merchandise Authori-zation (RMA)
Elastyczno i szerokie mo liwo ci maj niestety swoj cen mdash implementacja modelu EAVsprawia e dane na temat encji ulegaj rozproszeniu w wielu tabelach Na przyk ad dane natemat samego modelu produktu s przechowywane w oko o 40 roacute nych tabelach
Diagram widoczny na rysunku 35 prezentuje zaledwie kilka tabel w ktoacuterych przechowywanes dane na temat produktoacutew przetwarzanych w Magento
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
70
Rysunek 35 Schemat kilku wybranych tabel w ktoacuterych przechowywane s dane na temat produktoacutew
Kolejn wad stosowania modelu EAV jest to e odczytywanie du ych kolekcji obiektoacutew EAVznacz co wp ywa na wydajno systemu a jednocze nie wymaga tworzenia bardzo skompli-kowanych zapyta do bazy danych Dane s w tym modelu bardziej pofragmentowane (znaj-duj si w wielu tabelach) zatem odczytanie pojedynczego rekordu wymaga wykonania conajmniej kilku z cze
Kontynuuj c nasz przyk ad oparty na produktach przechowywanych w Magento stworzymyteraz r cznie zapytanie ktoacutere b dzie zwraca rekord pojedynczego produktu
Prezentowane w dalszej cz ci punktu zapytania mo na wykonywa i zmienia w narz dziu PHPMyAdminlub MySQL Workbench PHPMyAdmin mo na pobra ze strony httpwwwphpmyadminnet za MySQLWorkbench jest dost pne na witrynie httpwwwmysqlcomproductsworkbench
Pierwsz tabel z jakiej b dziemy musieli skorzysta jest catalog_product_entity Mo na jtraktowa jako g oacutewn tabel produktoacutew w modelu EAV poniewa znajduj si w niej naj-wa niejsze atrybuty encji produktoacutew Zawarto tabeli catalog_product_entity przedstawionona rysunku 36
Zawarto tabeli catalog_product_entity zostanie zwroacutecona po wykonaniu nast puj cegozapytania j zyka SQL
SELECT FROM catalog_product_entity
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
71
Rysunek 36 Fragment zawarto ci tabeli catalog_product_entity
W tabeli znajduj si opisane ni ej pola entity_id mdash unikatowy identyfikator produktu u ywany wewn trznie przez Magento entity_type_id mdash Magento u ywa w systemie EAV kilku roacute nych typoacutew mi dzy
innymi modeli produktoacutew klientoacutew i zamoacutewie Dzi ki temu e ka dy z tychtypoacutew ma unikatowy identyfikator Magento mo e odczyta ich atrybuty i warto ciz odpowiednich tabel
attribute_set_id mdash atrybuty produktoacutew mo na lokalnie grupowa w zbioryatrybutoacutew Zbiory atrybutoacutew zapewniaj jeszcze dalej id c elastyczno strukturyproduktoacutew poniewa dzi ki nim produkty mog mie tylko niektoacutere spo roacutedwszystkich dost pnych atrybutoacutew
type_id mdash w Magento wyst puje kilka roacute nych typoacutew produktoacutew prostekonfigurowalne czone dost pne do pobrania i grupowane Ka dy typ produktuma unikatowe ustawienia i funkcje
sku mdash jednostka magazynowa (ang Stock Keeping Unit mdash SKU) to liczba lub kodktoacutery identyfikuje unikatowy produkt lub artyku dost pny w sklepie do sprzeda yWarto SKU jest definiowana przez u ytkownika
has_options mdash wskazuje czy produkt ma dodatkowe opcje required_options mdash wskazuje czy wymagane s jakie dodatkowe opcje created_at mdash data utworzenia wiersza updated_at mdash data ostatniej modyfikacji wiersza
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
72
Znamy ju struktur tabeli ktoacutera przechowuje encje produktoacutew a tak e wiemy e ka dy re-kord tej tabeli reprezentuje pojedynczy produkt w sklepie Magento Nie mamy natomiastjeszcze wystarczaj cych informacji na temat samego produktu oproacutecz kodu jednostki maga-zynowej SKU oraz typu produktu
Gdzie zatem znajduj si pozosta e atrybuty produktoacutew I sk d Magento wie ktoacutery atrybutdotyczy produktu a ktoacutery klienta
Brakuj ce informacje mo na uzyska z tabeli eav_attribute mdash w tym celu nale y wykonanast puj ce zapytanie SQL
SELECT FROM eav_attribute
Wynik zapytania b dzie zawiera nie tylko atrybuty produktoacutew ale roacutewnie atrybuty charak-terystyczne dla modelu klienta modelu zamoacutewienia i im podobnych Na szcz cie znamy juklucz na podstawie ktoacuterego mo na wyizolowa atrybuty jakie nas interesuj Nale y w tymcelu wykona zapytanie w nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id = 4
Zapytanie o takiej tre ci nakazuje bazie danych zwroacutecenie tylko tych atrybutoacutew dla ktoacuterychwarto w polu entity_type_id odpowiada analogicznemu identyfikatorowi entity_type_idproduktu czyli ma warto 4 Zanim przejdziemy dalej warto zapozna si z najwa niejszymipolami tabeli eav_attribute
attribute_id mdash unikatowy identyfikator ka dego atrybutu stanowi jednocze nieklucz g oacutewny tabeli
entity_type_id mdash to pole kojarzy ka dy atrybut z odpowiednim typem modelu EAV attribute_code mdash nazwa lub klucz atrybutu na podstawie tej warto ci magiczne
metody generuj metody do odczytywania i ustawiania warto ci backend_model mdash model wewn trzny ktoacutery zarz dza adowaniem danych z bazy
danych i zapisywaniem ich do niej backend_type mdash wskazuje typ warto ci zapisywanej w magazynie danych (bazie danych) backend_table mdash warto w tym polu wskazuje czy atrybut powinien by
przechowywany w tabeli specjalnej zamiast w domy lnych tabelach systemu EAV frontend_model mdash model interfejsu u ytkownika odpowiada za generowanie
elementu atrybutu na potrzeby przegl darki internetowej frontend_input mdash analogicznie do modelu interfejsu u ytkownika warto w tym polu
wskazuje typ pola wej ciowego jakie powinno zosta wy wietlone przez przegl dark frontend_label mdash w tym polu znajduje si etykieta (nazwa) atrybutu ktoacutera
zostanie wy wietlona w przegl darce source_model mdash na podstawie modeli roacuted owych atrybuty s wype niane
dozwolonymi warto ciami Magento zawiera kilka predefiniowanych modeliroacuted owych mi dzy innymi dla krajoacutew warto ci typu bdquotakrdquo lub bdquonierdquo i im podobnych
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
73
Odczytywanie danychNa tym etapie wiemy ju jak pozyskuje si encje produktoacutew oraz ich atrybuty ktoacutere dotyczca ej encji Czas wi c odczyta rzeczywiste dane Aby nie komplikowa zbytnio przyk adu(i zapytania) skupimy si na odczytaniu atrybutu ktoacutery zawiera nazw produktu
Sk d wiadomo w ktoacuterej tabeli przechowywane s warto ci atrybutoacutew Coacute na szcz ciew Magento konsekwentnie u ywa si jasno okre lonej konwencji nazewniczej zgodnie z ktoacuternadaje si odpowiednie nazwy tabelom Rzut oka na struktur bazy danych wyka e e w baziewyst puje kilka tabel ktoacuterych nazwa zaczyna si od przedrostka catalog_product_entity
catalog_product_entity catalog_product_entity_datetime catalog_product_entity_decimal catalog_product_entity_int catalog_product_entity_text catalog_product_entity_varchar catalog_product_entity_gallery catalog_product_entity_media_gallery catalog_product_entity_tier_price
No dobrze ale sk d mamy wiedzie z ktoacuterej tabeli nale y uzyska warto atrybutu wskazu-j cego nazw produktu Uwa ny czytelnik na pewno zna ju odpowied mdash wystarczy sobieprzypomnie e w tabeli eav_attribute znajduje si kolumna o nazwie backend_type
W systemie EAV Magento ka dy atrybut jest przechowywany w oddzielnej tabeli zgodniez typem warto ci backend_type tego atrybutu Aby upewni si co do typu warto ci nazwyproduktu wystarczy wykona zapytanie SQL o nast puj cej postaci
SELECT FROM eav_attributeWHERE entity_type_id =4 AND attribute_code = name
W wyniku wykonania zapytania oka e si e typem warto ci jest varchar oraz e warto ci dlatego atrybutu s przechowywane w tabeli catalog_product_entity_varchar Spoacutejrzmy na za-warto tabeli widoczn na rysunku 37
Tabela catalog_product_entity_varchar zawiera sze nast puj cych kolumn value_id mdash unikatowy identyfikator warto ci ktoacutery jest jednocze nie kluczem
g oacutewnym tabeli entity_type_id mdash identyfikator typu encji dla tej warto ci attribute_id mdash klucz obcy ktoacuterego warto odnosi si do zawarto ci tabelieav_entity
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
74
Rysunek 37 Zawarto tabeli catalog_product_entity_varchar
store_id mdash klucz obcy ktoacutery kojarzy warto atrybutu z widokiem sklepu entity_id mdash klucz obcy do odpowiedniej tabeli encji W naszym przyk adzie tak
tabel jest catalog_product_entity value mdash rzeczywista warto atrybutu ktoacuter chcemy uzyska
Atrybut mo na skonfigurowa w taki sposoacuteb aby jego warto by a warto ci globaln czyli dost pnwe wszystkich widokach sklepoacutew lub te by w ka dym widoku sklepu atrybut mia inn warto
Znamy ju wszystkie tabele w ktoacuterych znajduj si interesuj ce nas informacje na temat pro-duktoacutew Mo emy wi c napisa docelowe zapytanie
SELECT pentity_id AS product_id varvalue AS product_name psku AS product_skuFROM catalog_product_entity p eav_attribute eav catalog_product_entity_varchar varWHERE pentity_type_id = eaventity_type_id AND varentity_id = pentity_id AND eavattribute_code = name AND eavattribute_id = varattribute_id
Wynik wykonania zapytania znajduje si na rysunku 38
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
75
Rysunek 38 Wynik wykonania zapytania o dane na temat produktoacutew
W wyniku wykonania zapytania zwroacutecone zosta y trzy kolumny product_id product_name orazproduct_sku Cofnijmy si zatem o krok aby zobaczy jak uzyska jedynie nazwy produktoacutewna podstawie SKU Otoacute odpowiednie zapytanie j zyka SQL musia oby si sk ada z pi ciuwierszy i zwraca oby wy cznie jedn z dwoacutech danych na temat produktu warto pola nu-merycznego (na przyk ad cen ) z jednej tabeli warto ci EAV albo warto tekstow (na przyk adnazw produktu) z innej tabeli warto ci EAV
Gdyby nie ORM zaimplementowany w Magento utrzymywanie danych w systemie by obyw zasadzie niemo liwe Na szcz cie dzi ki ORM prawdopodobnie nigdy nie trzeba b dziepisa standardowego kodu SQL aby odczytywa potrzebne informacje
Spoacutejrzmy zatem jak ten sam zestaw danych na temat produktoacutew mo na uzyska dzi ki ORMMagento
1 W pierwszym kroku trzeba stworzy instancj kolekcji produktoacutew
$collection = MagegetModel(catalogproduct)-gtgetCollection()
2 Nast pnie konieczne b dzie jawne nakazanie Magento e wybrany ma zosta atrybutktoacutery wskazuje nazw produktu
$collection-gtaddAttributeToSelect(name)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
76
3 Teraz trzeba posortowa kolekcj wzgl dem nazw produktoacutew
$collection-gtsetOrder(name asc)
4 Ko cowy krok polega na za adowaniu przez Magento ca ej kolekcji
$collection-gtload()
5 Wynikiem wykonania opisanych czynno ci jest kolekcja wszystkich produktoacutewprzechowywanych w sklepie uporz dkowana wzgl dem nazwy Pe n trezapytania j zyka SQL mo na uzyska po wykonaniu nast puj cej instrukcji
echo $collection-gtgetSelect()-gt__toString()
Ostatecznie w zaledwie trzech wierszach kodu roacuted owego nakazali my Magento aby systemodczyta wszystkie produkty przechowywane w sklepie wyizolowa z nich nazwy produktoacutewi na koniec uporz dkowa je alfabetycznie
Ostatni wiersz przyk adowego kodu $collection-gtgetSelect()-gt__toString() pozwala progra-mi cie podejrze rzeczywiste zapytanie j zyka SQL przetwarzane przez Magento na podstawie wykona-nego kodu roacuted owego
Rzeczywiste zapytanie j zyka SQL ktoacutere wykona Magento na podstawie przyk adowego koduma nast puj c tre
SELECT e IF( at_namevalue_id gt0 at_namevalue at_name_defaultvalue ) AS nameFROM catalog_product_entity AS eLEFT JOIN catalog_product_entity_varchar AS at_name_default ON (at_name_defaultentity_id = eentity_id)
AND (at_name_defaultattribute_id = 65)AND at_name_defaultstore_id =0LEFT JOIN catalog_product_entity_varchar AS at_name ON ( at_nameentity_id =eentity_id )
AND (at_nameattribute_id = 65)AND (at_namestore_id =1)ORDER BY name ASC
Wida wi c wyra nie e ORM i modele EAV s doskona ymi narz dziami ktoacutere nie tylkodaj programistom wiele mo liwo ci i warunkuj elastyczno ale roacutewnie pozwalaj tworzyrozwi zania zwi z e i czytelne
Korzystanie z kolekcji MagentoGdy przyjrzymy si jeszcze raz kodowi roacuted owemu z poprzedniego przyk adu warto zwroacuteciuwag e oproacutecz stworzenia instancji modelu produktu wywo ana roacutewnie zosta a metodagetCollection() Metoda getCollection() nale y do klasy Mage_Core_Model_Abstract cooznacza e mo e j wywo ywa ka dy model w Magento
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
77
Wszystkie kolekcje s dziedziczone po klasie Varien_Data_Collection
Kolekcja Magento jest w zasadzie modelem ktoacutery zawiera inne modele Dlatego zamiast prze-chowywa list produktoacutew w tablicy mo na u y do tego celu kolekcji produktoacutew Strukturadanych obecna w kolekcji sprzyja grupowaniu modeli a ponadto kolekcje udost pniaj spe-cjalne metody za pomoc ktoacuterych mo na przetwarza encje przechowywane w kolekcji
Oto najbardziej przydatne metody udost pniane przez kolekcje addAttributeToSelect mdash dodaje atrybut do encji w kolekcji W szczegoacutelno ci
w wywo aniu metody mo na u y symbolu wieloznacznego aby doda do encjiwszystkie dost pne atrybuty
addFieldToFilter mdash dodaje pole filtrowania do kolekcji Wywo uje si j na zwyk ychmodelach ktoacutere nie s modelami EAV
addAttributeToFilter mdash s u y do filtrowania kolekcji encji EAV addAttributeToSort mdash s u y do dodawania atrybutu do definicji porz dku sortowania addStoreFilter mdash pozwala na filtrowanie wzgl dem sklepu uwzgl dnia
dost pno produktu w sklepie addWebsiteFilter mdash dodaje do kolekcji filtr strony WWW addCategoryFilter mdash wskazuje filtr kategorii dla kolekcji produktoacutew addUrlRewrite mdash s u y do dodawania przepisanych adresoacutew URL dla produktu setOrder mdash ustawia porz dek sortowania kolekcji
S to tylko niektoacutere spo roacuted wszystkich dost pnych metod przetwarzania kolekcji Ka da kolekcjaimplementuje unikatowe metody ktoacuterych charakter zale y od rodzaju encji przechowywanychw kolekcji Na przyk ad kolekcja klientoacutew Mage_Customer_Model_Resource_Customer_Collectionma zaimplementowan unikatow metod groupByEmail() ktoacutera mdash zgodnie z nazw mdash grupujeencje w kolekcji wzgl dem adresu poczty elektronicznej
Podobnie jak w poprzednich przyk adach nadal b dziemy opiera si na modelach produktoacutewTym razem skupimy si na kolekcji produktoacutew Dla przypomnienia na rysunku 39 przedsta-wiono ponownie model dziedziczenia dla klasy Mage_Catalog_Model_Product
Rysunek 39 Drzewo dziedziczenia dla klasy Mage_Catalog_Model_Product
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
78
W celu lepszego zilustrowania sposobu w jaki mo na u ywa kolekcji we miemy pod uwagnast puj ce standardowe scenariusze dzia a na produktach
1 Uzyskanie kolekcji produktoacutew ktoacutere nale do okre lonej kategorii 2 Uzyskanie nowych produktoacutew ktoacutere pojawi y si w dniu x lub poacute niej 3 Uzyskanie produktoacutew ktoacutere najlepiej si sprzedaj 4 Filtrowanie kolekcji produktoacutew wzgl dem widoczno ci produktoacutew 5 Filtrowanie produktoacutew ktoacuterym nie przypisano obrazka 6 Dodanie wielu kryterioacutew porz dkowania
Uzyskanie kolekcji produktoacutewktoacutere nale do okre lonej kategoriiPierwszym zadaniem z jakim proacutebuje si upora wi kszo programistoacutew rozpoczynaj cych swojprzygod z Magento jest za adowanie kolekcji produktoacutew ktoacutere nale do okre lonej kategoriiNajcz ciej spotka mo na rozwi zania oparte na wykorzystaniu metod addCategoryFilter()lub addAttributeToFilter() Jednak w wi kszo ci przypadkoacutew u ywanych w praktyce zdecy-dowanie atwiej jest zastosowa rozwi zanie znacznie prostsze ale roacutewnie nie do ko ca in-tuicyjne w kontek cie informacji przedstawionych wcze niej w tej ksi ce
Najprostszy sposoacuteb realizacji zadania nie polega wcale na uzyskaniu kolekcji produktoacutew i jejpoacute niejszemu filtrowaniu wzgl dem kategorii lecz na stworzeniu najpierw instancji interesuj -cej nas kategorii a nast pnie pobraniu z niej kolekcji produktoacutew Aby przekona si o sku-teczno ci takiego podej cia w IMC nale y wykona nast puj cy fragment kodu
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()
W klasie Mage_Catalog_Model_Category zaimplementowana jest metoda getProductCollection()Warto przeanalizowa kod roacuted owy tej metody
public function getProductCollection() $collection = MagegetResourceModel(catalogproduct_collection) -gtsetStoreId($this-gtgetStoreId()) -gtaddCategoryFilter($this) return $collection
Jak wida funkcja tworzy jedynie instancj modelu zasoboacutew dla kolekcji produktoacutew to zna-czy jako sklep aktywny ustawia sklep o podanym identyfikatorze a nast pnie przekazuje dometody addCategoryFilter() bie c kategori
Opisane rozwi zanie jest bezpo rednim nast pstwem decyzji ktoacutere mia y na celu optymali-zacj wydajno ci Magento i u atwienie ycia programistom korzystaj cym z tego narz dziaDzi ki tym decyzjom bowiem kategoria b dzie w znakomitej wi kszo ci przypadkoacutew dost pnazawsze mdash w taki lub inny sposoacuteb
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
79
Uzyskanie nowych produktoacutewktoacutere pojawi y si w dniu x lub poacute niejSkoro wiadomo ju jak uzyska kolekcj produktoacutew z danej kategorii warto sprawdzi czymo liwe jest zastosowanie filtroacutew na wynikowym zbiorze produktoacutew aby ostatecznie otrzymatylko te ktoacutere pasuj do za o onych warunkoacutew W tym konkretnym przyk adzie zadanie b dziepolega na uzyskaniu wszystkich produktoacutew ktoacutere zosta y dodane nie wcze niej ni w grudniu2012 roku Analogicznie do poprzedniego przyk adu kolekcj produktoacutew mo na przefiltrowana podstawie daty ich stworzenia mdash w tym celu w IMC nale y wykona nast puj cy kod
kolekcja produktoacutew z poprzedniego przyk adu$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))
Proste prawda Mo na by nawet doda kolejny warunek i uzyska produkty ktoacutere zosta ydodane w okresie mi dzy dwiema podanymi datami Powiedzmy e konieczne jest odczytanierekordoacutew produktoacutew dodanych w grudniu
$productCollection-gtaddFieldToFilter(created_at array(from =gt 2012-12-01))$productCollection-gtaddFieldToFilter(created_at array(to =gt 2012-12-30))
Metoda addFieldToFilter Magento obs uguje warunki opisane w tabeli 31
Tabela 31 Warunki obs ugiwane przez metod addFieldToFilter
Kod atrybutu Warunek SQL
eq =
neq =
like LIKE
nlike NOT LIKE
in IN ()
nin NOT IN ()
is IS
notnull NOT NULL
null NULL
moreq gt=
gt gt
lt lt
gteq gt=
lteq lt=
Mo na te stosowa inne rodzaje filtroacutew Na przyk ad wykonanie poni szego kodu w IMC po na o-eniu filtra na dat utworzenia produktu spowoduje e zwroacutecone zostan tylko produkty widoczne
$productCollection-gtaddAttributeToFilter(visibility 4)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
80
visibility jest specjalnym atrybutem za pomoc ktoacuterego wskazuje si gdzie produkty majby widoczne Atrybut ten mo e mie nast puj ce warto ci
1 mdash produkty nie s widoczne pojedynczo 2 mdash produkty s widoczne w katalogu 3 mdash produkty s widoczne w wynikach wyszukiwania 4 mdash produkty s widoczne w katalogach i w wynikach wyszukiwania
Uzyskanie produktoacutew ktoacutere najlepiej si sprzedajAby uzyska list produktoacutew ktoacutere najlepiej sprzedaj si w danej kategorii nale y wykonapo czenie z tabel sales_order Mechanizm odczytywania rekordoacutew bestsellerowych pro-duktoacutew przyda si poacute niej do stworzenia specjalnej kategorii produktoacutew albo umieszczeniatakich danych w raportach W IMC trzeba wykona nast puj cy kod
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtgetSelect()-gtjoin(array(o=gt sales_flat_order_item)main_tableentity_id = oproduct_id array(orow_totaloproduct_id))-gtgroup(array(sku))
Warto przeanalizowa zw aszcza operacje wykonywane w trzecim wierszu kodu MetodagetSelect() jest dziedziczona bezpo rednio z klasy Varien_Data_Collection_Db i zwracazmienn w ktoacuterej znajduje si instrukcja Select Zmienna ta zawiera roacutewnie kolekcje ktoacutereudost pniaj metody odpowiedzialne za definiowanie z cze oraz za wykonywanie grupo-wania bez konieczno ci pisania kodu j zyka SQL
Nie jest to jedyny mo liwy sposoacuteb dodawania z czenia do kolekcji Tak naprawd istniejeroacutewnie inne rozwi zanie o wiele prostsze Polega ono na wykorzystaniu funkcji joinField()Nowa wersja kodu w ktoacuterej wykorzystana zostanie ta funkcja b dzie mie nast puj c posta
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtjoinField(o sales_flat_order_item array(orow_totaloproduct_id) main_tableentity_id = oproduct_id)-gtgroup(array(sku))
Filtrowanie kolekcji produktoacutewwzgl dem widoczno ci produktoacutewTo zadanie mo na wykona bardzo atwo za pomoc metody addAttributeToFilter() Produktyw Magento s wyposa one w systemowy atrybut visibility ktoacutery okre la ich widoczno Atrybut visibility mo e mie jedn z czterech warto ci liczbowych z przedzia u od 1 do 4W naszym przyk adzie interesuje nas wy cznie pokazywanie produktoacutew dla ktoacuterych atrybutwidoczno ci ma warto 4 co oznacza e produkty te s widoczne zaroacutewno w wynikach wy-szukiwania jak i w katalogu W IMC nale y wykona nast puj cy kod roacuted owy
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
81
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(visibility 4)
Gdy widoczno produktu zostanie zmieniona b dzie mo na poroacutewna wynik wykonania koduna roacute nych kolekcjach
Filtrowanie produktoacutew ktoacuterym nie przypisano obrazkaFiltrowanie produktoacutew bez przypisanego obrazka przydatne jest mi dzy innymi woacutewczas gdy im-portuje si dane z zewn trznego systemu ktoacutery czasami zawodzi Podobnie jak we wszystkich wcze-niejszych przyk adach roacutewnie dla obrazka skojarzonego z produktem istnieje odpowiedni atrybut
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))
Dzi ki zdefiniowaniu dodatkowego filtra produkty zwroacutecone w kolekcji wynikowej b d mieskojarzony z nimi ma y obrazek Domy lnie w Magento wyst puj trzy typy obrazkoacutew dlaproduktoacutew miniatury ma e obrazki small_image oraz obrazki w a ciwe Ka dy z tych trzechtypoacutew obrazkoacutew jest wykorzystywany w roacute nych cz ciach aplikacji Zatem regu wyszuki-wania produktoacutew mo na by jeszcze bardziej zaw zi
$productCollection-gtaddAttributeToFilter(small_imagearray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(thumbnailarray(notnull=gtneq=gtno_selection))-gtaddAttributeToFilter(imagearray(notnull=gtneq=gtno_selection))
Tak skonstruowany kod spowoduje e zwroacutecona zostanie kolekcja produktoacutew dla ktoacuterychwskazano wszystkie trzy typy obrazkoacutew Mo na poeksperymentowa na w asn r k i filtrowaprodukty wzgl dem roacute nych typoacutew obrazkoacutew
Dodanie wielu kryterioacutew porz dkowaniaW ostatnim zadaniu uporz dkujemy zawarto kolekcji najpierw wzgl dem stanu magazynowegoa nast pnie wzgl dem ceny mdash od najwy szej do najni szej Informacj o stanie magazynowymzwroacuteci metoda addStockStatusToSelect() ktoacutera jest dost pna tylko w modelu zasoboacutew repre-zentuj cym w a nie stan magazynowy Metoda addStockStatusToSelect() sama wygenerujeodpowiednie zapytanie j zyka SQL ktoacutere zwroacuteci kolekcj
$category = MagegetModel(catalogcategory)-gtload(5)$productCollection = $category-gtgetProductCollection()$select = $productCollection-gtgetSelect()MagegetResourceModel(cataloginventorystock_status)-gtaddStockStatusToSelect($select Mageapp()-gtgetWebsite())
$select-gtorder(salable desc)$select-gtorder(price asc)
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
82
Zapytanie to spowoduje e Magento uporz dkuje produkty wzgl dem ich dost pno ci dosprzeda y (b d cej warto ci logiczn mdash produkt mo e by dost pny w sprzeda y lub nie)oraz wzgl dem ceny Jako efekt ko cowy zwroacutecona zostanie kolekcja produktoacutew uporz dkowa-nych w ten sposoacuteb e na pocz tku wyst powa b d produkty dost pne w sprzeda y u o onewzgl dem ceny od najwy szej do najni szej a w dalszej kolejno ci widnie b d produktyniedost pne w sprzeda y tak e uporz dkowane od najdro szego do najta szego
Warto poeksperymentowa z roacute nymi kombinacjami kryterioacutew sortowania aby zobaczy jakMagento organizuje i porz dkuje kolekcje produktoacutew
Wykonywanie bezpo rednich zapytaj zyka SQLWiemy ju w jaki sposoacuteb modele danych Magento oraz system ORM u atwiaj odczytywaniei zapisywanie danych oraz manipulowanie nimi Zanim zajmiemy si g oacutewnymi tematami tegopunktu czyli adapterami baz danych w Magento oraz wykonywaniem bezpo rednich zapytaj zyka SQL najpierw koniecznie trzeba powiedzie dlaczego zasadniczo powinno si unikastosowania tych technik
Magento jest systemem niezwykle z o onym przynajmniej cz ciowo sterowanym zdarzeniamio czym by a ju mowa w poprzednim rozdziale Samo zapisanie produktu wyzwala roacute negorodzaju zdarzenia z ktoacuterych ka de wykonuje inne zadanie Zdarzenia nie zajd jednak woacutewczasgdy zmiana danych na temat produktu zostanie wprowadzona bezpo rednio przez zapytanieSQL Dlatego programi ci musz pracowa z Magento z niezwyk ostro no ci i zawsze siupewnia czy istnieje wystarczaj cy powoacuted by nie korzysta z ORM
Istniej rzecz jasna okoliczno ci w ktoacuterych mo liwo bezpo redniego operowania na baziedanych jest bardzo przydatna i okazuje si atwiejszym sposobem wykonania niektoacuterych zadani wykorzystywanie modeli Magento Na przyk ad aby zmieni globalnie okre lony atrybutproduktu albo zmodyfikowa status produktoacutew w kolekcji mo na by za adowa kolekcj pro-duktoacutew i w p tli przej przez ka dy z nich wprowadzaj c w nich wymagane zmiany i za-pisuj c je jedn po drugim W przypadku niewielkiej kolekcji podej cie takie jeszcze by sisprawdzi o jednak im wi kszy b dzie rozmiar zbioru danych tym ni sza stanie si wydajnop tli przetwarzaj cej kolekcj W przypadku wi kszych kolekcji wykonanie p tli mo e trwanawet d ugie sekundy
Bezpo rednie zapytanie j zyka SQL zostanie wykonane zdecydowanie szybciej zwykle w ci gumniej ni jednej sekundy zale nie od rozmiaru zbioru przetwarzanych danych oraz charakteruwykonywanego zapytania
Magento ma zaimplementowane mechanizmy ktoacutere odpowiadaj za nawi zanie po czeniaz baz danych Odpowiednie metody znajduj si w klasie Mage_Core_Model_Resource i umo -liwiaj nawi zanie po czenia jednego z dwoacutech typoacutew core_read lub core_write
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Rozdzia 3 bull ORM i kolekcje danych
83
Na pocz tek stworzymy model zasobu oraz dwa po czenia mdash jedno do odczytu i drugie do zapisu
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$write = $resource-gtgetConnection(core_write)
Nawet gdy trzeba wykona bezpo rednie zapytanie j zyka SQL dzi ki Magento nie trzebasi martwi o zestawienie po czenia z baz danych mdash wystarczy tylko stworzy instancjmodelu zasobu i wybra odpowiedni rodzaj po czenia
OdczytDzia anie po czenia do odczytu mo na sprawdzi przez wykonanie nast puj cego kodu roacuted owego
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM catalog_product_entity$results = $read-gtfetchAll($query)
Tak skonstruowane zapytanie jest prawid owe i powinno zwroacuteci wszystkie produkty z tabelicatalog_product_entity A co si stanie gdy ten sam kod sproacutebujemy uruchomi w instancji Ma-gento w ktoacuterej nazwy tabel s poprzedzone prefiksem Albo gdy wraz z kolejn aktualizacj nazwytabel Magento ulegn zmianie Kod roacuted owy w takiej postaci nie jest ani przeno ny ani atwyw utrzymaniu Na szcz cie model zasobu udost pnia przydatn metod o nazwie getTableName()
Metoda getTableName() przyjmuje parametr ktoacuterym jest nazwa wytwoacutercza a nast pnie napodstawie konfiguracji zdefiniowanej w pliku configxml nie tylko znajduje w a ciw tabel ale roacutewnie od razu sprawdza czy tabela ta istnieje w bazie danych W celu wykorzystaniametody getTableName() przyk adowy kod nale y zmieni do nast puj cej postaci
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_read)$query = SELECT FROM $resource-gtgetTableName(catalogproduct)$results = $read-gtfetchAll($query)
W przyk adowym kodzie wykonywana jest roacutewnie metoda fetchAll() ktoacutera zwraca wszystkiewiersze wynikowe zapytania umieszczone w tablicy Nie jest to jednak jedyna u ywana opcjamdash dost pne s roacutewnie metody fetchCol() i fetchOne() Poni ej opisano dzia anie trzechwymienionych metod
fetchAll mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniaoryginalnego zapytania
fetchOne mdash funkcja zwraca jedynie warto ci z pierwszego wiersza stanowi cegowynik wykonania zapytania
fetchCol mdash funkcja zwraca wszystkie wiersze uzyskane w wyniku wykonaniazapytania lecz tylko pierwsz kolumn ka dego wiersza Funkcja przydaje sina przyk ad woacutewczas gdy wystarczy odczyta pierwsz kolumn z unikatowymiidentyfikatorami takimi jak identyfikatory produktoacutew albo jednostki magazynowe SKU
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Magento Przewodnik dla programistoacutew PHP
84
ZapisywanieJak wspomniano ju wcze niej zapisywanie modelu mdash produktu kategorii klienta i tak dalejmdash mo e trwa w Magento stosunkowo d ugo ze wzgl du na znaczn liczb obserwatoroacutewi zdarze wywo ywanych w tle
Je li jednak zadanie sprowadza si do zapisania zmienionych prostych statycznych warto cidokonanie takiej modyfikacji w obszernych kolekcjach z wykorzystaniem ORM Magento mo-e by czynno ci czasoch onn Za oacute my na przyk ad e wszystkie produkty nale y oznaczy
jako niedost pne w magazynie Zamiast wykonywania tej operacji z wykorzystaniem modeliudost pnianych przez Magento albo tworzenia w asnego skryptu ktoacutery b dzie iterowa przezkolejne pozycje kolekcji wszystkich produktoacutew wystarczy wykona nast puj cy przyk adowykod roacuted owy
$resource = MagegetModel(coreresource)$read = $resource-gtgetConnection(core_write)$tablename = $resource-gtgetTableName(cataloginventorystock_status)$query = UPDATE $tablename SET is_in_stock` = 1$write-gtquery($query)
PodsumowanieW tym rozdziale opisane zosta y nast puj ce zagadnienia
modele Magento ich dziedziczenie i przeznaczenie sposoacuteb w jaki Magento u ywa modeli zasoboacutew i kolekcji model EAV oraz jego znaczenie w Magento sposoacuteb dzia ania EAV oraz struktura danych w bazie model ORM Magento i jego implementacja sposoacuteb korzystania z bezpo rednich zapyta j zyka SQL oraz adapteroacutew zasoboacutew
Magento
Dotychczasowe rozdzia y mia y charakter raczej teoretyczny ni praktyczny a ich celem by ou wiadomienie czytelnikowi stopnia z o ono ci Magento oraz przedstawienie narz dzi i in-formacji niezb dnych w trakcie lektury kolejnych rozdzia oacutew W dalszej cz ci ksi ki skupimysi na bardziej praktycznych zagadnieniach i stopniowo zaczniemy tworzy w asne rozszerzeniaz wykorzystaniem dotychczas poznanych mechanizmoacutew
W nast pnym rozdziale ubrudzimy sobie nieco d onie i stworzymy swoje pierwsze rozszerzenieMagento
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Skorowidz
AAccess Control List Patrz ACLACL 141adapter sieciowy 20adres URL 107
zwrotny 162Advanced Packaging Tool Patrz APTakcja 36
masowa 145 146Apache 15API
rozszerzanie 167zabezpieczenie 177
API REST 155 159 175sieciowe 159
APT 23asercja 189atrybut 68
null 69visibility 80
BBehat 182biblioteka
APT Patrz APTJavaScript 35Mink Patrz MinkPEAR 35PHP dla Behat 182Zend 35
blok 47 49 116 117 118formularza 147 148kontenera 133
formularza 142 147siatki 142 143tabeli 136
CCakePHP 43Chef 29Composer 182Core API 155CRUD 63CSS 35
Ddane
logowania w us udze sieciowej 160 162adowanie 151 164
model Patrz model danychodczytywanie 164testowe 186tymczasowe 35zapisywanie 152zmienianie 165
dystrybucja 206 212
EEAV Patrz model encja ndash atrybut ndash wartoEcomdev_PHPUnit 182 187encja 68
listy 93 95produktu 70 72
entity-attribute-value Patrz modelencja ndash atrybut ndash warto
Ffactory name Patrz nazwa wytwoacuterczafixtures Patrz zestaw testowy
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Skorowidz
220
folderapp 35Block 36code 35community 38Controller 36Controllers 36core 38design 35etc 36Helper 36js 35lib 35local 38locale 35Magento 35media 35Model 36skin 35sql 36var 35
formatJSON 159XML 159
formularz 147funkcja
__autoload 37_underscore 66addColumn 103addForeignKey 104addIndex 104enkapsulacja 36getChildHtml 139getData 97has 66joinField 80set 66unset 66
Ggenerator zdarzenia Patrz zdarzenie generatorGit 31 204 205
Hhas o u ytkownika 20
IIMC 62instancja kontrolera interfejsu u ytkownika 39instrukcja switch 66Interactive Magento Console Patrz IMCInteractive Ruby Console Patrz IRCinteraktywna konsola Ruby Patrz IRCinterfejs u ytkownika 39 48IRC 62
Jj zyk
opisu us ug sieciowych Patrz WSDLskryptowy 24
Kkana dystrybucji rozszerze 206katalog appcodelocal 87klasa
abstrakcyjna 36Block 52bloku 134 135helper 92Helper 52Mage_Core_Model_Resource 82Model 52modelu 62
kolekcji 63zasoboacutew 63
pomocnicza 36 92 121Varien_Data_Collection 77Varien_Data_Collection_Db 80Varien_Object 65 66zasobu 93 94
kolekcja 77konfiguracja 51 141
zasi g 91 130globalny 51 91sklep 52widok sklepu 52witryna WWW 51
konsola interaktywnaMagento Patrz IMCRuby Patrz IRC
kontenerGrid 136siatki 142
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Skorowidz
221
kontroler 50 117indeksu 108 109interfejsu u ytkownika 39testowy 108tworzenie 131widoku 108 115 127wyszukiwania 108 113 123
LLAMP 15 29LAMP Server 22Linux 15
Ubuntu Server 16lista
element 92kontroli dost pu Patrz ACLmodel Patrz model listy
lista prezentoacutew 85logika biznesowa 62
MMagento Connect 206 212Magento Enterprise Edition 69Magento Test Automation Framework
Patrz Magento_TAFMagento_Mink 182Magento_TAF 182Magento wymagania systemowe 15mapowanie OR Patrz ORMmaszyna wirtualna 16
LAMP Patrz LAMPLinux 16
Memcached 24Mercurial 31 204metoda
__call 64 66addAttributeToFilter 77 78 80addAttributeToSelect 77addAttributeToSort 77addCategoryFilter 77 78addFieldToFilter 77addStockStatusToSelect 81addStoreFilter 77addUrlRewrite 77addWebsiteFilter 77DELETE 160fetchAll 83
fetchCol 83fetchOne 83GET 160getCollection 76getName 64 67getPrice 64getSelect 80getTableName 83MagegetHelper 91MagegetModel 91magiczna 64 66match 39 41narz dziowa 92POST 160protoko u HTTP 160PUT 160setget 66setOrder 77wytwoacutercza 52 91
MagedispatchEvent 56 57MagegetModel 52 53MagegetResourceHelper 52MagegetResourceModel 52MagegetResourceSingleton 52MagegetSingleton 52Magehelper 52
Mink 195 196model
danych Magento 62EAV 47 62 68 70encja ndash atrybut ndash warto Patrz model EAVlisty 92prosty 47 62tworzenie 92 93
model ndash widok ndash kontroler Patrz MVCModel-View-Controller Patrz MVCModgit 195Modman 182 195modu
Adminhtml 136administracyjny 129automatycznego adowania 37deklaracja 215konfiguracja 90Mage_Adminhtml 130
MVC 34 43 216oparte na konfiguracji 44oparte na konwencjach 43
MySQL 15
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Skorowidz
222
Nnazwa
komputera 20u ytkownika 20wytwoacutercza 31
NetBeans 31
Oobiekt
EAV 69instancja 63Memcached 24Router 39cie ki 39
object-relational mapping Patrz ORMobserwator 55 58odwzorowanie obiektowo-relacyjne Patrz ORMORM 47 61 64
Ppami podr czna 24 35
wy czanie 88PEAR 24PHP 15 24PHP 5 24PhpStorm 31PHPUnit 182platforma
e-commerce 33programistyczna 33Zend Framework Patrz Zend Frameworkzorientowana obiektowo 33 34
plikgitignore 32phtml 116 118xml 87adminhtmlxml 90 141apixml 90blokady indeksu 35cachexml 90catalogxml 48configxml 36 44 90 97 99 117 133 141 215convertxml 90deklaracji modu u 215indexphp 39IndexControllerphp 216
instalacyjny 36JSON 30 159konfiguracyjny 87 88 99 107 130 132multimedialny 35pami ci podr cznej 35PHTML 49rozwojowy 25systemxml 36 44 90uk adu 48 116 118 125 126 138 150
adminhtml 132widgetxml 90wsdlxml 90wsixml 90XML 36 47 116 118 132 138 159
po czeniecore_read 82 83core_write 82 84
programowanie sterowane przez testy Patrz TDDprotokoacute
HTTP 157 159OAuth 162XML-RPC Patrz XML-RPC
przegl darka 195emulator 195
przestrze nazw 87admin 131
przypadekbrzegowy 202testowy 189 191 202
pula kodu 38 87
Rrozszerzenie 85
aktywowanie 88wdra anie 202
SSelenium 195serwer
Apache2 16 23baz danych 25HTTP 23LAMP 22MySQL Patrz MySQLNginx 16SSH 23WWW 15
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Skorowidz
223
setup resources Patrz zasoacuteb konfiguracyjnysiatka 142
wid et Patrz wid et siatkisklep 51skrypt
aktualizacyjny 101 103danych 101 103 104 106instalacyjny 100 101 103 106
SOAP API Magento 155 157sterownik 195Subversion Patrz SVNSVN 31 204Symfony 43system
buforowania obiektoacutew Memcached 24kontroli wersji Patrz VCSmapowania obiektowo-relacyjnego Patrz ORM
szablon 47 116 117 122aplikacji 35pliku dla bloku 135t umacze 35
cie ka 107 217wspoacute u ytkowanie nazwy 130
rodowiskoIDE 31produkcyjne 16 203rozwojowe 16
Ttabela
catalog_product_entity 70 71 73catalog_product_entity_datetime 73catalog_product_entity_decimal 73catalog_product_entity_gallery 73catalog_product_entity_int 73catalog_product_entity_media_gallery 73catalog_product_entity_text 73catalog_product_entity_tier_price 73catalog_product_entity_varchar 73eav_attribute 72
TDD 181test
automatyzacja 202black-box 195funkcjonalny 181 195 197integracyjny 202
jednostkowy 180 182 187 202Mink 196regresyjny 180 181
test driven development Patrz TDDtestowanie 179 180 185
narz dzia 182
UUbuntu Server 16uk ad 47 48us uga sieciowa REST 159u ytkownik
has o 20rola API 160root 25
VVagrant 29VCS 31 204version control system Patrz VCSvirtual machines Patrz maszyna wirtualnaVirtualBox 16 19 29VM Patrz maszyna wirtualna
Wwarstwa
logiki 36modeli 47widokoacutew 47
warto 68wdra anie 201 202 203
minimalizacja czasu 201Web Services Description Language Patrz
WSDLw ze
adminhtml 91block 49config 91event 59frontend 91global 91handle 49konfiguracyjny 91modules 91obserwatora 59reference 49resources 99
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę
Skorowidz
224
widok 47wid et
formularza 147siatki 136
wirtualizacja 16witryna WWW 51WSDL 157wywo anie POST 157
XXML-RPC 155 156
YYet Another Markup Language Patrz plik YAML
Zzapewnienie jako ci 179zapytanie SQL 82 98zasoacuteb konfiguracyjny 98zdarzenie 55
nas uchiwanie 55 58zdarzenie generator 55 56Zend Framework 24 33 35zestaw testowy 186 188
danie SOAP 157
Kup książkę Poleć książkę