+ All Categories
Home > Documents > Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki...

Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki...

Date post: 04-Jul-2020
Category:
Upload: others
View: 21 times
Download: 0 times
Share this document with a friend
40
Transcript
Page 1: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 2: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 3: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 4: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 5: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 6: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 7: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 8: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 9: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 10: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 11: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 12: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 13: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 14: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 15: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 16: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 17: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 18: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 19: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 20: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 21: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 22: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 23: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 24: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 25: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 26: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 27: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 28: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 29: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 30: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 31: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 32: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 33: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 34: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 35: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 36: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 37: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

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ę

Page 38: Tytuł oryginału: Magento PHP Developer's Guide …Magento. IMC jest prostym skryptem powïoki Magento, który pozwoli nam testowaÊ kod w czasie rzeczywistym. 2. Po rozpakowaniu

Recommended