Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00252 006164 12446471 na godz. na dobę w sumie
Joomla! 1.5 od kuchni. Ponad 130 przepisów! - książka
Joomla! 1.5 od kuchni. Ponad 130 przepisów! - książka
Autor: Liczba stron: 360
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-2702-8 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> joomla!
Porównaj ceny (książka, ebook, audiobook).

Tu znajdziesz rozwiązania najczęściej spotykanych problemów!

Joomla! to rozbudowany i uniwersalny system zarządzania treścią witryn internetowych, dostępny na prawach open source. Umożliwia tworzenie nie tylko prostych stron internetowych, ale także kompleksowych, rozbudowanych serwisów. Siłą Joomla! jest prostota oraz zaangażowanie twórców w zapewnienie łatwości pracy z tym systemem. Zaawansowani użytkownicy często potrzebują jednak rozwiązań wykraczających poza możliwości dostępnych rozszerzeń. Naprzeciwko tym oczekiwaniom wychodzi elastyczny framework Joomla! - pozwala on programistom dostosowywać się w dowolny sposób i tworzyć własne aplikacje, spełniające wyrafinowane kryteria.

Książka 'Joomla! 1.5 od kuchni. Ponad 130 przepisów!' przeznaczona jest dla programistów dysponujących doświadczeniem w implementowaniu rozszerzeń dla tego systemu. Stanowi zbiór ponad 130 prostych, lecz niezwykle użytecznych przepisów, pozwalających rozwiązać praktyczne problemy związane z programowaniem w Joomla!.

Dzięki swemu bogatemu doświadczeniu autor w efektywny i zrozumiały sposób dzieli się posiadaną wiedzą. Przedstawia niewielkie objętościowo przykłady, które ilustrują sposób radzenia sobie z problemami programistycznymi lub projektowymi, powszechnie spotykanymi podczas tworzenia rozszerzeń Joomla!. Profesjonaliści znajdą tu przede wszystkim praktyczne przepisy rozwiązań konkretnych trudności, a początkujący także wiedzę ogólną (związaną chociażby z obsługą błędów w Joomla!), odpowiedzi na pytania oraz sposoby realizacji standardowych zadań. Rozwiązania dotyczą podstawowych zagadnień, czyli m.in. bezpieczeństwa, dostępu do danych, użytkowników, sesji czy możliwości wykorzystania języków narodowych.

Poznaj rozwiązania najczęściej spotykanych w pracy z Joomla! 1.5 problemów, aby tworzyć rozszerzenia lepiej, szybciej i bezpieczniej!



Prowadzisz bloga, serwis informacyjny, stronę firmową?
Dołącz do Programu Partnerskiego - Zostań wtyczką Helionu!

więcej>>
Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Joomla! 1.5 od kuchni. Ponad 130 przepisów! Autor: James Kennard T³umaczenie: Daniel Kaczmarek ISBN: 978-83-246-2702-8 Tytu³ orygina³u: Joomla! 1.5 Development Cookbook Format: B5, stron: 360 Tu znajdziesz rozwi¹zania najczêœciej spotykanych problemów! (cid:129) Jak zapewniæ mo¿liwoœæ rozwoju rozszerzeñ w przysz³oœci? (cid:129) Jak wspó³pracowaæ z bazami danych? (cid:129) Jak obs³ugiwaæ b³êdy, wykorzystuj¹c mechanizmy Joomla!? Joomla! to rozbudowany i uniwersalny system zarz¹dzania treœci¹ witryn internetowych, dostêpny na prawach open source. Umo¿liwia tworzenie nie tylko prostych stron internetowych, ale tak¿e kompleksowych, rozbudowanych serwisów. Si³¹ Joomla! jest prostota oraz zaanga¿owanie twórców w zapewnienie ³atwoœci pracy z tym systemem. Zaawansowani u¿ytkownicy czêsto potrzebuj¹ jednak rozwi¹zañ wykraczaj¹cych poza mo¿liwoœci dostêpnych rozszerzeñ. Naprzeciwko tym oczekiwaniom wychodzi elastyczny framework Joomla! – pozwala on programistom dostosowywaæ siê w dowolny sposób i tworzyæ w³asne aplikacje, spe³niaj¹ce wyrafinowane kryteria. Ksi¹¿ka „Joomla! 1.5 od kuchni. Ponad 130 przepisów!” przeznaczona jest dla programistów dysponuj¹cych doœwiadczeniem w implementowaniu rozszerzeñ dla tego systemu. Stanowi zbiór ponad 130 prostych, lecz niezwykle u¿ytecznych przepisów, pozwalaj¹cych rozwi¹zaæ praktyczne problemy zwi¹zane z programowaniem w Joomla!. Dziêki swemu bogatemu doœwiadczeniu autor w efektywny i zrozumia³y sposób dzieli siê posiadan¹ wiedz¹. Przedstawia niewielkie objêtoœciowo przyk³ady, które ilustruj¹ sposób radzenia sobie z problemami programistycznymi lub projektowymi, powszechnie spotykanymi podczas tworzenia rozszerzeñ Joomla!. Profesjonaliœci znajd¹ tu przede wszystkim praktyczne przepisy rozwi¹zañ konkretnych trudnoœci, a pocz¹tkuj¹cy tak¿e wiedzê ogóln¹ (zwi¹zan¹ chocia¿by z obs³ug¹ b³êdów w Joomla!), odpowiedzi na pytania oraz sposoby realizacji standardowych zadañ. Rozwi¹zania dotycz¹ podstawowych zagadnieñ, czyli m.in. bezpieczeñstwa, dostêpu do danych, u¿ytkowników, sesji czy mo¿liwoœci wykorzystania jêzyków narodowych. (cid:129) Zapewnienie rozwoju rozszerzeñ (cid:129) Komunikacja z bazami danych (cid:129) Tworzenie Ÿróde³ Atom i RSS (cid:129) Bezpieczeñstwo rozszerzeñ (cid:129) Obs³uga b³êdów i wyj¹tków (cid:129) Formatowanie stron (cid:129) Tworzenie miêdzynarodowych rozszerzeñ (cid:129) Komunikacja z u¿ytkownikiem (cid:129) Obiekty JObject i tablice (cid:129) System plików (cid:129) Korzystanie z repozytorium Subversion Poznaj rozwi¹zania najczêœciej spotykanych w pracy z Joomla! 1.5 problemów, aby tworzyæ rozszerzenia lepiej, szybciej i bezpieczniej! Spis treĂci O autorze Wprowadzenie Rozdziaï 1. Programowanie przy uĝyciu JoomlaCode.org i SVN Wprowadzenie Tworzenie projektu JoomlaCode.org ZarzÈdzanie uczestnikami projektu JoomlaCode.org Tworzenie repozytorium Subversion dla projektu JoomlaCode.org Szkielet repozytorium Subversion Modyfikacje w Subversion Proces realizowany w Subversion Pobieranie zawartoĂci repozytorium Subversion przy uĝyciu TortoiseSVN Edytowanie kopii roboczej przy uĝyciu TortoiseSVN Analiza zmian przy uĝyciu TortoiseSVN Uaktualnianie kopii roboczej i eliminowanie konfliktów przy uĝyciu TortoiseSVN Zatwierdzanie zmian przy uĝyciu TortoiseSVN Eksportowanie kopii roboczej przy uĝyciu TortoiseSVN Rozdziaï 2. Zapewnianie bezpieczeñstwa rozszerzeñ Wprowadzenie Tworzenie bezpiecznych zapytañ SQL Tworzenie bezpiecznych zapytañ SQL, zawierajÈcych porównania ciÈgów znaków, z wykorzystaniem operatora LIKE Uĝywanie tokenu Zapewnianie bezpieczeñstwa nazwy pliku Zapewnianie bezpieczeñstwa Ăcieĝki katalogu Zapewnianie bezpieczeñstwa Ăcieĝki dostÚpu do pliku Bezpieczne pobieranie danych z ĝÈdania Pobieranie wartoĂci z tablicy 9 11 15 16 19 23 25 28 30 32 35 39 40 41 44 46 47 47 50 55 57 61 63 65 68 75 Spis treĞci Rozdziaï 3. Praca z bazÈ danych Wprowadzenie Wykonywanie zapytania ’adowanie pierwszej komórki ze zbioru wyników zapytania ’adowanie pierwszego rekordu z zapytania ’adowanie wiÚcej niĝ jednego rekordu z zapytania Obsïuga bïÚdów DBO Tworzenie tabeli JTable Tworzenie nowego rekordu przy uĝyciu JTable Modyfikacja rekordu przy uĝyciu JTable Odczytywanie istniejÈcego rekordu przy uĝyciu JTable Usuwanie rekordu przy uĝyciu JTable Blokowanie i odblokowywanie rekordu przy uĝyciu JTable Zmiana kolejnoĂci rekordów przy uĝyciu JTable Publikowanie i wycofywanie rekordu z publikacji przy uĝyciu JTable ZwiÚkszanie licznika wyĂwietleñ rekordu przy uĝyciu JTable Rozdziaï 4. Sesje i uĝytkownicy Wprowadzenie Pobieranie uchwytu sesji Dodawanie danych do sesji Pobieranie danych sesji Sprawdzanie obecnoĂci danych w sesji Sprawdzanie tokenu sesji Pobieranie danych o uĝytkowniku Sprawdzanie, czy aktualny uĝytkownik ma status goĂcia Odczytywanie imienia i nazwiska uĝytkownika oraz jego nazwy Odczytywanie identyfikatora grupy uĝytkownika oraz typu uĝytkownika Ograniczanie zakresu dostÚpu uĝytkownika przy uĝyciu poziomów dostÚpu Public, Registered i Special Odczytywanie wartoĂci parametrów uĝytkownika Ustawianie wartoĂci parametrów uĝytkownika Rozszerzanie i edytowanie parametrów uĝytkownika Wysyïanie wiadomoĂci poczty elektronicznej do uĝytkownika Rozdziaï 5. JÚzyki narodowe Wprowadzenie Tworzenie tïumaczenia Tïumaczenie wybranego tekstu Sprawdzanie dïugoĂci ciÈgu znaków UTF-8 Usuwanie niewidocznych znaków UTF-8 z poczÈtku i koñca ciÈgu znaków Porównywanie ciÈgów znaków UTF-8 Znajdowanie ciÈgu znaków UTF-8 w innym ciÈgu znaków UTF-8 Wykonywanie wyraĝenia regularnego na ciÈgu znaków UTF-8 Odwracanie ciÈgu znaków UTF-8 WyodrÚbnianie ciÈgu znaków z innego ciÈgu znaków UTF-8 4 77 77 80 82 84 87 89 91 94 97 98 99 100 102 104 105 107 107 108 109 112 114 115 115 117 118 120 122 124 126 127 131 135 135 138 142 145 146 148 149 151 153 154 Spis treĞci ZastÚpowanie wystÈpieñ ciÈgu znaków UTF-8 w innym ciÈgu znaków UTF-8 Odczytywanie w ciÈgu znaków UTF-8 znaku na wskazanej pozycji Przeksztaïcanie ciÈgu znaków z jednego standardu kodowania na inny Tworzenie skryptu instalacji bazy danych uwzglÚdniajÈcego kodowanie UTF-8 Rozdziaï 6. Interakcja z uĝytkownikiem i style Wprowadzenie Odczytywanie parametrów strony i komponentu Dodawanie do strony kaskadowego arkusza stylów CSS Nadpisywanie szablonów w komponencie Dodawanie kodu JavaScript na stronie Tworzenie modalnego okna dialogowego Generowanie treĂci modalnej Uaktualnianie elementu przy uĝyciu Ajax i MooTools Uaktualnianie elementu na podstawie formularza przy uĝyciu Ajax i MooTools Przesyïanie odpowiedzi Ajax z komponentu WïÈczanie stronicowania na liĂcie elementów Rozdziaï 7. Dostosowywanie dokumentów Wprowadzenie Definiowanie tytuïu dokumentu Definiowanie generatora dokumentu Definiowanie opisu dokumentu Dodawanie metadanych do dokumentu Zmiana zestawu znaków uĝywanego w dokumencie Zmiana typu MIME dokumentu Kontrola mechanizmu zapisywania odpowiedzi w pamiÚci podrÚcznej klienta Tworzenie dokumentu PDF w komponencie Tworzenie kanaïu RSS lub Atom w komponencie Zwracanie dokumentu w formacie RAW z komponentu Uĝywanie wïasnego dokumentu JDocument w komponencie (dotyczy wyïÈcznie PHP5) Rozdziaï 8. Dostosowywanie elementów standardowych Wprowadzenie WyïÈczanie paska menu Ustawianie tytuïu i ikony paska narzÚdziowego Dodawanie do paska narzÚdziowego przycisku operujÈcego na jednostce danych Dodawanie do paska narzÚdziowego przycisku operujÈcego na zestawie danych Dodawanie wïasnych przycisków do paska narzÚdziowego Dodawanie odstÚpów i separatorów na pasku narzÚdziowym Dodawanie systemu pomocy do komponentu Tworzenie nagïówka filtru dla danych tabelarycznych w komponencie MVC Filtrowanie danych tabelarycznych w komponencie MVC Tworzenie nagïówków kolumn sterujÈcych sortowaniem danych tabelarycznych w komponencie MVC PorzÈdkowanie danych tabelarycznych w komponencie MVC 155 157 158 159 163 163 164 166 168 170 171 174 176 179 181 184 189 189 191 192 192 193 194 196 198 200 201 206 208 215 216 216 218 219 222 224 227 228 230 234 238 240 5 Spis treĞci Rozdziaï 9. Utrzymywanie rozszerzalnoĂci i modularnoĂci Wprowadzenie ’adowanie moduïów dodatkowych Wywoïywanie moduïu dodatkowego Tworzenie dodatkowego moduïu w systemie Joomla!, realizujÈcego wyszukiwanie Tworzenie wïasnej biblioteki i funkcji importujÈcej Instalowanie moduïu dodatkowego z poziomu kodu ěródïowego w trakcie instalacji komponentu Prosty sposób zarzÈdzania kategoriami Definiowanie parametrów JParameter przy uĝyciu jÚzyka XML Tworzenie obiektu JParameter Renderowanie obiektu JParameter Zapisywanie danych JParameter Odczytywanie i ustawianie wartoĂci obiektu JParameter Definiowanie wïasnego typu JParameter Rozdziaï 10. Obiekty JObject i tablice Wprowadzenie Odczytywanie wïaĂciwoĂci JObject Odczytywanie wszystkich publicznych wïaĂciwoĂci JObject Ustawianie wïaĂciwoĂci JObject Ustawianie zbioru wïaĂciwoĂci JObject Raportowanie bïÚdu w JObject Pobieranie bïÚdu z JObject Pobieranie wszystkich bïÚdów z JObject Przeksztaïcanie obiektu w tablicÚ Przeksztaïcanie tablicy w obiekt Odczytywanie kolumny z tablicy wielowymiarowej Odczytywanie wartoĂci z tablicy Rzutowanie wszystkich elementów tablicy na liczby caïkowite Sortowanie tablicy obiektów ’Èczenie elementów tablicy Rozdziaï 11. Obsïuga i raportowanie bïÚdów Wprowadzenie Zgïaszanie bïÚdu J!error Zgïaszanie ostrzeĝenia J!error Zgïaszanie informacji J!error Kolejkowanie komunikatu Zmiana domyĂlnego sposobu obsïugi bïÚdów J!error Obsïuga i zgïaszanie dedykowanych bïÚdów J!error Zapisywanie bïÚdów i zdarzeñ przy uĝyciu JLog Rzucanie wyjÈtków w PHP5 Przechwytywanie wyjÈtków w PHP5 6 243 244 245 247 248 254 257 260 262 265 266 268 269 271 275 275 278 279 280 281 281 283 284 285 287 288 289 291 292 293 297 297 299 301 304 306 308 311 314 316 319 Spis treĞci Rozdziaï 12. Pliki i foldery Wprowadzenie Sprawdzanie, czy plik lub folder istnieje Odczytywanie pliku Usuwanie pliku lub folderu Kopiowanie pliku lub folderu Przenoszenie i zmiana nazwy plików i folderów Tworzenie folderu ’adowanie plików do systemu Joomla! Odczytywanie struktury katalogów Zmiana uprawnieñ do pliku i folderu Skorowidz 323 323 325 327 329 331 332 334 336 340 343 345 7 3 Praca z bazÈ danych Ten rozdziaï zawiera nastÚpujÈce przepisy: Q Wykonywanie zapytania Q ’adowanie pierwszej komórki ze zbioru wyników zapytania Q ’adowanie pierwszego rekordu z zapytania Q ’adowanie wiÚcej niĝ jednego rekordu z zapytania Q Obsïuga bïÚdów DBO Q Tworzenie tabeli JTable Q Tworzenie nowego rekordu przy uĝyciu JTable Q Modyfikacja rekordu przy uĝyciu JTable Q Odczytywanie istniejÈcego rekordu przy uĝyciu JTable Q Usuwanie rekordu przy uĝyciu JTable Q Blokowanie i odblokowywanie rekordu przy uĝyciu JTable Q Zmiana kolejnoĂci rekordów przy uĝyciu JTable Q Publikowanie i wycofywanie rekordu z publikacji przy uĝyciu JTable Q ZwiÚkszanie licznika wyĂwietleñ rekordu przy uĝyciu JTable Wprowadzenie WiÚkszoĂÊ danych Joomla! jest przechowywanych w bazie danych. Dotyczy to miÚdzy innymi gïównych rozszerzeñ, a takĝe rozszerzeñ pochodzÈcych od dostawców zewnÚtrznych. Joomla! czÚsto jest okreĂlana mianem aplikacji PHP i MySQL. RzeczywiĂcie, Joomla! korzysta z serwera MySQL, lecz architektura systemu pozwala na uĝycie równieĝ innych serwerów baz danych. Aktualnie wersja 1.5 oficjalnie obsïuguje jedynie bazy danych MySQL. Joomla! 1.5 od kuchni. Ponad 130 przepisów! Nazwy wszystkich tabel w bazie danych Joomla! rozpoczynajÈ siÚ od okreĂlonego prefiksu. PostaÊ prefiksu jest ustalana globalnie dla caïej instalacji systemu, dlatego w odwoïaniach do tabel zawsze trzeba uĝywaÊ prefiksu zdefiniowanego dla konkretnej instalacji. Na szczÚĂcie prefiksu nie trzeba definiowaÊ samodzielnie. Wyobraěmy sobie, ĝe prefiksem jest jos i istnieje tabela o nazwie jos_mojkomponent_foobars. Zamiennikiem dla prefiksu jest ciÈg znaków #_, dziÚki czemu nazwÚ tabeli moĝna wyraziÊ w nastÚpujÈcy sposób: #__mojkomponent_foobars Obiektem, którego uĝywa siÚ najczÚĂciej do interakcji z bazÈ danych, jest globalny obiekt DBO (Database Object). Jest on uzyskiwany przy wykorzystaniu klasy JFactory. Warto zaznaczyÊ, ĝe do przypisania obiektu zmiennej naleĝy uĝyÊ operatora = . Jeĝeli operator ten nie bÚdzie uĝyty, a wersja jÚzyka PHP bÚdzie niĝsza niĝ 5, utworzona zostanie jedynie kopia obiektu DBO. $db = JFactory::getDBO(); Bezpieczeñstwo a kod SQL W trakcie tworzenia zapytañ SQL trzeba zachowaÊ szczególnÈ ostroĝnoĂÊ, poniewaĝ bardzo ïatwo jest naraziÊ siÚ na niebezpieczeñstwo. WiÚcej informacji na temat tworzenia bezpiecznych zapytañ SQL znajduje siÚ w przepisach dotyczÈcych jÚzyka SQL, w rozdziale 2. Na potrzeby niniejszego przykïadu w kaĝdym przepisie uĝywana bÚdzie tabela zdefiniowana jako tabela 3.1. OczywiĂcie, nie oznacza to, ĝe w kaĝdym przepisie tabela bÚdzie uĝywana w caïoĂci — w odpowiednich przypadkach bÚdziemy bazowaÊ wyïÈcznie na okreĂlonych zbiorach danych z tej tabeli. Oprócz zdefiniowanej tabeli bÚdziemy uĝywaÊ równieĝ przykïadowych danych, wskazanych w tabeli 3.2. Aby utworzyÊ tabelÚ do celów testowania, najlepiej jest pobraÊ archiwum przykïadowych kodów zwiÈzanych z tÈ ksiÈĝkÈ, dostÚpne na stronie wydawnictwa Helion, pod adresem ftp://ftp.helion.pl/ przyklady/jo15od.zip. Przeznaczenie pola params nie jest w tym rozdziale wyjaĂniane. Pole to sïuĝy do rozszerzania bazy danych poza jej pierwotnÈ strukturÚ. WiÚcej informacji na ten temat moĝna znaleěÊ w przepisie dotyczÈcym obiektów JParameter i JElement, w rozdziale 9., „Utrzymywanie rozszerzalnoĂci i modularnoĂci”. JednÈ z najbardziej rozbudowanych klas udostÚpnianych przez Joomla! jest klasa JTable. Abstrak- cyjna klasa JTable umoĝliwia zaimplementowanie w krótkim czasie interfejsu dla kaĝdej z tabel znajdujÈcych siÚ w bazie danych. Oprócz standardowych elementów, które zwykle wchodzÈ w skïad tego typu klas, JTable udostÚpnia caïÈ gamÚ metod, za pomocÈ których bez trudu im- plementuje siÚ funkcje najczÚĂciej wykonywane w Joomla!, takie jak choÊby blokowanie re- kordów. Poniĝsza lista prezentuje wbudowane funkcje udostÚpniane przez klasÚ JTable: 78 Tabela 3.1. Definicja tabeli #__mojkomponent_foobars bazy danych na potrzeby przepisów w niniejszym rozdziale Rozdziaá 3. • Praca z bazą danych Auto increment Unsigned Opis TAK TAK Pole id foo bar Typ int(11) varchar(100) varchar(100) checked_out int(11) checked_ ´out_time ordering datetime int(11) published tinyint(1) hits catid params int(11) int(11) text NOT NULL TAK TAK TAK TAK TAK TAK TAK TAK Klucz gïówny. Ogólne pole tekstowe, które nie moĝe byÊ puste. Ogólne pole tekstowe, które moĝe byÊ puste. Uĝytkownik, dla którego rekord zostaï zablokowany. Czas zablokowania rekordu. Pozycja, na której powinien znajdowaÊ siÚ ten rekord w grupie rekordów. Wskazuje, czy rekord jest opublikowany. Liczba wyĂwietleñ rekordu. Klucz obcy do tabeli kategorii. Dodatkowe parametry. TAK TAK TAK TAK TAK Tabela 3.2. Przykïadowe dane dla przepisów z niniejszego rozdziaïu id 100 101 102 103 104 105 foo bar checked_out checked_out_time ordering published hits catid params NULL Lorem NULL ipsum NULL dolor NULL sit NULL amet NULL 0 0 0 62 0 0 0000-00-00 00:00:00 0000-00-00 00:00:00 0000-00-00 00:00:00 2009-03-11 11:18:32 0000-00-00 00:00:00 0000-00-00 00:00:00 4 3 1 2 1 2 1 1 1 1 0 1 13 43 72 55 0 49 1 1 1 1 2 2 Q WiÈzanie — kopiowanie danych z tablicy lub obiektu do obiektu JTable. Q XML — prezentowanie rekordu w formacie XML. Q ZarzÈdzanie rekordami — tworzenie, odczytywanie, modyfikacja i usuwanie rekordów. Q Weryfikacja poprawnoĂci — sprawdzanie, czy dane w rekordzie odpowiadajÈ zestawowi zdefiniowanych reguï poprawnoĂci. Q Blokowanie — zapobieganie edycji danego rekordu jednoczeĂnie przez wiÚcej niĝ jednego uĝytkownika. Q Wyznaczanie kolejnoĂci — porzÈdkowanie rekordów zgodnie z preferencjami uĝytkownika. Q Publikowanie — udostÚpnianie rekordu na widok publiczny lub jego wycofywanie z publikacji. Q Zliczanie wyĂwietleñ — rejestrowanie liczby wyĂwietleñ rekordu. 79 Joomla! 1.5 od kuchni. Ponad 130 przepisów! W tym rozdziale wyjaĂnimy, jak tworzy siÚ konkretnÈ implementacjÚ JTable. Ponadto pokazane zostanie, jak korzysta siÚ z poszczególnych funkcji opisanych powyĝej. ZarzÈdzanie rekordami bazuje na paradygmacie CRUD, który stanowi skrót od angielskich nazw czynnoĂci wykonywanych na rekordach: Create (tworzenie), Read (odczytywanie), Update (mody- fikowanie) i Delete (usuwanie). Cztery czynnoĂci skïadajÈce siÚ na paradygmat CRUD wyznaczajÈ jednoczeĂnie cykl ĝycia elementu przechowywanego w staïej skïadnicy danych. Cykl ĝycia ele- mentu wraz ze schematem CRUD przedstawiono na rysunku 3.1. W kontekĂcie JTable i CRUD skïadnicÈ danych jest baza danych, natomiast elementem jest rekord przechowywany w jednej lub wiÚcej tabel tej bazy albo, mówiÈc precyzyjniej, w tabeli reprezentowanej przez dany obiekt klasy JTable. Rysunek 3.1. Paradygmat CRUD i cykl ĝycia rekordu Czasami moĝe byÊ doĂÊ trudno zrozumieÊ cel klasy JTable oraz sposób, w jaki wpasowuje siÚ ona w komponent MVC systemu Joomla!, zwïaszcza jeĂli juĝ posiada siÚ model oraz dostÚp do bazy danych za poĂrednictwem DBO. Aby lepiej zrozumieÊ kontekst, najlepiej jest myĂleÊ o JTable jak o kolejnej warstwie abstrakcji miÚdzy programistÈ a bazÈ danych. DziÚki JTable unika siÚ koniecznoĂci operowania na nieprzetworzonych danych. Wykonywanie zapytania Najbardziej podstawowÈ spoĂród wszystkich metod klasy JDatabase sïuĝÈcych do wykonywania zapytania jest metoda JDatabase::query(). Metody tej uĝywa siÚ jedynie wówczas, gdy wykony- wane zapytanie nie zwraca ĝadnego zbioru wynikowego, poniewaĝ metoda zwraca odpowiedzi w postaci nieprzetworzonej. Jeĝeli na przykïad pomyĂlnie zostanie wykonane zapytanie SELECT, metoda zwróci zasób z danymi wynikowymi. Trudno siÚ jednak spodziewaÊ, by jakikolwiek programista chciaï rÚcznie operowaÊ na zasobie! Kiedy wiÚc uĝywa siÚ metody JDatabase::query()? MówiÈc najproĂciej, uĝywa siÚ jej wówczas, gdy wynikiem zapytania jest wartoĂÊ logiczna, czyli gdy wynikiem bÚdzie informacja, czy wy- konanie siÚ powiodïo, czy nie. Poniĝej znajduje siÚ lista rodzajów zapytañ na danych, które moĝna wykonywaÊ przy uĝyciu metody JDatabase::query(): Q DELETE Q INSERT 80 Rozdziaá 3. • Praca z bazą danych Q RENAME Q REPLACE Q UPDATE Jak siÚ przygotowaÊ? Aby wykonaÊ zapytanie, trzeba najpierw utworzyÊ instancjÚ obiektu DBO systemu Joomla!. $db = JFactory::getDBO(); Jak to zrobiÊ? Pierwszy krok polega na utworzeniu zapytania, które ma zostaÊ wykonane. Poniĝszy przykïad tworzy proste zapytanie DELETE, które usunie wszystkie rekordy z tabeli #__mojkomponent_ ´foobars z wartoĂciÈ ordering wiÚkszÈ niĝ 4: // przygotowanie nazw $tableName = $db- nameQuote( #__mojkomponent_foobars ); $columnName = $db- nameQuote( ordering ); // sformuáowanie zapytania DELETE $sql = DELETE FROM $tableName . . WHERE $columnName 4 ; Przed wykonaniem zapytania trzeba wskazaÊ obiektowi DBO, gdzie to zapytanie siÚ znajduje. Brzmi przystÚpnie i rzeczywiĂcie jest to prosta czynnoĂÊ, ale bardzo czÚsto siÚ o niej zapomina: $db- setQuery($sql); Na koniec pozostaje juĝ tylko wykonaÊ zapytanie. if ($db- query()) { // zapytanie siĊ powiodáo } else { // zapytanie siĊ nie powiodáo } Poniewaĝ wiemy, ĝe wynikiem zapytania DELETE zawsze bÚdzie wartoĂÊ true lub false, nic nie stoi na przeszkodzie, by na podstawie wartoĂci zwróconej przez metodÚ JDatabase::query() oceniÊ, czy wykonanie zapytania siÚ powiodïo, czy nie. WiÚcej informacji na ten temat moĝna znaleěÊ w przepisie „Obsïuga bïÚdów DBO”, w dalszej czÚĂci tego rozdziaïu. Informacje dodatkowe Gdy zapytanie zostanie juĝ pomyĂlnie wykonane, przydatnÈ metodÈ moĝe siÚ okazaÊ metoda JDatabase::getAffectedRows(). Metoda ta zwraca liczbÚ rekordów, które byïy przedmiotem ostatnio wykonywanego zapytania. 81 Joomla! 1.5 od kuchni. Ponad 130 przepisów! // zapytanie siĊ powiodáo $affectRowCount = $db- getAffectedRows(); // wyĞwietlenie potwierdzenia echo JText::sprintf( USUNI}TO u REKORDY(ÓW) , $affectRowCount); Zobacz równieĝ Kolejne trzy przepisy, „’adowanie pierwszej komórki ze zbioru wyników zapytania”, „’ado- wanie pierwszego rekordu z zapytania” oraz „’adowanie wiÚcej niĝ jednego rekordu z zapytania”, prezentujÈ sposoby wykonywania zapytania SELECT i pobierania danych zwróconych przez to zapytanie. ’adowanie pierwszej komórki ze zbioru wyników zapytania Czasami wykonywane zapytania sÈ bardzo proste i majÈ na celu odczytanie wyïÈcznie jednej wartoĂci. Przykïadem moĝe byÊ odczytywanie za pomocÈ funkcji COUNT() liczby rekordów, które pasujÈ do zadanych kryteriów, albo sprawdzanie wartoĂci jednej kolumny w rekordzie, którego identyfikator jest dany. W takich przypadkach nie ma potrzeby pobierania caïych, zïoĝonych zbiorów danych, aby odczytaÊ interesujÈcÈ nas wartoĂÊ. Klasa JDatabase udostÚpnia prosty i szybki sposób odczytywania pierwszej wartoĂci z pierwszego rekordu ze zbioru danych. Jak siÚ przygotowaÊ? Aby odczytaÊ pojedynczÈ wartoĂÊ, naleĝy utworzyÊ instancjÚ obiektu DBO Joomla!. $db = JFactory::getDBO(); Jak to zrobiÊ? Najpierw trzeba przygotowaÊ zapytanie. W poniĝszym przykïadzie za pomocÈ funkcji agregujÈcej COUNT() ustala siÚ liczbÚ rekordów w tabeli #__mojkomponent_foobars. Jest to modelowa sytuacja, w której odczytywana jest tylko jedna wartoĂÊ. // przygotowanie nazw $tableName = $db- nameQuote( #__mojkomponent_foobars ); // sformuáowanie zapytania COUNT $sql = SELECT COUNT(*) FROM $tableName ; Zanim zapytanie bÚdzie moĝna wykonaÊ, trzeba je wskazaÊ obiektowi DBO. $db- setQuery($sql); 82 Rozdziaá 3. • Praca z bazą danych Na koniec pozostaje wykonaÊ zdefiniowane zapytanie. $total = $db- loadResult(); Jeĝeli przykïadowe zapytanie bÚdzie wykonane na tabeli zdefiniowanej we wprowadzeniu do niniejszego rozdziaïu, zmiennej $total przypisany zostanie wynik zapytania typu string(1) o war- toĂci 6 . Warto zwróciÊ uwagÚ, ĝe choÊ MySQL zwróci wartoĂÊ caïkowitoliczbowÈ, to bÚdzie ona reprezentowana przez ciÈg znaków. Jak to dziaïa? W przedstawionym przykïadzie zapytanie odczytuje tylko pojedynczÈ wartoĂÊ. Co siÚ jednak stanie, jeĂli wynikiem zapytania bÚdzie bardziej zïoĝony zbiór danych? Rozwaĝmy zapytanie o nastÚpujÈcej treĂci: SELECT * FROM `#__mojkomponent_foobars` WHERE `id` 103; Wynikiem wykonania zapytania bÚdzie nastÚpujÈcy zbiór danych: 104 105 sit NULL amet NULL 0 0 0000-00-00 00:00:00 0000-00-00 00:00:00 1 2 0 1 0 49 2 2 Jeĝeli wykonana zostanie metoda JDatabase::loadResult(), zwróci wartoĂÊ z lewego górnego rogu zbioru danych, czyli w tym przypadku wartoĂÊ 104. Informacje dodatkowe Cóĝ, nie jest to nic skomplikowanego. Tak naprawdÚ caïy mechanizm dziaïa bardzo ïatwo. Jest jednak coĂ, o czym naleĝy pamiÚtaÊ. Jako przykïadu uĝyjemy podzbioru danych z tabeli #__mojkomponent_foobars, widocznego w tabeli 3.3. Tabela 3.3. Przykïadowy podzbiór danych id 100 101 102 103 104 105 foo Lorem ipsum dolor sit amet bar NULL NULL NULL NULL NULL NULL 83 Joomla! 1.5 od kuchni. Ponad 130 przepisów! Wykonanie agregujÈcej funkcji COUNT() na zbiorze danych z tabeli 3.3 spowoduje, ĝe zwrócona zostanie wartoĂÊ 6 (w postaci ciÈgu znaków), co jest jak najbardziej zrozumiaïe. Jednak wyko- nanie ponownie tego samego zapytania, lecz z dodatkowÈ klauzulÈ WHERE bar IS NOT NULL, spowoduje zwrócenie wartoĂci 0 (równieĝ bÚdÈcej ciÈgiem znaków); ale to równieĝ jest jak naj- bardziej zrozumiaïe. Jeĝeli zapytamy o wartoĂÊ MAX() z kolumny id, otrzymamy wartoĂÊ 105. Z kolei jako zawartoĂÊ kolumny foo rekordu o identyfikatorze 100 zwrócony bÚdzie pusty ciÈg znaków. Jeĝeli bÚdzie wykonane zapytanie o wartoĂÊ pola bar w dowolnym rekordzie, zwrócona zostanie wartoĂÊ NULL. I co w zwiÈzku z tym? Przecieĝ wszystko dziaïa idealnie! Jednak jeĝeli z jakiegoĂ powodu wy- konanie zapytania siÚ nie powiedzie, równieĝ zwrócona zostanie wartoĂÊ NULL. Zaleĝnie od kontekstu zapytania wartoĂÊ ta moĝe byÊ niejednoznaczna. W przypadku zapytania z funkcjÈ agregujÈcÈ COUNT() ïatwo jest zrozumieÊ wynik NULL, poniewaĝ wiadomo, ĝe prawidïowy wynik powinien byÊ liczbÈ caïkowitÈ (choÊ reprezentowanÈ przez ciÈg znaków). Jednak jeĝeli zapytanie ma na celu odczytanie wartoĂci z kolumny, w której mogÈ wystÚpowaÊ wartoĂci NULL, jak ma to miejsce choÊby w kolumnie bar, wówczas znaczenie zwróconej wartoĂci NULL staje siÚ niejasne. Zobacz równieĝ Przepis „Obsïuga bïÚdów DBO” opisuje, jak sprawdzaÊ wystÈpienia bïÚdów po wykonaniu zapytania. ’adowanie pierwszego rekordu z zapytania DoĂÊ czÚsto zdarza siÚ, ĝe trzeba zaïadowaÊ pierwszy rekord z wyników zapytania. Jeĝeli na przykïad utworzono komponent, który obsïuguje przepisy kulinarne, to gdy uĝytkownik chce odczytaÊ przepis, wystarczy pozyskaÊ tylko jeden rekord. ’atwo jest ten fakt przeoczyÊ ze wzglÚdu na to, ĝe wiÚkszoĂÊ programistów jest przyzwyczajona do nawigowania przez zbiory danych, na przykïad instrukcjÈ $record = array_shift($dataset). Lecz wykonanie tej samej operacji w Joomla! jest jeszcze ïatwiejsze. Pierwszy rekord moĝna pobraÊ z zapytania tak naprawdÚ na trzy sposoby, a wybór konkretnego rozwiÈzania zaleĝy od formatu, w jakim rekord ma byÊ zwrócony. DostÚpne formaty to tablica, tablica asocjacyjna oraz obiekt. Diagram widoczny na rysunku 3.2 ilustruje rekord w postaci takiej, w jakiej wystÚpuje w bazie danych. Pod rekordem znajdujÈ siÚ ilustracje trzech do- stÚpnych formatów, w których rekord moĝe zostaÊ zwrócony przy uĝyciu obiektu klasy JDatabase. W polu bar bazy danych znajduje siÚ wartoĂÊ NULL, która jest toĝsama z wartoĂciÈ null uĝy- wanÈ w jÚzyku PHP. Nie naleĝy jej jednak myliÊ z pustym ciÈgiem znaków, czyli z ciÈgiem, który nie posiada ĝadnego znaku. ReprezentacjÈ obiektu jest obiekt klasy stdClass. Jest to podstawowa klasa wbudowana w jÚzyku PHP, która nie posiada ĝadnych predefiniowanych skïadowych. 84 Rozdziaá 3. • Praca z bazą danych Rysunek 3.2. DostÚpne formaty rekordu zwracanego przez obiekt klasy JDatabase Najlepiej uĝyÊ klasy JTable Gdy z jednej tabeli trzeba pozyskaÊ tylko jeden rekord i nie sÈ do tego celu uĝywane ĝadne funkcje jÚzyka SQL oraz wiadomo, ĝe mamy do czynienia z wartoĂciÈ klucza gïównego, korzystniejsze bÚdzie uĝycie obiektu klasy JTable. Klasa JTable udostÚpnia prosty w uĝyciu interfejs do tabel znajdujÈcych siÚ w bazie danych. WiÚcej informacji na ten temat moĝna znaleěÊ w przepisie „Tworzenie tabeli JTable”, w dalszej czÚĂci rozdziaïu. Jak siÚ przygotowaÊ? Aby odczytaÊ pojedynczy rekord, naleĝy utworzyÊ instancjÚ obiektu DBO Joomla!. $db = JFactory::getDBO(); Jak to zrobiÊ? Najpierw trzeba przygotowaÊ zapytanie. Poniĝszy kod odczytuje z przykïadowej tabeli #__mojkomponent_foobars rekord o identyfikatorze 101. // przygotowanie nazw $tableName = $db- nameQuote( #__mojkomponent_foobars ); $idColumn = $db- nameQuote( id ); $fooColumn = $db- nameQuote( foo ); $barColumn = $db- nameQuote( bar ); // sformuáowanie zapytania COUNT $sql = SELECT $idColumn, $fooColumn, $barColumn . FROM $tableName . WHERE $idColumn = 101 ; Przed wykonaniem zapytania trzeba je wskazaÊ obiektowi DBO. $db- setQuery($sql); Na koñcu pozostaje juĝ tylko wykonaÊ zapytanie. Jak wspomniano juĝ wczeĂniej, zapytanie moĝna wykonaÊ na trzy sposoby. Przedstawiono je w poniĝszym przykïadzie: 85 Joomla! 1.5 od kuchni. Ponad 130 przepisów! // pobranie rekordu w postaci tablicy $array = $db- loadRow(); // pobranie rekordu w postaci tablicy asocjacyjnej $associativeArray = $db- loadAssoc(); // pobranie rekordu w postaci obiektu klasy stdClass $object = $db- loadObject(); Jakie jest rzeczywiste dziaïanie kaĝdej z powyĝszych instrukcji? Odpowiedě znajduje siÚ na diagramie z rysunku 3.2, we wprowadzeniu do tego rozdziaïu. Kolejne instrukcje zwracajÈ odpo- wiednio tablicÚ, tablicÚ asocjacyjnÈ oraz obiekt i kaĝdy z wyników instrukcji reprezentuje rekord o identyfikatorze 101. W zwykïych tablicach numer indeksu zaleĝy od pozycji, dlatego pierwsze pole znajduje siÚ na pozycji 0. Oznacza to, ĝe aby pozyskaÊ konkretne pole, trzeba najpierw znaÊ jego pozycjÚ w zbio- rze danych. Nie jest to wielki problem, lecz cecha ta moĝe staÊ siÚ ěródïem bïÚdów w trakcie utrzymania systemu. Jeĝeli na przykïad do tabeli bÚdzie dodana nowa kolumna, byÊ moĝe ko- nieczne bÚdzie równieĝ zmodyfikowanie znacznej czÚĂci pozostaïego kodu. Z kolei w tablicach asocjacyjnych i obiektach odwoïania do wartoĂci majÈ postaÊ nazwy pola. DziÚki temu zarówno tablice asocjacyjne, jak i obiekty nie sÈ aĝ tak wraĝliwe na zmiany w struktu- rze bazy danych, a ich reprezentacjÚ ïatwo zrozumieÊ pod wzglÚdem semantycznym. Dlatego generalnie rzecz biorÈc, najlepiej jest uĝywaÊ tablic asocjacyjnych i (lub) obiektów. Informacje dodatkowe Ze wzglÚdów bezpieczeñstwa czasami poĝÈdane moĝe byÊ sprawdzenie, czy zapytanie zwróciïo tylko jeden wiersz. W niektórych sytuacjach zïoĂliwy uĝytkownik moĝe zyskaÊ moĝliwoĂÊ takiego obejĂcia zabezpieczeñ rozszerzenia, by ïadowanych byïo wiÚcej wierszy niĝ jeden. Najprostszym przykïadem sytuacji, gdy powinno siÚ sprawdzaÊ liczbÚ wierszy, jest odczytywanie danych z tabeli uĝytkowników. Pod ĝadnym pozorem nie powinno siÚ przez przypadek udostÚpniaÊ takich danych! LiczbÚ rekordów odczytanych z bazy danych moĝna sprawdziÊ metodÈ JDatabase::getNumRows(). Metoda JDatabase::getNumRows() zwraca liczbÚ rekordów, które zostaïy zwrócone przez ostatnio wykonane zapytanie. if ($db- getNumRows() 1) { // oho, odczytano jakiĞ ciekawy rekord! } Uwaga na klauzulÚ LIMIT, gdy sprawdzana jest liczba wierszy Metoda JDatabase::getNumRows() zwraca liczbÚ wierszy zwróconych w wyniku wykonania zapytania. Jeĝeli zakres zwróconych wierszy zostanie ograniczony przy uĝyciu klauzuli LIMIT, wówczas maksymalna liczba wierszy wynikowych bÚdzie równa wartoĂci klauzuli LIMIT. Aby sprawdziÊ, jaka jest potencjalna liczba wszystkich wierszy wynikowych, naleĝy uĝyÊ funkcji agregujÈcej COUNT(). 86 Rozdziaá 3. • Praca z bazą danych Zobacz równieĝ Przepis „Obsïuga bïÚdów DBO” opisuje, jak sprawdzaÊ wystÈpienia bïÚdów po wykonaniu zapytania. ’adowanie wiÚcej niĝ jednego rekordu z zapytania Bez wzglÚdu na to, jaka metoda zostanie wybrana do pozyskania wielu rekordów z bazy danych, zawsze uzyskamy na koñcu tablicÚ rekordów. Inny moĝe byÊ jedynie sposób reprezentacji pojedynczych rekordów w tablicy. Jeĝeli uĝywana jest klasa JDatabase, wiersz tablicy moĝe mieÊ jednÈ z trzech postaci. Moĝe wystÚpowaÊ jako tablica, tablica asocjacyjna albo obiekt. Diagram widoczny na rysunku 3.3 przedstawia dostÚpne reprezentacje kilku przykïadowych rekordów. Rysunek 3.3. DostÚpne reprezentacje rekordów z bazy danych W polu bar bazy danych znajduje siÚ wartoĂÊ NULL, która jest toĝsama z wartoĂciÈ null uĝywanÈ w jÚzyku PHP. Nie naleĝy jej jednak myliÊ z pustym ciÈgiem znaków, czyli z ciÈgiem, który nie posiada ĝadnego znaku. ReprezentacjÈ obiektu jest obiekt klas stdClass. Jest to podstawowa klasa wbudowana w jÚzyku PHP, która nie ma ĝadnych predefiniowanych skïadowych. Jak siÚ przygotowaÊ? Aby uzyskaÊ tablicÚ rekordów, naleĝy wpierw utworzyÊ instancjÚ obiektu DBO Joomla!. $db = JFactory::getDBO(); 87 Joomla! 1.5 od kuchni. Ponad 130 przepisów! Jak to zrobiÊ? Najpierw trzeba przygotowaÊ zapytanie. Poniĝszy przykïadowy kod odczytuje z przykïadowej tabeli #__mojkomponent_foobars rekordy o identyfikatorach 101, 102 i 103. // przygotowanie nazw $tableName = $db- nameQuote( #__mojkomponent_foobars ); $idColumn = $db- nameQuote( id ); $fooColumn = $db- nameQuote( foo ); $barColumn = $db- nameQuote( bar ); // sformuáowanie zapytania $sql = SELECT $idColumn, $fooColumn, $barColumn . FROM $tableName . WHERE $idColumn = 101 AND . $idColumn = 103 ; Przed wykonaniem zapytania trzeba je wskazaÊ obiektowi DBO. $db- setQuery($sql); Na koñcu pozostaje juĝ tylko wykonaÊ zapytanie. Jak wspomniano juĝ wczeĂniej, zapytanie moĝna wykonaÊ na trzy sposoby. Przedstawiono je w poniĝszym przykïadzie: // pobranie rekordów w postaci tablicy $array = $db- loadRowList(); // pobranie rekordów w postaci tablicy asocjacyjnej $associativeArrays = $db- loadAssocList(); // pobranie rekordu w postaci obiektów klasy stdClass $objects = $db- loadObjectList(); Jakie jest rzeczywiste dziaïanie kaĝdej z powyĝszych instrukcji? Odpowiedě znajduje siÚ na diagramie z rysunku 3.3, we wprowadzeniu do tego rozdziaïu. Kolejne instrukcje zwracajÈ odpowiednio tablice, tablice asocjacyjne oraz obiekty i kaĝdy z wyników instrukcji reprezentuje rekordy o identyfikatorach 101, 102 i 103. W zwykïych tablicach numer indeksu zaleĝy od pozycji, dlatego pierwsze pole znajduje siÚ na pozycji 0. Oznacza to, ĝe aby pozyskaÊ konkretne pole, trzeba najpierw znaÊ jego pozycjÚ w zbio- rze danych. Nie jest to wielki problem, lecz cecha ta moĝe staÊ siÚ ěródïem bïÚdów w trakcie utrzymania systemu. Jeĝeli na przykïad do tabeli bÚdzie dodana nowa kolumna, byÊ moĝe ko- nieczne bÚdzie równieĝ zmodyfikowanie znacznej czÚĂci pozostaïego kodu. Z kolei w tablicach asocjacyjnych i obiektach odwoïania do wartoĂci majÈ postaÊ nazwy pola. DziÚki temu zarówno tablice asocjacyjne, jak i obiekty nie sÈ aĝ tak wraĝliwe na zmiany w strukturze bazy danych, a ich reprezentacjÚ ïatwo zrozumieÊ pod wzglÚdem semantycznym. Dlatego generalnie rzecz biorÈc, najlepiej jest uĝywaÊ tablic asocjacyjnych i (lub) obiektów. 88 Rozdziaá 3. • Praca z bazą danych Informacje dodatkowe Tablica, w której zwracane sÈ wyniki zapytania, jest domyĂlnie zwykïÈ tablicÈ, to znaczy tablicÈ indeksowanÈ liczbowo, w kolejnoĂci zgodnej z kolejnoĂciÈ odczytywania wierszy z bazy danych. DostÚpna jest jednak ciekawa opcja, dziÚki której moĝna uĝywaÊ indeksów bardziej zïoĝonych. W przypadkach, gdy wiersze posiadajÈ pojedynczÈ, unikatowÈ wartoĂÊ, jako indeksu tablicy moĝna uĝyÊ wïaĂnie tego klucza. Jeĝeli na przykïad klucze majÈ wartoĂci 101, 102 i 103, wówczas identyczne wartoĂci mogÈ mieÊ klucze tablicy, co widaÊ w przykïadowym kodzie: Array ( [101] = Array ( [0] = 101 [1] = Lorem [2] = null ) [102] = Array ( [0] = 102 [1] = ipsum [2] = null ) [103] = Array ( [0] = 103 [1] = dolor [2] = null ) ) Aby uzyskaÊ taki efekt, odpowiedniÈ metodÚ JDatabase::load*List() naleĝy wykonaÊ z opcjo- nalnym pierwszym parametrem. Parametr przekazany do metody wskazuje jej, która kolumna rekordu reprezentuje klucz. W przypadku metody JDatabase::loadRowList() parametr musi byÊ liczbÈ caïkowitÈ, poniewaĝ oznacza on indeks kolumny w zbiorze danych. Dla pozostaïych dwóch metod wartoĂÊ parametru musi byÊ ciÈgiem znaków odpowiadajÈcym nazwie kolumny w zbiorze danych. // pobranie rekordów w postaci tablicy $arrays = $db- loadRowList(0); // pobranie rekordów w postaci tablicy asocjacyjnej $associativeArrays = $db- loadAssocList( id ); // pobranie rekordu w postaci obiektów klasy stdClass $objects = $db- loadObjectList( id ); Zobacz równieĝ Przepis „Obsïuga bïÚdów DBO” opisuje, jak sprawdzaÊ wystÈpienia bïÚdów po wykonaniu zapytania. Obsïuga bïÚdów DBO Nie zawsze wszystko idzie zgodnie z planem. Metoda wykonywania zapytania wyznacza jed- noczeĂnie sposób, w jaki sprawdza siÚ wystÈpienie bïÚdów. Jeĝeli na przykïad uĝyto metody JDatabase::query(), to w przypadku bïÚdu w wykonaniu zapytania metoda ta zwróci logicznÈ wartoĂÊ false. Jest to oczywiĂcie w peïni akceptowalna metoda sprawdzania, czy wystÈpiïy bïÚdy, jednak dostÚpny jest równieĝ sïuĝÈcy temu celowi ogólniejszy mechanizm. 89 Joomla! 1.5 od kuchni. Ponad 130 przepisów! Problem ze sprawdzaniem wartoĂci wynikowej jest zwiÈzany z faktem, ĝe zawsze trzeba wiedzieÊ, jak kaĝda metoda wykonujÈca zapytanie sygnalizuje wystÈpienie bïÚdu. Kolejnym problemem jest to, ĝe Joomla! moĝe równieĝ wspóïpracowaÊ z serwerami baz danych innymi niĝ MySQL, a adaptery dla innych serwerów baz danych mogÈ inaczej sygnalizowaÊ wystÈpienie bïÚdu. Na szczÚĂcie wy- stÈpienie bïÚdu moĝna rozpoznawaÊ w inny sposób, który bardziej uniezaleĝnia implementowany kod ěródïowy od uchwytu DBO. Jak to zrobiÊ? Metoda JDatabase::getErrorNum() zwraca numer bïÚdu wygenerowanego w wyniku wykonania ostatniego zapytania. Jeĝeli nie pojawiï siÚ ĝaden bïÈd, metoda zwraca wartoĂÊ 0. DziÚki temu, aby uzyskaÊ informacjÚ, czy wystÈpiï bïÈd, wystarczy sprawdziÊ numer bïÚdu. if ($db- getErrorNum() == 0) { // Īaden báąd nie wystąpiá } else { // wystąpiáy báĊdy } Jak to dziaïa? Numery bïÚdów zwracane przez metodÚ JDatabase::getErrorNum() sÈ oryginalnymi numerami bïÚdów serwera baz danych. Pewnym problemem jest fakt, ĝe róĝne serwery baz danych uĝywajÈ róĝnych kodów bïÚdu. Jeĝeli na przykïad wskazana tabela nie istnieje, serwer MySQL zwróci bïÈd o kodzie 1146, zaĂ dla SQL Servera jest to bïÈd o kodzie 208. Z tego powodu metody JDatabase::getErrorNum() uĝywa siÚ wyïÈcznie po to, aby sprawdziÊ, czy w ogóle wystÈpiï jakiĂ bïÈd. Informacje dodatkowe Oprócz kodu bïÚdu moĝna pozyskiwaÊ równieĝ treĂÊ komunikatu o bïÚdzie. Podobnie jak w przy- padku kodów bïÚdów, równieĝ treĂÊ komunikatów o bïÚdach zaleĝy od uĝywanego serwera baz danych. Wprawdzie obiekt DBO jest z technicznego punktu widzenia obiektem klasy JObject, lecz do odczytywania ostatnio zwróconego komunikatu o bïÚdzie nie uĝywa siÚ zwykïej metody JObject::getError(), ale metody JDatabase::getError(). // jeĪeli wystąpiá báąd $error = $db- getErrorMsg(); // wyĞwietlenie komunikatu o báĊdzie JError::raiseWarning(500, $error); Istnieje równieĝ rozwiÈzanie alternatywne. Metoda JDatabase::stderr() zwraca bardziej rozbu- dowany komunikat o bïÚdzie. 90 Rozdziaá 3. • Praca z bazą danych // jeĪeli wystąpiá báąd $error = $db- stderr(); // wyĞwietlenie komunikatu o báĊdzie JError::raiseError(500, $error); WadÈ odczytywania komunikatów o bïÚdach w taki sposób, jaki przedstawiono powyĝej, jest to, ĝe treĂci tych komunikatów nie sÈ tïumaczone na jÚzyk bieĝÈcy. Generalnie rzecz biorÈc, oryginalne treĂci komunikatów o bïÚdach sÈ uĝywane jedynie wówczas, gdy bïÈd ma charakter krytyczny i zwracany jest wewnÚtrzny bïÈd serwera o kodzie 500, jak w ostatnim przykïadzie. Metoda JDatabase::stderr() moĝe zwracaÊ równieĝ kod SQL, którego wykonanie spowodowaïo wygenerowanie bïÚdu. W tym celu metodÚ wywoïuje siÚ z opcjonalnym parametrem $showSQL o wartoĂci true (domyĂlnie parametr ten ma wartoĂÊ false). Nie zaleca siÚ wyĂwietlania kodu SQL na serwerach dziaïajÈcych w Ărodowisku produkcyjnym, poniewaĝ kod ten zawiera informa- cje, na podstawie których zïoĂliwy uĝytkownik moĝe spróbowaÊ zïamaÊ zabezpieczenia systemu. Tworzenie tabeli JTable Niniejszy przepis prezentuje sposób, w jaki tworzy siÚ klasÚ JTable, która bÚdzie reprezento- waÊ przykïadowÈ tabelÚ #__mojkomponent_foobars, przedstawionÈ we wprowadzeniu do tego roz- dziaïu. Na potrzeby przepisu zostanÈ uĝyte tylko trzy pierwsze pola tabeli: id, foo i bar. Jak siÚ przygotowaÊ? Jeĝeli klasa JTable tworzona jest w ramach komponentu, trzeba najpierw utworzyÊ folder tables (o ile jeszcze nie istnieje). Folder musi siÚ znajdowaÊ w gïównym folderze administracyjnym rozszerzenia. Na przykïad w przypadku komponentu o nazwie mojkomponent wïaĂciwym fol- derem bÚdzie folder administrator/components/com_mojkomponent/tables. W (rzadko spotykanym) przypadku, gdy klasa JTable tworzona jest dla innego rodzaju rozszerzenia, nie istnieje predefiniowana lokalizacja dla klas JTable. Aby wobec konkretnej klasy JTable, znaj- dujÈcej siÚ w lokalizacji alternatywnej, zastosowaÊ statycznÈ metodÚ JTable::getInstance(), naleĝy wskazaÊ klasie JTable, w którym folderze dodano podklasy JTable. Warto pamiÚtaÊ, ĝe ist- nieje moĝliwoĂÊ dodawania wiÚcej Ăcieĝek niĝ jedna. JTable::addIncludePath($ĂcieĝkaDoObiektówJTable); Jak to zrobiÊ? Gdy tworzone sÈ konkretne klasy JTable, bardzo waĝne sÈ stosowane konwencje nazewnictwa. Plik, w którym definiowana jest klasa, powinien nosiÊ takÈ samÈ nazwÚ jak tabela reprezentowana przez tÚ klasÚ (w liczbie pojedynczej, a nie mnogiej). Klasa powinna nosiÊ nazwÚ zaczynajÈcÈ siÚ 91 Joomla! 1.5 od kuchni. Ponad 130 przepisów! sïowem Table, po którym naleĝy umieĂciÊ nazwÚ reprezentowanej tabeli (w liczbie pojedynczej, a nie mnogiej). Na przykïad klasa JTable dla tabeli #__mojkomponent_foobars powinna nosiÊ nazwÚ TableFoobar i znajdowaÊ siÚ w pliku foobar.php. W podstawowej implementacji klasy JTable pokrywa siÚ zwykle dwie metody: __construct() oraz check(). Ponadto dla kaĝdego pola tabeli tworzy siÚ zmienne instancji klasy. Nie naleĝy dodawaÊ ĝadnej zmiennej instancji klasy, która nie odnosi siÚ do pola tabeli. Jeĝeli konieczne jest zdefiniowanie dodatkowych zmiennych instancji klasy, naleĝy ich nazwy poprzedziÊ znakiem podkreĂlenia, co bÚdzie oznaczaÊ, ĝe sÈ one chronione. Poniĝsza przykïadowa klasa bÚdzie operowaÊ na okrojonej wersji tabeli #__mojkomponent_foobars. /** * Klasa obsáuguje tabelĊ #__mojkomponent_foobars */ class TableFoobar extends JTable { /** @var int */ var $id = null; /** @var string */ var $foo = ; /** @var string */ var $bar = ; /** * Utworzenie nowej klasy TableFoobar */ function __construct( $db) { parent::__construct( #__mojkomponent_foobars , id , $db); } /** * Czy dane są prawidáowe? */ function check() { // sprawdzenie poprawnoĞci identyfikatora (wartoĞü int albo null) if (!preg_match( ~^\d+$~ , $this- id) || $this- id !== null) { $this- setError(JText::_( ID JEST NIEPRAWID’OWE )); return false; } // sprawdzenie poprawnoĞci pola foo if(JString::trim($this- foo) == ) { $this- setError(JText::_( TABELA FOOBAR MUSI POSIADAm POLE FOO )); return false; } // wszystko w porządku, dane są poprawne! return true; } } 92 Rozdziaá 3. • Praca z bazą danych Gdy gotowa jest juĝ konkretna implementacja klasy JTable, moĝna zaczÈÊ jej uĝywaÊ. Sposób dostÚpu do zaimplementowanej klasy zaleĝy od tego, gdzie ma ona zostaÊ wykorzystana. Jeĝeli tworzony jest komponent MVC (co jest najczÚĂciej spotykanym przypadkiem), uĝywa siÚ metody JModel::getTable(). Metody JModel::getTable() zazwyczaj uĝywa siÚ na poziomie modelu. Niemniej jednak naleĝy pamiÚtaÊ, ĝe jest to metoda publiczna, dziÚki czemu moĝna jÈ stosowaÊ równieĝ z zewnÈtrz. class SomeModel extends JModel { ... function someMethod() { $table = $this- getModel( Foobar ); ... } RozwiÈzaniem alternatywnym jest bezpoĂrednie uĝycie metody JTable::getInstances(). $table = JTable::getInstance( Foobar , Table ); Warto zwróciÊ uwagÚ na sposób, w jaki podano drugi parametr. Jest to prefiks nazwy tabeli, a jego domyĂlnÈ wartoĂciÈ jest JTable. Prefiks domyĂlny jest uĝywany wzglÚdem niskopoziomowych implementacji klasy JTable, takich jak klasa JTableUser. Jak to dziaïa? Konstruktor JTable przekazuje nazwÚ tabeli, do której klasa siÚ odnosi, nazwÚ klucza gïównego oraz obiekt DBO reprezentujÈcy konstruktor przodka klasy JTable. Metoda check() pokrywa analo- gicznÈ metodÚ przodka i sïuĝy do weryfikacji poprawnoĂci danych w zmiennych instancji klasy. Pokrywanie metody check() nie jest obowiÈzkowe. W rzadkich przypadkach, gdy danych nie obowiÈzujÈ ĝadne reguïy poprawnoĂci, metody check() nie trzeba pokrywaÊ. Wprawdzie metoda check() sïuĝy z zaïoĝenia do ustalania poprawnoĂci danych, ale nic nie stoi na przeszkodzie, by w jej definicji modyfikowaÊ równieĝ dane, o ile modyfikacje te sÈ stosunkowo nieskomplikowane. Przykïadem takiego dziaïania moĝe byÊ skopiowanie wartoĂci do aliasu, jeĝeli wartoĂÊ aliasu nie jest zdefiniowana. Bardzo istotne jest prawidïowe zrozumienie roli, jakÈ peïni metoda check(). MetodÚ wykonuje siÚ przed wprowadzeniem jakichkolwiek zmian w tabeli, czyli przed utworzeniem nowego albo zmodyfikowaniem istniejÈcego rekordu. Rekordy tworzy siÚ i uaktualnia przy uĝyciu metody JTable::save() lub metody JTable::store(). Jeĝeli wykonywana jest metoda JTable::save(), rÚczne wywoïywanie metody check() nie jest juĝ konieczne, poniewaĝ zostanie ona wywoïana automatycznie. Zobacz równieĝ NastÚpne cztery przepisy opisujÈ, jak tworzy siÚ, odczytuje, zmienia i usuwa rekordy przy uĝyciu klasy JTable. 93 Joomla! 1.5 od kuchni. Ponad 130 przepisów! Tworzenie nowego rekordu przy uĝyciu JTable Niniejszy przepis opisuje sposób tworzenia nowego rekordu w bazie danych przy uĝyciu obiektu klasy JTable. W przedstawionym przykïadzie nadal uĝywana bÚdzie klasa JTable, zdefi- niowana w poprzednim przepisie. Dla celów niniejszego przepisu przyjÚto zaïoĝenie, ĝe dane, na podstawie których zostanie utworzony nowy rekord, bÚdÈ pochodziÊ z formularza przesïanego metodÈ POST. Jak siÚ przygotowaÊ? Najpierw trzeba utworzyÊ obiekt klasy JTable. WiÚcej informacji na temat uzyskiwania instancji klasy JTable przedstawiono w poprzednim przepisie. Jak to zrobiÊ? Najpierw trzeba pozyskaÊ dane, na podstawie których ma byÊ utworzony nowy rekord. Dane bÚdÈ powiÈzane z obiektem JTable. Oznacza to, ĝe wartoĂci bÚdÈ skopiowane z tablicy do tabeli. Nie ma przy tym znaczenia, czy struktura, która zostanie powiÈzana z obiektem JTable, zawiera jakieĂ dane, poniewaĝ i tak bÚdÈ one zignorowane przez obiekt JTable. W poniĝszym przykïadzie pobierana jest caïa zawartoĂÊ ĝÈdania POST. Warto zwróciÊ uwagÚ, ĝe poniewaĝ do pobrania zawartoĂci ĝÈdania POST uĝywana jest metoda JRequest::get(), dane wejĂciowe pochodzÈce z tego ĝÈdania zostanÈ od razu zneutralizowane (wiÚcej informacji na ten temat znajduje siÚ w dalszej czÚĂci tego rozdziaïu). // wartoĞci, z których ma zostaü utworzony nowy rekord $post = JRequest::get( POST ); Musimy siÚ upewniÊ, ĝe wartoĂÊ pola id (czyli klucza gïównego) nie jest zdefiniowana tak, ĝe bÚdzie ěródïem konfliktu w momencie tworzenia nowego rekordu. Dlatego polu id przypisana zostaje wartoĂÊ false. W ten sposób zyskujemy pewnoĂÊ, ĝe rzeczywiĂcie bÚdzie utworzony nowy rekord, a nie zmieniony rekord juĝ istniejÈcy. // nie podajemy wartoĞci ID $post[ id ] = false; Ostatni krok polega na zapisaniu nowego rekordu przy uĝyciu metody JTable::save(). Metoda JTable::save() zwraca wartoĂÊ logicznÈ, która wskazuje, czy operacja siÚ udaïa, czy nie. if (!$table- save($post)) { // nie udaáo siĊ zapisaü } 94 Rozdziaá 3. • Praca z bazą danych Jeĝeli wykonanie metody JTable::save() siÚ nie powiedzie, moĝna spróbowaÊ uĝyÊ metody JTable::getError(), aby uzyskaÊ tekstowe informacje o przyczynie bïÚdu. Warto zauwaĝyÊ, ĝe nie zawsze bÚdÈ dostÚpne informacje o bïÚdzie. Metoda JTable::save() wywoïuje szereg innych metod, w tym metodÚ JTable::checkin(). Jeĝeli nie powiedzie siÚ wykonanie metody JTable::checkin(), wówczas nie jest definiowany ĝaden komunikat o bïÚdzie! Jak to dziaïa? Metoda JTable::save() wykonuje komplet potrzebnych czynnoĂci. MówiÈc dokïadniej, wywoïy- wane sÈ nastÚpujÈce czynnoĂci: Q Zdefiniowanie powiÈzania ze ěródïowÈ tablicÈ lub obiektem za pomocÈ metody JTable::bind(). Q Weryfikacja poprawnoĂci danych przez metodÚ JTable::check(). Q Zapisanie danych metodÈ JTable::store(). Q Zatwierdzenie rekordu metodÈ JTable::checkin(). Q UporzÈdkowanie rekordów metodÈ JTable::reorder(). Podobnie jak w przypadku wakacyjnego wyjazdu all inclusive, równieĝ nad procesem, który jest wykonywany caïoĂciowo, jak przez metodÚ JTable::save(), nie ma siÚ prawie ĝadnej kontroli. Z tego powodu metoda JTable::save() nie zawsze jest najlepszym narzÚdziem. Analiza kodu ěródïowego niektórych komponentów wykaĝe, ĝe nie zawsze korzystajÈ one z metody JTable:: ´save(), a zamiast niej wszystkie potrzebne czynnoĂci wykonywane sÈ po kolei. WiÚcej informacji na ten temat znajduje siÚ w nastÚpnym punkcie. Informacje dodatkowe Czasami wymagany jest wiÚkszy zakres kontroli nad danymi, które majÈ stanowiÊ nowy rekord. Jeĝeli na przykïad w danych znajduje siÚ pole text, w którym moĝna przechowywaÊ kod jÚzyka HTML, wówczas uĝycie zneutralizowanej zmiennej $post nie bÚdzie odpowiednim rozwiÈza- niem, poniewaĝ wszelkie znaczniki HTML bÚdÈ usuniÚte. Aby uwzglÚdniÊ ten fakt, naleĝy samo- dzielnie przetworzyÊ pole tak, aby utrzymane zostaïy w nim znaczniki HTML. // pole foo moĪe zawieraü wartoĞü oryginalną $post[ foo ] = JRequest::getString( foo , , POST , JREQUEST_ALLOWRAW | JREQUEST_NOTRIM); Przedstawione podejĂcie sprawdza siÚ równieĝ w sytuacji, gdy o przetwarzanych wartoĂciach z góry wiadomo, ĝe powinny byÊ okreĂlonego typu. Jeĝeli na przykïad wiadomo, ĝe dana wartoĂÊ powinna byÊ liczbÈ caïkowitÈ, moĝna uĝyÊ metody JRequest::getInt(), aby mieÊ gwarancjÚ, ĝe uzyskana wartoĂÊ rzeczywiĂcie jest typu Integer. WiÚcej informacji na temat sposobów ko- rzystania z klasy JRequest znajduje siÚ w rozdziale 2., w przepisie „Bezpieczne pobieranie danych z ĝÈdania”. 95 Joomla! 1.5 od kuchni. Ponad 130 przepisów! WiÈzanie nie zawsze jest potrzebne Zamiast przeprowadzaÊ wiÈzanie z tablicÈ lub obiektem, moĝna ustawiÊ kaĝdy element oddzielnie za pomocÈ metody JTable::set(). Jeĝeli uĝywana jest JTable::set(), wówczas w wywoïaniu metody JTable::save() naleĝy przekazaÊ pustÈ tablicÚ lub obiekt bÚdÈcy przedmiotem wiÈzania. W punkcie „Jak to dziaïa?” powiedziano, ĝe trzeciÈ czynnoĂciÈ, jakÈ wykonuje metoda JTable:: ´save(), jest wykonanie metody JTable::store(). To wïaĂnie metoda JTable::store() wykonuje najwaĝniejszÈ czynnoĂÊ, to znaczy wprowadza zmiany w bazie danych. Natomiast problem z metodÈ JTable::save() polega na tym, ĝe nie ma siÚ nad niÈ prawie ĝadnej kontroli. Spójrzmy na przykïad. Metoda JTable::store() posiada parametr, na podstawie którego moĝna wskazaÊ, czy uaktualniane majÈ byÊ wartoĂci null. Gdy uĝywana jest metoda JTable::save(), z góry przyjmuje ona zaïoĝenie, ĝe wartoĂci null nie bÚdÈ zmieniane. Moĝe to byÊ jednak niepo- ĝÈdane zachowanie, zwïaszcza w przypadku tabeli, której pewne pola mogÈ zawieraÊ wartoĂci null. Naleĝy pamiÚtaÊ, ĝe metoda JTable::bind() nie moĝe ustanawiaÊ wiÈzania z wartoĂciami null. Wykorzystanie metody JTable::reorder() równieĝ jest w pewien sposób ograniczone. DomyĂlnie zakïada siÚ, ĝe kolejnoĂÊ rekordów w tabeli jest wyznaczana wzglÚdem pola grupujÈcego i nie moĝe byÊ definiowana jednoczeĂnie w caïej tabeli. Definiowane komunikaty o bïÚdach równieĝ nie sÈ specjalnie przydatne. Jeĝeli którakolwiek z metod wywoïywanych przez JTable::save() siÚ nie powiedzie, to nie powiedzie siÚ wykonanie samej JTable::save(). Jednak ustalenie, na którym etapie caïego procesu pojawiï siÚ problem, jest bardzo trudne, a w niektórych przypadkach komunikat z informacjÈ o bïÚdzie w ogóle nie zostanie zdefiniowany! Poniĝszy przykïad stanowi implementacjÚ bardziej kompletnego rozwiÈzania. Aby ïatwiej byïo je zrozumieÊ, kaĝdy punkt, w którym obsïugiwany jest bïÈd, oznaczono komentarzem //bïÈd. W takim punkcie proces zostaje przerwany i konieczne jest obsïuĝenie bïÚdu. // wartoĞci, które mają trafiü do nowego rekordu $post = JRequest::get( POST ); // nie definiujemy ID $post[ id ] = false; // pole foo moĪe zawieraü wartoĞü oryginalną $post[ foo ] = JRequest::getString( foo , , POST , JREQUEST_ALLOWRAW | ´JREQUEST_NOTRIM); // powiązanie $post z $table if (!$table- bind($post)) { // báąd } // sprawdzenie poprawnoĞci danych if (!$table- check()) { // báąd } // zapisanie danych w tabeli bazy danych i uaktualnienie wartoĞci null 96 Rozdziaá 3. • Praca z bazą danych if (!$table- store(true)) { // báąd } // zatwierdzenie rekordu if (!$table- checkin()) { // báąd } // uaktualnienie kolejnoĞci rekordów w tabeli (bez grupowania) if (!$table- reorder()) { // báąd } Zobacz równieĝ Poprzedni przepis, „Tworzenie tabeli JTable”, pokazuje, jak tworzy siÚ konkretnÈ klasÚ JTable. NastÚpne dwa przepisy opisujÈ sposób uaktualniania i wczytywania danych przy uĝyciu danej klasy JTable. Modyfikacja rekordu przy uĝyciu JTable Niniejszy przepis opisuje metodÚ modyfikowania rekordu juĝ istniejÈcego w bazie danych przy uĝyciu obiektu klasy JTable. Na potrzeby przykïadu bÚdzie uĝyta klasa JTable, zaimplemen- towana w przedostatnim przepisie. Jak siÚ przygotowaÊ? Najpierw trzeba utworzyÊ obiekt JTable. Sposób tworzenia instancji obiektu JTable przed- stawiono w przedostatnim przepisie. Jak to zrobiÊ? Nietrudno zgadnÈÊ, ĝe modyfikowanie rekordu nie róĝni siÚ specjalnie od operacji tworzenia rekordu. Tak naprawdÚ nie róĝni siÚ prawie niczym oprócz tego, ĝe dodatkowo konieczne jest podanie wartoĂci klucza gïównego zmienianego rekordu. // wartoĞci, które mają zostaü zapisane w istniejącym rekordzie // $post zawiera identyfikator ID modyfikowanego rekordu $post = JRequest::get( POST ); if (!$table- save($post)) { // zapisanie danych siĊ nie powiodáo } 97 Joomla! 1.5 od kuchni. Ponad 130 przepisów! Poniewaĝ tworzenie i modyfikowanie rekordu przebiega bardzo podobnie, coraz czÚĂciej dÈĝy siÚ do tego, by w ogóle nie traktowaÊ obydwóch czynnoĂci oddzielnie. W komponencie MVC two- rzenie i modyfikowanie rekordu czÚsto jest realizowane przez jednÈ metodÚ o nazwie edit(). Jak to dziaïa? WiÚcej informacji przedstawiono w poprzednim przepisie, w punkcie „Jak to dziaïa?”. Informacje dodatkowe WiÚcej informacji przedstawiono w poprzednim przepisie, w punkcie „Informacje dodatkowe”. Odczytywanie istniejÈcego rekordu przy uĝyciu JTable Niniejszy przepis opisuje sposób odczytywania zawartoĂci rekordu juĝ istniejÈcego w bazie danych przy uĝyciu obiektu JTable. Na potrzeby przykïadu uĝyta bÚdzie klasa JTable, zaimple- mentowana w przepisie „Tworzenie tabeli JTable”. Jak siÚ przygotowaÊ? Najpierw trzeba utworzyÊ obiekt JTable. Sposób tworzenia instancji obiektu JTable przedstawiono w przepisie „Tworzenie tabeli JTable”. Jak to zrobiÊ? Aby wczytaÊ rekord z tabeli, uĝywa siÚ metody JTable::load(). Metoda ta ïaduje rekord do zmiennych instancji klasy. Pierwszym i jedynym parametrem JTable::load() jest wartoĂÊ klucza gïównego rekordu, który ma zostaÊ wczytany. Metoda zwraca wartoĂÊ logicznÈ, dziÚki czemu moĝemy od razu sprawdziÊ, czy wykonanie metody zakoñczyïo siÚ powodzeniem. if ($table- load(JRequest::getInt( id ))) { // udaáo siĊ! } Czasami identyfikator rekordu, który ma byÊ wczytany, jest juĝ ustawiony w obiekcie. W takim przypadku do metody JRequest::load() nie trzeba przekazywaÊ wartoĂci klucza gïównego rekordu. 98 Rozdziaá 3. • Praca z bazą danych Wiemy juĝ, jak wczytuje siÚ dane, ale gdzie one trafiajÈ i jak uzyskuje siÚ do nich dostÚp? Jak juĝ wiadomo, konkretna implementacja klasy JTable zawiera publiczne zmienne instancji, które odnoszÈ siÚ bezpoĂrednio do pól w tabeli reprezentowanej przez tÚ klasÚ. Dlatego gdy rekord zostanie juĝ zaïadowany, pochodzÈce z niego dane moĝna uzyskaÊ metodÈ JTable::get(). $jakieĂPole = $table- get( jakieĂPole ); Usuwanie rekordu przy uĝyciu JTable Niniejszy przepis opisuje, jak za pomocÈ obiektu JTable usuwa siÚ rekord istniejÈcy w bazie da- nych. Na potrzeby przykïadu bÚdzie uĝyta klasa JTable zaimplementowana w przepisie „Two- rzenie tabeli JTable”. Jak siÚ przygotowaÊ? Najpierw trzeba utworzyÊ obiekt JTable. Sposób tworzenia instancji obiektu JTable przed- stawiono w przepisie „Tworzenie tabeli JTable”. Jak to zrobiÊ? W przypadku usuwania danych najwaĝniejsza zasada mówi, ĝe nie naleĝy przywiÈzywaÊ siÚ emocjonalnie do danych. NaprawdÚ, przywiÈzywanie siÚ do danych moĝe byÊ wrÚcz niezdrowe! A mówiÈc powaĝnie, do usuwania rekordów sïuĝy metoda JTable::delete(). Jeĝeli rekord jest juĝ zaïadowany, metodÚ JTable::delete() moĝna wywoïaÊ bez koniecznoĂci podawania jakich- kolwiek parametrów — usunie ona wówczas rekord bieĝÈcy. Jeĝeli natomiast rekord nie zostaï zaïadowany, do metody JTable::delete() moĝna przekazaÊ parametr bÚdÈcy wartoĂciÈ klucza gïównego rekordu, który ma byÊ usuniÚty z bazy. if ($table- delete(JRequest::getInt( id ))) { // usuniĊcie rekordu siĊ powiodáo } Usuwanie rekordu z tabeli, która jest powiÈzana z innymi tabelami Za pomocÈ metody canDelete() moĝna sprawdziÊ, czy istniejÈ jakiekolwiek zaleĝnoĂci, które naleĝy usunÈÊ przed usuniÚciem samego rekordu. Do metody naleĝy przekazaÊ wartoĂÊ klucza gïównego rekordu, którego zaleĝnoĂci trzeba sprawdziÊ, oraz tablicÚ definiujÈcÈ powiÈzania tabeli, w której ten rekord siÚ znajduje. 99 Joomla! 1.5 od kuchni. Ponad 130 przepisów! Blokowanie i odblokowywanie rekordu przy uĝyciu JTable Niniejszy przepis opisuje, jak za pomocÈ klasy JTable rÚcznie implementuje siÚ mechanizm blokowania rekordu. Naleĝy pamiÚtaÊ, ĝe tak zaimplementowany mechanizm jest nadzorowany przez system Joomla!, a nie serwer baz danych, dlatego serwer moĝe uniewaĝniÊ jego dziaïanie. Jak siÚ przygotowaÊ? Najpierw trzeba utworzyÊ obiekt JTable. Sposób tworzenia instancji obiektu JTable przed- stawiono w przepisie „Tworzenie tabeli JTable”, we wczeĂniejszej czÚĂci tego rozdziaïu. Rekordy moĝna blokowaÊ jedynie wówczas, gdy tabela, w której rekordy siÚ znajdujÈ, zawiera pola checked_out i checked_out_time. Pierwsze pole wskazuje uĝytkownika, który zablokowaï dany rekord, natomiast drugie pole przechowuje informacjÚ o czasie zaïoĝenia blokady na rekordzie. Typami pól na serwerze MySQL sÈ, odpowiednio, INT UNSIGNED oraz DATETIME. Nasza przykïadowa tabela #__mojkomponent_foobars posiada obydwa pola i dziÚki temu moĝna w niej blokowaÊ rekordy przy uĝyciu mechanizmu realizowanego przez klasÚ JTable. Jak to zrobiÊ? Rekordy blokuje siÚ wówczas, gdy rozpoczyna siÚ edytowanie ich zawartoĂci. Gdy uĝytkownik na przykïad edytuje artykuï w komponencie zarzÈdzania treĂciÈ, rekord jest blokowany, aby ĝaden inny uĝytkownik nie mógï w tym czasie edytowaÊ tego samego artykuïu. Przed zablokowaniem rekordu trzeba najpierw sprawdziÊ, czy rekord nie zostaï juĝ wczeĂniej przez kogoĂ zablokowany. // pobranie informacji o bieĪącym uĪytkowniku $user = JFactory::getUser(); // zaáadowanie rekordu $table- load($id); // sprawdzenie, czy rekord nie zostaá juĪ wczeĞniej zablokowany if ($table- isCheckedOut($user- get( id ))) { // ktoĞ nas uprzedziá! } Jeĝeli okaĝe siÚ, ĝe rekord zostaï juĝ wczeĂniej przez kogoĂ zablokowany, standardowÈ czynnoĂciÈ jest przekierowanie przeglÈdarki do strony, na której bÚdzie zaprezentowana zawartoĂÊ rekordu i wyĂwietli siÚ odpowiedni komunikat, informujÈcy, ĝe rekord jest wïaĂnie edytowany przez kogoĂ innego. Jeĝeli natomiast rekord nie bÚdzie zablokowany, w kolejnym kroku musimy go sami zablokowaÊ. Do tego celu sïuĝy metoda JTable::checkout(). 100 Rozdziaá 3. • Praca z bazą danych // zablokowanie bieĪącego rekordu $table- checkout($user- get( id )); Gdy edycja rekordu zostanie zakoñczona, naleĝy rekord odblokowaÊ. CzynnoĂÊ tÚ wykonuje siÚ zwykle wówczas, gdy uĝytkownik zapisaï juĝ wprowadzone zmiany albo zrezygnowaï z edy- towania rekordu. Do odblokowywania rekordu sïuĝy metoda JTable::checkin(). // odblokowanie bieĪącego rekordu $table- checkin(); Informacje dodatkowe Przykïadowy kod, przedstawiony w punkcie „Jak to zrobiÊ”, prezentuje standardowy sposób uĝycia metody JTable::isCheckedOut() w odniesieniu do pojedynczego rekordu. W przypadku, gdy nie chcemy ïadowaÊ rekordu do obiektu JTable (co jest przydatne wówczas, kiedy mamy do czynienia z listÈ elementów, i naleĝy wyĂwietliÊ, które z nich zostaïy zaznaczone, a które nie), me- todÚ JTable::isCheckedOut() moĝna wywoïaÊ z drugim parametrem, którym bÚdzie wartoĂÊ pola checked_out. Metody tej moĝna uĝywaÊ równieĝ statycznie. // pobranie informacji o bieĪącym uĪytkowniku $user = JFactory::getUser(); // sprawdzenie, czy rekord nie zostaá juĪ wczeĞniej zablokowany if (JTable::isCheckedOut($user- get( id ), $checkedOut)) { // rekord jest zablokowany przez innego uĪytkownika } Metoda JTable::isCheckedOut() nie tylko wykonuje proste porównywane wartoĂci, ale równieĝ sprawdza, czy uĝytkownik, który zablokowaï rekord, jest wciÈĝ zalogowany. Metod JTable::checkout() i JTable::checkin() moĝna uĝywaÊ takĝe wówczas, gdy rekord, który trzeba zablokowaÊ lub odblokowaÊ, nie jest aktualnie zaïadowany. W tym celu odpowiedniÈ metodÚ naleĝy wywoïaÊ z opcjonalnym parametrem $oid. Parametr $oid wskazuje rekord, który ma byÊ zablokowany lub odblokowany. Aby na przykïad zablokowaÊ rekord, moĝna wykonaÊ nastÚpujÈcÈ instrukcjÚ: // zablokowanie rekordu wskazanego przez $oid $table- checkout($user- get( id ), $oid); Natomiast do odblokowania rekordu sïuĝy nastÚpujÈca instrukcja: // odblokowanie rekordu wskazanego przez $oid $table- checkin($oid); 101 Joomla! 1.5 od kuchni. Ponad 130 przepisów! Zmiana kolejnoĂci rekordów przy uĝyciu JTable Niniejszy przepis pokazuje, jak za pomocÈ klasy JTable definiuje siÚ kolejnoĂÊ rekordów. PierwszorzÚdnym przykïadem mogÈ byÊ menu Joomla!, które administratorzy mogÈ porzÈdkowaÊ w dowolny sposób. Rysunek 3.4 pokazuje, jak okreĂla siÚ kolejnoĂÊ menu w widoku administratora. Warto zwróciÊ szczególnÈ uwagÚ na kolumnÚ PorzÈdek. Rysunek 3.4. Kolumna PorzÈdek wyznacza kolejnoĂÊ menu Jak siÚ przygotowaÊ? Najpierw trzeba utworzyÊ obiekt JTable. Sposób tworzenia instancji obiektu JTable przedstawio- no w przepisie „Tworzenie tabeli JTable”, we wczeĂniejszej czÚĂci tego rozdziaïu. Uĝytkownikom moĝna zezwoliÊ na zmianÚ kolejnoĂci rekordów na podstawie indeksów licz- bowych jedynie wówczas, gdy w tabeli znajduje siÚ pole ordering. Na serwerze MySQL pole ordering jest typu INT UNSIGNED, zgodnie zresztÈ z definicjÈ tabeli #__mojkomponent_foobars, przedstawionÈ we wprowadzeniu do tego rozdziaïu. KolejnoĂÊ rekordów moĝna grupowaÊ. Inaczej mówiÈc, moĝna wskazywaÊ równieĝ inne pola tabeli, aby zdefiniowaÊ, do której grupy porzÈdkowej dany rekord naleĝy. W wiÚkszoĂci przypadków porzÈdkowanie jest wykonywane na podstawie tylko jednego rekordu. W przykïadowej tabeli #__mojkomponent_foobars, zdefiniowanej we wprowadzeniu do niniejszego rozdziaïu, grupowanie jest wykonywane wzglÚdem pola catid. Jeĝeli odniesiemy siÚ do przykïadowych danych przed- stawionych we wprowadzeniu, moĝemy zobaczyÊ, w jaki sposób grupowanie wpïywa na ko- lejnoĂÊ wartoĂci. 102 Rozdziaá 3. • Praca z bazą danych Jak to zrobiÊ? Do obsïugi porzÈdkowania rekordów sïuĝÈ trzy metody klasy JTable. Pierwsza z nich to metoda JTable::getNextOrder(), która ustala kolejne dostÚpne miejsce. Zazwyczaj metodÚ wywoïuje siÚ wówczas, gdy nowy rekord dodaje siÚ na koñcu listy. Poniĝszy przykïadowy fragment kodu sprawdza kolejne dostÚpne miejsce przy zaïoĝeniu, ĝe grupowanie jest wykonywane wzglÚdem pola catid i interesujÈca
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Joomla! 1.5 od kuchni. Ponad 130 przepisów!
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: