8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
1/1265
Joomla! 1.5 od kuchni.
Ponad 130 przepisw!Autor: James Kennard
Tumaczenie: Daniel Kaczmarek
ISBN: 978-83-246-2702-8
Tytu oryginau: Joomla! 1.5 Development Cookbook
Format: B5, stron: 360
Tu znajdziesz rozwizania najczciej spotykanych problemw!
Jak zapewni moliwo rozwoju rozszerze w przyszoci?
Jak wsppracowa z bazami danych?
Jak obsugiwa bdy, wykorzystujc mechanizmy Joomla!?
Joomla! to rozbudowany i uniwersalny system zarzdzania treci witryn internetowych,
dostpny na prawach open source. Umoliwia tworzenie nie tylko prostych stron
internetowych, ale take kompleksowych, rozbudowanych serwisw. Si Joomla! jest
prostota oraz zaangaowanie twrcw w zapewnienie atwoci pracy z tym systemem.
Zaawansowani uytkownicy czsto potrzebuj jednak rozwiza wykraczajcych poza
moliwoci dostpnych rozszerze. Naprzeciwko tym oczekiwaniom wychodzi elastyczny
framework Joomla! pozwala on programistom dostosowywa si w dowolny sposb
i tworzy wasne aplikacje, speniajce wyrafinowane kryteria.
Ksika Joomla! 1.5 od kuchni. Ponad 130 przepisw! przeznaczona jest dla
programistw dysponujcych dowiadczeniem w implementowaniu rozszerze dla tego
systemu. Stanowi zbir ponad 130 prostych, lecz niezwykle uytecznych przepisw,
pozwalajcych rozwiza praktyczne problemy zwizane z programowaniem w Joomla!.
Dziki swemu bogatemu dowiadczeniu autor w efektywny i zrozumiay sposb dzieli
si posiadan wiedz. Przedstawia niewielkie objtociowo przykady, ktre ilustruj
sposb radzenia sobie z problemami programistycznymi lub projektowymi, powszechnie
spotykanymi podczas tworzenia rozszerze Joomla!. Profesjonalici znajd tu przede
wszystkim praktyczne przepisy rozwiza konkretnych trudnoci, a pocztkujcy take
wiedz ogln (zwizan chociaby z obsug bdw w Joomla!), odpowiedzi na
pytania oraz sposoby realizacji standardowych zada. Rozwizania dotycz podstawowychzagadnie, czyli m.in. bezpieczestwa, dostpu do danych, uytkownikw, sesji czy
moliwoci wykorzystania jzykw narodowych.
Zapewnienie rozwoju rozszerze
Komunikacja z bazami danych
Tworzenie rde Atom i RSS
Bezpieczestwo rozszerze
Obsuga bdw i wyjtkw
Formatowanie stron
Tworzenie midzynarodowych rozszerze
Komunikacja z uytkownikiem Obiekty JObject i tablice
System plikw
Korzystanie z repozytorium Subversion
Poznaj rozwizania najczciej spotykanych w pracy z Joomla! 1.5 problemw,
http://www.amazon.com/exec/obidos/ASIN/1847198147/helion-20http://www.amazon.com/exec/obidos/ASIN/1847198147/helion-20http://www.amazon.com/exec/obidos/ASIN/1847198147/helion-20http://helion.pl/ksiazki/jo15od.htmmailto:[email protected]://helion.pl/online.htmhttp://helion.pl/cennik.htmhttp://helion.pl/emaile.cgihttp://helion.pl/zakupy/add.cgi?id=jo15odhttp://helion.pl/katalog.htmhttp://helion.pl/zamow_katalog.htmhttp://helion.pl/8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
2/1265
Spis treci
O autorze 9
Wprowadzenie 11
Rozdzia 1. Programowanie przy uyciu JoomlaCode.org i SVN 15
Wprowadzenie 16
Tworzenie projektu JoomlaCode.org 19
Zarzdzanie uczestnikami projektu JoomlaCode.org 23
Tworzenie repozytorium Subversion dla projektu JoomlaCode.org 25
Szkielet repozytorium Subversion 28
Modyfikacje w Subversion 30
Proces realizowany w Subversion 32
Pobieranie zawartoci repozytorium Subversion przy uyciu TortoiseSVN 35
Edytowanie kopii roboczej przy uyciu TortoiseSVN 39
Analiza zmian przy uyciu TortoiseSVN 4
Uaktualnianie kopii roboczej i eliminowanie konfliktw przy uyciu TortoiseSVN 41
Zatwierdzanie zmian przy uyciu TortoiseSVN 44
Eksportowanie kopii roboczej przy uyciu TortoiseSVN 46
Rozdzia 2. Zapewnianie bezpieczestwa rozszerze 47
Wprowadzenie 47
Tworzenie bezpiecznych zapyta SQL 50
Tworzenie bezpiecznych zapyta SQL, zawierajcych porwnania cigw znakw,
z wykorzystaniem operatora LIKE 55Uywanie tokenu 57
Zapewnianie bezpieczestwa nazwy pliku 61
Zapewnianie bezpieczestwa cieki katalogu 63
Zapewnianie bezpieczestwa cieki dostpu do pliku 65
Bezpieczne pobieranie danych z dania 68
Pobieranie wartoci z tablicy 75
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
3/1265
Spis treci
4
Rozdzia 3. Praca z baz danych 77
Wprowadzenie 77
Wykonywanie zapytania 80
adowanie pierwszej komrki ze zbioru wynikw zapytania 82
adowanie pierwszego rekordu z zapytania 84
adowanie wicej ni jednego rekordu z zapytania 87
Obsuga bdw DBO 89
Tworzenie tabeli JTable 91
Tworzenie nowego rekordu przy uyciu JTable 94
Modyfikacja rekordu przy uyciu JTable 97
Odczytywanie istniejcego rekordu przy uyciu JTable 98
Usuwanie rekordu przy uyciu JTable 99
Blokowanie i odblokowywanie rekordu przy uyciu JTable 100
Zmiana kolejnoci rekordw przy uyciu JTable 102
Publikowanie i wycofywanie rekordu z publikacji przy uyciu JTable 104
Zwikszanie licznika wywietle rekordu przy uyciu JTable 105
Rozdzia 4. Sesje i uytkownicy 107
Wprowadzenie 107
Pobieranie uchwytu sesji 108
Dodawanie danych do sesji 109
Pobieranie danych sesji 112
Sprawdzanie obecnoci danych w sesji 114
Sprawdzanie tokenu sesji 115
Pobieranie danych o uytkowniku 115
Sprawdzanie, czy aktualny uytkownik ma status gocia 117Odczytywanie imienia i nazwiska uytkownika oraz jego nazwy 118
Odczytywanie identyfikatora grupy uytkownika oraz typu uytkownika 120
Ograniczanie zakresu dostpu uytkownika przy uyciu poziomw dostpu Public,
Registered i Special 122
Odczytywanie wartoci parametrw uytkownika 124
Ustawianie wartoci parametrw uytkownika 126
Rozszerzanie i edytowanie parametrw uytkownika 127
Wysyanie wiadomoci poczty elektronicznej do uytkownika 131
Rozdzia 5. Jzyki narodowe 135
Wprowadzenie 135
Tworzenie tumaczenia 138
Tumaczenie wybranego tekstu 142
Sprawdzanie dugoci cigu znakw UTF-8 145
Usuwanie niewidocznych znakw UTF-8 z pocztku i koca cigu znakw 146
Porwnywanie cigw znakw UTF-8 148
Znajdowanie cigu znakw UTF-8 w innym cigu znakw UTF-8 149
Wykonywanie wyraenia regularnego na cigu znakw UTF-8 151
Odwracanie cigu znakw UTF-8 153
Wyodrbnianie cigu znakw z innego cigu znakw UTF-8 154
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
4/1265
Spis treci
5
Zastpowanie wystpie cigu znakw UTF-8 w innym cigu znakw UTF-8 155
Odczytywanie w cigu znakw UTF-8 znaku na wskazanej pozycji 157
Przeksztacanie cigu znakw z jednego standardu kodowania na inny 158
Tworzenie skryptu instalacji bazy danych uwzgldniajcego kodowanie UTF-8 159
Rozdzia 6. Interakcja z uytkownikiem i style 163Wprowadzenie 163
Odczytywanie parametrw strony i komponentu 164
Dodawanie do strony kaskadowego arkusza stylw CSS 166
Nadpisywanie szablonw w komponencie 168
Dodawanie kodu JavaScript na stronie 170
Tworzenie modalnego okna dialogowego 171
Generowanie treci modalnej 174
Uaktualnianie elementu przy uyciu Ajax i MooTools 176
Uaktualnianie elementu na podstawie formularza przy uyciu Ajax i MooTools 179
Przesyanie odpowiedzi Ajax z komponentu 181Wczanie stronicowania na licie elementw 184
Rozdzia 7. Dostosowywanie dokumentw 189
Wprowadzenie 189
Definiowanie tytuu dokumentu 191
Definiowanie generatora dokumentu 192
Definiowanie opisu dokumentu 192
Dodawanie metadanych do dokumentu 193
Zmiana zestawu znakw uywanego w dokumencie 194
Zmiana typu MIME dokumentu 196
Kontrola mechanizmu zapisywania odpowiedzi w pamici podrcznej klienta 198
Tworzenie dokumentu PDF w komponencie 200
Tworzenie kanau RSS lub Atom w komponencie 201
Zwracanie dokumentu w formacie RAW z komponentu 206
Uywanie wasnego dokumentu JDocument w komponencie (dotyczy wycznie PHP5) 208
Rozdzia 8. Dostosowywanie elementw standardowych 215
Wprowadzenie 216
Wyczanie paska menu 216
Ustawianie tytuu i ikony paska narzdziowego 218
Dodawanie do paska narzdziowego przycisku operujcego na jednostce danych 219Dodawanie do paska narzdziowego przycisku operujcego na zestawie danych 222
Dodawanie wasnych przyciskw do paska narzdziowego 224
Dodawanie odstpw i separatorw na pasku narzdziowym 227
Dodawanie systemu pomocy do komponentu 228
Tworzenie nagwka filtru dla danych tabelarycznych w komponencie MVC 230
Filtrowanie danych tabelarycznych w komponencie MVC 234
Tworzenie nagwkw kolumn sterujcych sortowaniem danych tabelarycznych
w komponencie MVC 238
Porzdkowanie danych tabelarycznych w komponencie MVC 240
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
5/1265
Spis treci
6
Rozdzia 9. Utrzymywanie rozszerzalnoci i modularnoci 243
Wprowadzenie 244
adowanie moduw dodatkowych 245
Wywoywanie moduu dodatkowego 247
Tworzenie dodatkowego moduu w systemie Joomla!, realizujcego wyszukiwanie 248
Tworzenie wasnej biblioteki i funkcji importujcej 254
Instalowanie moduu dodatkowego z poziomu kodu rdowego
w trakcie instalacji komponentu 257
Prosty sposb zarzdzania kategoriami 260
Definiowanie parametrw JParameter przy uyciu jzyka XML 262
Tworzenie obiektu JParameter 265
Renderowanie obiektu JParameter 266
Zapisywanie danych JParameter 268
Odczytywanie i ustawianie wartoci obiektu JParameter 269
Definiowanie wasnego typu JParameter 271
Rozdzia 10. Obiekty JObject i tablice 275
Wprowadzenie 275
Odczytywanie waciwoci JObject 278
Odczytywanie wszystkich publicznych waciwoci JObject 279
Ustawianie waciwoci JObject 280
Ustawianie zbioru waciwoci JObject 281
Raportowanie bdu w JObject 281
Pobieranie bdu z JObject 283
Pobieranie wszystkich bdw z JObject 284
Przeksztacanie obiektu w tablic 285Przeksztacanie tablicy w obiekt 287
Odczytywanie kolumny z tablicy wielowymiarowej 288
Odczytywanie wartoci z tablicy 289
Rzutowanie wszystkich elementw tablicy na liczby cakowite 291
Sortowanie tablicy obiektw 292
czenie elementw tablicy 293
Rozdzia 11. Obsuga i raportowanie bdw 297
Wprowadzenie 297
Zgaszanie bdu J!error 299
Zgaszanie ostrzeenia J!error 301
Zgaszanie informacji J!error 304
Kolejkowanie komunikatu 306
Zmiana domylnego sposobu obsugi bdw J!error 308
Obsuga i zgaszanie dedykowanych bdw J!error 311
Zapisywanie bdw i zdarze przy uyciu JLog 314
Rzucanie wyjtkw w PHP5 316
Przechwytywanie wyjtkw w PHP5 319
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
6/1265
Spis treci
7
Rozdzia 12. Pliki i foldery 323
Wprowadzenie 323
Sprawdzanie, czy plik lub folder istnieje 325
Odczytywanie pliku 327
Usuwanie pliku lub folderu 329
Kopiowanie pliku lub folderu 331
Przenoszenie i zmiana nazwy plikw i folderw 332
Tworzenie folderu 334
adowanie plikw do systemu Joomla! 336
Odczytywanie struktury katalogw 340
Zmiana uprawnie do pliku i folderu 343
Skorowidz 345
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
7/1265
3
Praca z baz danych
Ten rozdzia zawiera nastpujce przepisy:
Q Wykonywanie zapytaniaQ adowanie pierwszej komrki ze zbioru wynikw zapytaniaQ adowanie pierwszego rekordu z zapytaniaQ adowanie wicej ni jednego rekordu z zapytaniaQ Obsuga bdw DBOQ Tworzenie tabeli JTableQ Tworzenie nowego rekordu przy uyciu JTableQ Modyfikacja rekordu przy uyciu JTableQ Odczytywanie istniejcego rekordu przy uyciu JTableQ Usuwanie rekordu przy uyciu JTableQ Blokowanie i odblokowywanie rekordu przy uyciu JTableQ Zmiana kolejnoci rekordw przy uyciu JTableQ Publikowanie i wycofywanie rekordu z publikacji przy uyciu JTableQ Zwikszanie licznika wywietle rekordu przy uyciu JTable
WprowadzenieWikszo danych Joomla! jest przechowywanych w bazie danych. Dotyczy to midzy innymigwnych rozszerze, a take rozszerze pochodzcych od dostawcw zewntrznych. Joomla!czsto jest okrelana mianem aplikacji PHP i MySQL. Rzeczywicie, Joomla! korzysta z serweraMySQL, lecz architektura systemu pozwala na uycie rwnie innych serwerw baz danych.Aktualnie wersja 1.5 oficjalnie obsuguje jedynie bazy danych MySQL.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
8/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
78
Nazwy wszystkich tabel w bazie danych Joomla! rozpoczynaj si od okrelonego prefiksu.Posta prefiksu jest ustalana globalnie dla caej instalacji systemu, dlatego w odwoaniach do tabelzawsze trzeba uywa prefiksu zdefiniowanego dla konkretnej instalacji. Na szczcie prefiksu nietrzeba definiowa samodzielnie. Wyobramy sobie, e prefiksem jest jos i istnieje tabela o nazwiejos_ojkoponent_foobars. Zamiennikiem dla prefiksu jest cig znakw #_, dziki czemu nazw
tabeli mona wyrazi w nastpujcy sposb:
#__ojkoponent_foobars
Obiektem, ktrego uywa si najczciej do interakcji z baz danych, jest globalny obiekt DBO(Database Object). Jest on uzyskiwany przy wykorzystaniu klasy JFactory. Warto zaznaczy, e doprzypisania obiektu zmiennej naley uy operatora=&. Jeeli operator ten nie bdzie uyty,a wersja jzyka PHP bdzie nisza ni 5, utworzona zostanie jedynie kopia obiektu DBO.
$db =& JFactory::getDBO();
Bezpieczestwo a kod SQL
W trakcie tworzenia zapyta SQL trzeba zachowa szczegln ostrono, poniewa bardzo atwo jest narazisi na niebezpieczestwo. Wicej informacji na temat tworzenia bezpiecznych zapyta SQL znajduje si
w przepisach dotyczcych jzyka SQL, w rozdziale 2.
Na potrzeby niniejszego przykadu w kadym przepisie uywana bdzie tabela zdefiniowana jakotabela 3.1. Oczywicie, nie oznacza to, e w kadym przepisie tabela bdzie uywana w caoci w odpowiednich przypadkach bdziemy bazowa wycznie na okrelonych zbiorach danychz tej tabeli.
Oprcz zdefiniowanej tabeli bdziemy uywa rwnie przykadowych danych, wskazanychw tabeli 3.2.
Aby utworzy tabel do celw testowania, najlepiej jest pobra archiwum przykadowych kodwzwizanych z t ksik, dostpne na stronie wydawnictwa Helion, pod adresemftp://ftp.helion.pl/przyklady/jo15od.zip.
Przeznaczenie pola paras nie jest w tym rozdziale wyjaniane. Pole to suy do rozszerzania bazy danych
poza jej pierwotn struktur. Wicej informacji na ten temat mona znale w przepisie dotyczcymobiektw JParaeter i JEleent, w rozdziale 9., Utrzymywanie rozszerzalnoci i modularnoci.
Jedn z najbardziej rozbudowanych klas udostpnianych przez Joomla! jest klasaJTable. Abstrak-cyjna klasaJTable umoliwia zaimplementowanie w krtkim czasie interfejsu dla kadej z tabelznajdujcych si w bazie danych. Oprcz standardowych elementw, ktre zwykle wchodzw skad tego typu klas, JTable udostpnia ca gam metod, za pomoc ktrych bez trudu im-plementuje si funkcje najczciej wykonywane w Joomla!, takie jak choby blokowanie re-kordw. Ponisza lista prezentuje wbudowane funkcje udostpniane przez klas JTable:
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
9/1265
Rozdzia 3. Praca z baz danych
79
Tabela 3.1. Definicja tabeli #__mojkomponent_foobars bazy danych na potrzeby przepisw w niniejszym rozdziale
Pole TypNOTNULL
Autoincrement
Unsigned Opis
id int(11) TAK TAK TAK Klucz gwny.
foo varchar(100) TAK Oglne pole tekstowe,ktre nie moe by puste.
bar varchar(100) Oglne pole tekstowe, ktre moe by puste.
checked_out int(11) TAK TAK Uytkownik, dla ktrego rekord zostazablokowany.
checked_out_tie
datetie TAK Czas zablokowania rekordu.
ordering int(11) TAK TAK Pozycja, na ktrej powinien znajdowa siten rekord w grupie rekordw.
published tinyint(1) TAK TAK Wskazuje, czy rekord jest opublikowany.hits int(11) TAK TAK Liczba wywietle rekordu.
catid int(11) TAK Klucz obcy do tabeli kategorii.
paras text TAK Dodatkowe parametry.
Tabela 3.2. Przykadowe dane dla przepisw z niniejszego rozdziau
id foo bar checked_out checked_out_time ordering published hits catid params
100 NULL 0 0000-00-00 00:00:00 4 1 13 1
101 Lorem NULL 0 0000-00-00 00:00:00 3 1 43 1
102 ipsum NULL 0 0000-00-00 00:00:00 1 1 72 1
103 dolor NULL 62 2009-03-11 11:18:32 2 1 55 1
104 sit NULL 0 0000-00-00 00:00:00 1 0 0 2
105 amet NULL 0 0000-00-00 00:00:00 2 1 49 2
Q Wizanie kopiowanie danych z tablicy lub obiektu do obiektu JTable.Q XML prezentowanie rekordu w formacie XML.Q
Zarzdzanie rekordami tworzenie, odczytywanie, modyfikacja i usuwanie rekordw.Q Weryfikacja poprawnoci sprawdzanie, czy dane w rekordzie odpowiadaj
zestawowi zdefiniowanych regu poprawnoci.
Q Blokowanie zapobieganie edycji danego rekordu jednoczenie przez wicej nijednego uytkownika.
Q Wyznaczanie kolejnoci porzdkowanie rekordw zgodnie z preferencjami uytkownika.Q Publikowanie udostpnianie rekordu na widok publiczny lub jego wycofywanie
z publikacji.
Q Zliczanie wywietle rejestrowanie liczby wywietle rekordu.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
10/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
80
W tym rozdziale wyjanimy, jak tworzy si konkretn implementacj JTable. Ponadto pokazanezostanie, jak korzysta si z poszczeglnych funkcji opisanych powyej.
Zarzdzanie rekordami bazuje na paradygmacie CRUD, ktry stanowi skrt od angielskich nazwczynnoci wykonywanych na rekordach: Create (tworzenie), Read (odczytywanie), Update (mody-
fikowanie) i Delete (usuwanie). Cztery czynnoci skadajce si na paradygmat CRUD wyznaczaj jednoczenie cykl ycia elementu przechowywanego w staej skadnicy danych. Cykl ycia ele-mentu wraz ze schematem CRUD przedstawiono na rysunku 3.1. W kontekcie JTable i CRUDskadnic danych jest baza danych, natomiast elementem jest rekord przechowywany w jednejlub wicej tabel tej bazy albo, mwic precyzyjniej, w tabeli reprezentowanej przez dany obiektklasy JTable.
Rysunek 3.1. Paradygmat CRUD i cykl ycia rekordu
Czasami moe by do trudno zrozumie cel klasy JTable oraz sposb, w jaki wpasowuje si onaw komponent MVC systemu Joomla!, zwaszcza jeli ju posiada si model oraz dostp do bazydanych za porednictwem DBO. Aby lepiej zrozumie kontekst, najlepiej jest myle o JTablejak o kolejnej warstwie abstrakcji midzy programist a baz danych. Dziki JTable unika sikoniecznoci operowania na nieprzetworzonych danych.
Wykonywanie zapytaniaNajbardziej podstawow spord wszystkich metod klasy JDatabase sucych do wykonywaniazapytania jest metodaJDatabase::query(). Metody tej uywa si jedynie wwczas, gdy wykony-wane zapytanie nie zwraca adnego zbioru wynikowego, poniewa metoda zwraca odpowiedziw postaci nieprzetworzonej. Jeeli na przykad pomylnie zostanie wykonane zapytanie SELECT,metoda zwrci zasb z danymi wynikowymi. Trudno si jednak spodziewa, by jakikolwiek
programista chcia rcznie operowa na zasobie!
Kiedy wic uywa si metody JDatabase::query()? Mwic najprociej, uywa si jej wwczas,gdy wynikiem zapytania jest warto logiczna, czyli gdy wynikiem bdzie informacja, czy wy-konanie si powiodo, czy nie. Poniej znajduje si lista rodzajw zapyta na danych, ktremona wykonywa przy uyciu metody JDatabase::query():
Q DELETEQ INSERT
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
11/1265
Rozdzia 3. Praca z baz danych
81
Q RENAMEQ REPLACEQ 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, ktre ma zosta wykonane. Poniszy przykadtworzy proste zapytanie DELETE, ktre usunie wszystkie rekordy z tabeli #__ojkoponent_foobars z wartociordering wiksz ni 4:
// przygotowanie nazw$tableNae = $db->naeQuote('#__ojkoponent_foobars');$colunNae = $db->naeQuote('ordering');// sformuowanie zapytania DELETE$sql = "DELETE FROM $tableNae " .
. "WHERE $colunNae > 4 ";
Przed wykonaniem zapytania trzeba wskaza obiektowi DBO, gdzie to zapytanie si znajduje. Brzmiprzystpnie i rzeczywicie jest to prosta czynno, ale bardzo czsto si o niej zapomina:
$db->setQuery($sql);
Na koniec pozostaje ju tylko wykona zapytanie.
if ($db->query()) { // zapytanie si powiodo else { // zapytanie si nie powiodo
Poniewa wiemy, e wynikiem zapytaniaDELETE zawsze bdzie warto true lub false, nic nie
stoi na przeszkodzie, by na podstawie wartoci zwrconej przez metod JDatabase::query()oceni, czy wykonanie zapytania si powiodo, czy nie. Wicej informacji na ten temat monaznale w przepisie Obsuga bdw DBO, w dalszej czci tego rozdziau.
Informacje dodatkoweGdy zapytanie zostanie ju pomylnie wykonane, przydatn metod moe si okaza metodaJDatabase::getAffectedRows(). Metoda ta zwraca liczb rekordw, ktre byy przedmiotemostatnio wykonywanego zapytania.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
12/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
82
// zapytanie si powiodo$affectRowCount = $db->getAffectedRows();// wywietlenie potwierdzeniaecho JText::sprintf('USUNI}TO %u REKORDY(W)', $affectRowCount);
Zobacz rwnieKolejne trzy przepisy, adowanie pierwszej komrki ze zbioru wynikw zapytania, ado-wanie pierwszego rekordu z zapytania oraz adowanie wicej ni jednego rekordu z zapytania,prezentuj sposoby wykonywania zapytaniaSELECT i pobierania danych zwrconych przezto zapytanie.
adowanie pierwszej komrkize zbioru wynikw zapytaniaCzasami wykonywane zapytania s bardzo proste i maj na celu odczytanie wycznie jednejwartoci. Przykadem moe by odczytywanie za pomoc funkcji COUNT() liczby rekordw, ktrepasuj do zadanych kryteriw, albo sprawdzanie wartoci jednej kolumny w rekordzie, ktregoidentyfikator jest dany. W takich przypadkach nie ma potrzeby pobierania caych, zoonychzbiorw danych, aby odczyta interesujc nas warto. KlasaJDatabase udostpnia prosty i szybkisposb odczytywania pierwszej wartoci z pierwszego rekordu ze zbioru danych.
Jak si przygotowa?Aby odczyta pojedyncz warto, naley utworzy instancj obiektu DBO Joomla!.
$db =& JFactory::getDBO();
Jak to zrobi?
Najpierw trzeba przygotowa zapytanie. W poniszym przykadzie za pomoc funkcji agregujcejCOUNT() ustala si liczb rekordw w tabeli #__ojkoponent_foobars.Jest to modelowa sytuacja,w ktrej odczytywana jest tylko jedna warto.
// przygotowanie nazw$tableNae = $db->naeQuote('#__ojkoponent_foobars');// sformuowanie zapytania COUNT$sql = "SELECT COUNT(*) FROM $tableNae";
Zanim zapytanie bdzie mona wykona, trzeba je wskaza obiektowi DBO.
$db->setQuery($sql);
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
13/1265
Rozdzia 3. Praca z baz danych
83
Na koniec pozostaje wykona zdefiniowane zapytanie.
$total = $db->loadResult();
Jeeli przykadowe zapytanie bdzie wykonane na tabeli zdefiniowanej we wprowadzeniu doniniejszego rozdziau, zmiennej $total przypisany zostanie wynik zapytania typu string(1) o war-toci "6". Warto zwrci uwag, e cho MySQL zwrci warto cakowitoliczbow, to bdzieona reprezentowana przez cig znakw.
Jak to dziaa?W przedstawionym przykadzie zapytanie odczytuje tylko pojedyncz warto. Co si jednakstanie, jeli wynikiem zapytania bdzie bardziej zoony zbir danych? Rozwamy zapytanieo nastpujcej treci:
SELECT *FROM `#__ojkoponent_foobars`WHERE `id` > 103;
Wynikiem wykonania zapytania bdzie nastpujcy zbir danych:
104 sit NULL 0 0000-00-00 00:00:00 1 0 0 2
105 amet NULL 0 0000-00-00 00:00:00 2 1 49 2
Jeeli wykonana zostanie metodaJDatabase::loadResult(), zwrci warto z lewego grnego
rogu zbioru danych, czyli w tym przypadku warto 104.
Informacje dodatkoweC, nie jest to nic skomplikowanego. Tak naprawd cay mechanizm dziaa bardzo atwo.Jest jednak co, o czym naley pamita. Jako przykadu uyjemy podzbioru danych z tabeli#__ojkoponent_foobars, widocznego w tabeli 3.3.
Tabela 3.3. Przykadowy podzbir danych
id foo bar
100 NULL
101 Lorem NULL
102 ipsum NULL
103 dolor NULL
104 sit NULL
105 amet NULL
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
14/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
84
Wykonanie agregujcej funkcji COUNT() na zbiorze danych z tabeli 3.3 spowoduje, e zwrconazostanie warto 6 (w postaci cigu znakw), co jest jak najbardziej zrozumiae. Jednak wyko-nanie ponownie tego samego zapytania, lecz z dodatkow klauzul WHERE bar IS NOT NULL,spowoduje zwrcenie wartoci 0 (rwnie bdcej cigiem znakw); ale to rwnie jest jak naj-bardziej zrozumiae. Jeeli zapytamy o warto MAX() z kolumny id, otrzymamy warto 105. Z kolei jako zawarto kolumny foo rekordu o identyfikatorze 100 zwrcony bdzie pusty cig znakw.Jeeli bdzie wykonane zapytanie o warto polabar w dowolnym rekordzie, zwrcona zostaniewarto NULL.
I co w zwizku z tym? Przecie wszystko dziaa idealnie! Jednak jeeli z jakiego powodu wy-konanie zapytania si nie powiedzie, rwnie zwrcona zostanie warto NULL. Zalenie odkontekstu zapytania warto ta moe by niejednoznaczna. W przypadku zapytania z funkcjagregujcCOUNT() atwo jest zrozumie wynik NULL, poniewa wiadomo, e prawidowy wynikpowinien by liczb cakowit (cho reprezentowan przez cig znakw). Jednak jeeli zapytaniema na celu odczytanie wartoci z kolumny, w ktrej mog wystpowa wartoci NULL, jak ma to
miejsce choby w kolumnie bar, wwczas znaczenie zwrconej wartoci NULL staje si niejasne.
Zobacz rwniePrzepis Obsuga bdw DBO opisuje, jak sprawdza wystpienia bdw po wykonaniuzapytania.
adowanie pierwszego rekordu z zapytaniaDo czsto zdarza si, e trzeba zaadowa pierwszy rekord z wynikw zapytania. Jeeli naprzykad utworzono komponent, ktry obsuguje przepisy kulinarne, to gdy uytkownik chceodczyta przepis, wystarczy pozyska tylko jeden rekord. atwo jest ten fakt przeoczy ze wzglduna to, e wikszo programistw jest przyzwyczajona do nawigowania przez zbiory danych,na przykad instrukcj$record = array_shift($dataset). Lecz wykonanie tej samej operacjiw Joomla! jest jeszcze atwiejsze.
Pierwszy rekord mona pobra z zapytania tak naprawd na trzy sposoby, a wybr konkretnego
rozwizania zaley od formatu, w jakim rekord ma by zwrcony. Dostpne formaty to tablica,tablica asocjacyjna oraz obiekt. Diagram widoczny na rysunku 3.2 ilustruje rekord w postacitakiej, w jakiej wystpuje w bazie danych. Pod rekordem znajduj si ilustracje trzech do-stpnych formatw, w ktrych rekord moe zosta zwrcony przy uyciu obiektu klasy JDatabase.
W polu bar bazy danych znajduje si warto NULL, ktra jest tosama z wartocinull uy-wan w jzyku PHP. Nie naley jej jednak myli z pustym cigiem znakw, czyli z cigiem,ktry nie posiada adnego znaku. Reprezentacj obiektu jest obiekt klasy stdClass. Jest topodstawowa klasa wbudowana w jzyku PHP, ktra nie posiada adnych predefiniowanychskadowych.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
15/1265
Rozdzia 3. Praca z baz danych
85
Rysunek 3.2. Dostpne formaty rekordu zwracanego przez obiekt klasy JDatabase
Najlepiej uy klasy JTable
Gdy z jednej tabeli trzeba pozyska tylko jeden rekord i nie s do tego celu uywane adne funkcje jzykaSQL oraz wiadomo, e mamy do czynienia z wartoci klucza gwnego, korzystniejsze bdzie uycie
obiektu klasy JTable. Klasa JTable udostpnia prosty w uyciu interfejs do tabel znajdujcych si w baziedanych. Wicej informacji na ten temat mona znale w przepisie Tworzenie tabeli JTable, w dalszejczci rozdziau.
Jak si przygotowa?Aby odczyta pojedynczy rekord, naley utworzy instancj obiektu DBO Joomla!.
$db =& JFactory::getDBO();
Jak to zrobi?Najpierw trzeba przygotowa zapytanie. Poniszy kod odczytuje z przykadowej tabeli#__ojkoponent_foobars rekord o identyfikatorze 101.
// przygotowanie nazw$tableNae = $db->naeQuote('#__ojkoponent_foobars');$idColun = $db->naeQuote('id');$fooColun = $db->naeQuote('foo');
$barColun = $db->naeQuote('bar');// sformuowanie zapytania COUNT$sql = "SELECT $idColun, $fooColun, $barColun "
. "FROM $tableNae "
. "WHERE $idColun = 101";
Przed wykonaniem zapytania trzeba je wskaza obiektowi DBO.
$db->setQuery($sql);
Na kocu pozostaje ju tylko wykona zapytanie. Jak wspomniano ju wczeniej, zapytanie monawykona na trzy sposoby. Przedstawiono je w poniszym przykadzie:
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
16/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
86
// 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 dziaanie kadej z powyszych instrukcji? Odpowied znajduje si nadiagramie z rysunku 3.2, we wprowadzeniu do tego rozdziau. Kolejne instrukcje zwracaj odpo-wiednio tablic, tablic asocjacyjn oraz obiekt i kady z wynikw instrukcji reprezentuje rekordo identyfikatorze 101.
W zwykych tablicach numer indeksu zaley od pozycji, dlatego pierwsze pole znajduje si napozycji 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 moe sta si rdem bdw w trakcieutrzymania systemu. Jeeli na przykad do tabeli bdzie dodana nowa kolumna, by moe ko-
nieczne bdzie rwnie zmodyfikowanie znacznej czci pozostaego kodu.
Z kolei w tablicach asocjacyjnych i obiektach odwoania do wartoci maj posta nazwy pola.Dziki temu zarwno tablice asocjacyjne, jak i obiekty nie s a tak wraliwe na zmiany w struktu-rze bazy danych, a ich reprezentacj atwo zrozumie pod wzgldem semantycznym. Dlategogeneralnie rzecz biorc, najlepiej jest uywa tablic asocjacyjnych i (lub) obiektw.
Informacje dodatkowe
Ze wzgldw bezpieczestwa czasami podane moe by sprawdzenie, czy zapytanie zwrciotylko jeden wiersz. W niektrych sytuacjach zoliwy uytkownik moe zyska moliwo takiegoobejcia zabezpiecze rozszerzenia, by adowanych byo wicej wierszy ni jeden. Najprostszymprzykadem sytuacji, gdy powinno si sprawdza liczb wierszy, jest odczytywanie danych z tabeliuytkownikw. Pod adnym pozorem nie powinno si przez przypadek udostpnia takich danych!
Liczb rekordw odczytanych z bazy danych mona sprawdzi metodJDatabase::getNuRows().MetodaJDatabase::getNuRows() zwraca liczb rekordw, ktre zostay zwrcone przez ostatniowykonane zapytanie.
if ($db->getNuRows() > 1) {
// oho, odczytano jaki ciekawy rekord!
Uwaga na klauzul LIMIT, gdy sprawdzana jest liczba wierszy
Metoda JDatabase::getNuRows() zwraca liczb wierszy zwrconych w wyniku wykonania zapytania.Jeeli zakres zwrconych wierszy zostanie ograniczony przy uyciu klauzuli LIMIT, wwczas maksymalnaliczba wierszy wynikowych bdzie rwna wartoci klauzuli LIMIT. Aby sprawdzi, jaka jest potencjalnaliczba wszystkich wierszy wynikowych, naley uy funkcji agregujcej COUNT().
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
17/1265
Rozdzia 3. Praca z baz danych
87
Zobacz rwniePrzepis Obsuga bdw DBO opisuje, jak sprawdza wystpienia bdw po wykonaniuzapytania.
adowanie wicejni jednego rekordu z zapytaniaBez wzgldu na to, jaka metoda zostanie wybrana do pozyskania wielu rekordw z bazy danych,zawsze uzyskamy na kocu tablic rekordw. Inny moe by jedynie sposb reprezentacjipojedynczych rekordw w tablicy. Jeeli uywana jest klasaJDatabase, wiersz tablicy moe mie jedn z trzech postaci. Moe wystpowa jako tablica, tablica asocjacyjna albo obiekt. Diagramwidoczny na rysunku 3.3 przedstawia dostpne reprezentacje kilku przykadowych rekordw.
Rysunek 3.3. Dostpne reprezentacje rekordw z bazy danych
W polu bar bazy danych znajduje si warto NULL, ktra jest tosama z wartocinull uywanw jzyku PHP. Nie naley jej jednak myli z pustym cigiem znakw, czyli z cigiem, ktry nieposiada adnego znaku. Reprezentacj obiektu jest obiekt klas stdClass. Jest to podstawowaklasa wbudowana w jzyku PHP, ktra nie ma adnych predefiniowanych skadowych.
Jak si przygotowa?Aby uzyska tablic rekordw, naley wpierw utworzy instancj obiektu DBO Joomla!.
$db =& JFactory::getDBO();
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
18/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
88
Jak to zrobi?Najpierw trzeba przygotowa zapytanie. Poniszy przykadowy kod odczytuje z przykadowejtabeli #__ojkoponent_foobars rekordy o identyfikatorach 101, 102 i 103.
// przygotowanie nazw$tableNae = $db->naeQuote('#__ojkoponent_foobars');$idColun = $db->naeQuote('id');$fooColun = $db->naeQuote('foo');$barColun = $db->naeQuote('bar');// sformuowanie zapytania$sql = "SELECT $idColun, $fooColun, $barColun "
. "FROM $tableNae "
. "WHERE $idColun >= 101 AND "
. " $idColun
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
19/1265
Rozdzia 3. Praca z baz danych
89
Informacje dodatkoweTablica, w ktrej zwracane s wyniki zapytania, jest domylnie zwyk tablic, to znaczy tablicindeksowan liczbowo, w kolejnoci zgodnej z kolejnoci odczytywania wierszy z bazy danych.
Dostpna jest jednak ciekawa opcja, dziki ktrej mona uywa indeksw bardziej zoonych.W przypadkach, gdy wiersze posiadaj pojedyncz, unikatow warto, jako indeksu tablicymona uy wanie tego klucza. Jeeli na przykad klucze maj wartoci 101, 102 i 103, wwczasidentyczne wartoci mog mie klucze tablicy, co wida w przykadowym kodzie:
Array(
[101] => Array ( [0] => 101 [1] => Lore [2] => null )[102] => Array ( [0] => 102 [1] => ipsu [2] => null )[103] => Array ( [0] => 103 [1] => dolor [2] => null )
)
Aby uzyska taki efekt, odpowiedni metod JDatabase::load*List() naley wykona z opcjo-nalnym pierwszym parametrem. Parametr przekazany do metody wskazuje jej, ktra kolumnarekordu reprezentuje klucz. W przypadku metody JDatabase::loadRowList() parametr musi byliczb cakowit, poniewa oznacza on indeks kolumny w zbiorze danych. Dla pozostaychdwch metod warto parametru musi by cigiem znakw odpowiadajcym nazwie kolumnyw zbiorze danych.
// pobranie rekordw w postaci tablicy$arrays = $db->loadRowList(0);// pobranie rekordw w postaci tablicy asocjacyjnej$associativeArrays = $db->loadAssocList('id');// pobranie rekordu w postaci obiektw klasy stdClass$objects = $db->loadObjectList('id');
Zobacz rwniePrzepis Obsuga bdw DBO opisuje, jak sprawdza wystpienia bdw po wykonaniuzapytania.
Obsuga bdw DBONie zawsze wszystko idzie zgodnie z planem. Metoda wykonywania zapytania wyznacza jed-noczenie sposb, w jaki sprawdza si wystpienie bdw. Jeeli na przykad uyto metodyJDatabase::query(), to w przypadku bdu w wykonaniu zapytania metoda ta zwrci logicznwarto false. Jest to oczywicie w peni akceptowalna metoda sprawdzania, czy wystpiy bdy,jednak dostpny jest rwnie sucy temu celowi oglniejszy mechanizm.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
20/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
90
Problem ze sprawdzaniem wartoci wynikowej jest zwizany z faktem, e zawsze trzeba wiedzie,jak kada metoda wykonujca zapytanie sygnalizuje wystpienie bdu. Kolejnym problemem jest to,e Joomla! moe rwnie wsppracowa z serwerami baz danych innymi ni MySQL, a adapterydla innych serwerw baz danych mog inaczej sygnalizowa wystpienie bdu. Na szczcie wy-stpienie bdu mona rozpoznawa w inny sposb, ktry bardziej uniezalenia implementowany
kod rdowy od uchwytu DBO.
Jak to zrobi?MetodaJDatabase::getErrorNu() zwraca numer bdu wygenerowanego w wyniku wykonaniaostatniego zapytania. Jeeli nie pojawi si aden bd, metoda zwraca warto 0. Dziki temu,aby uzyska informacj, czy wystpi bd, wystarczy sprawdzi numer bdu.
if ($db->getErrorNu() == 0) { // aden bd nie wystpi else { // wystpiy bdy
Jak to dziaa?Numery bdw zwracane przez metod JDatabase::getErrorNu() s oryginalnymi numeramibdw serwera baz danych. Pewnym problemem jest fakt, e rne serwery baz danych uywajrnych kodw bdu. Jeeli na przykadwskazana tabela nie istnieje, serwer MySQL zwrci
bd o kodzie 1146, za dla SQL Servera jest to bd o kodzie 208. Z tego powodu metodyJDatabase::getErrorNu() uywa si wycznie po to, aby sprawdzi, czy w ogle wystpijaki bd.
Informacje dodatkoweOprcz kodu bdu mona pozyskiwa rwnie tre komunikatu o bdzie. Podobnie jak w przy-padku kodw bdw, rwnie tre komunikatw o bdach zaley od uywanego serwera bazdanych. Wprawdzie obiekt DBO jest z technicznego punktu widzenia obiektem klasy JObject,
lecz do odczytywania ostatnio zwrconego komunikatu o bdzie nie uywa si zwykej metodyJObject::getError(), ale metody JDatabase::getError().
// jeeli wystpi bd$error = $db->getErrorMsg();// wywietlenie komunikatu o bdzieJError::raiseWarning(500, $error);
Istnieje rwnie rozwizanie alternatywne. MetodaJDatabase::stderr() zwraca bardziej rozbu-dowany komunikat o bdzie.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
21/1265
Rozdzia 3. Praca z baz danych
91
// jeeli wystpi bd$error = $db->stderr();// wywietlenie komunikatu o bdzieJError::raiseError(500, $error);
Wad odczytywania komunikatw o bdach w taki sposb, jaki przedstawiono powyej, jest to, etreci tych komunikatw nie s tumaczone na jzyk biecy. Generalnie rzecz biorc, oryginalnetreci komunikatw o bdach s uywane jedynie wwczas, gdy bd ma charakter krytycznyi zwracany jest wewntrzny bd serwera o kodzie 500, jak w ostatnim przykadzie.
MetodaJDatabase::stderr() moe zwraca rwnie kod SQL, ktrego wykonanie spowodowaowygenerowanie bdu. W tym celu metod wywouje si z opcjonalnym parametrem $showSQLo wartoci true (domylnie parametr ten ma warto false).Nie zaleca si wywietlania koduSQL na serwerach dziaajcych w rodowisku produkcyjnym, poniewa kod ten zawiera informa-cje, na podstawie ktrych zoliwy uytkownik moe sprbowa zama zabezpieczenia systemu.
Tworzenie tabeli JTableNiniejszy przepis prezentuje sposb, w jaki tworzy si klas JTable, ktra bdzie reprezento-wa przykadow tabel #__ojkoponent_foobars, przedstawion we wprowadzeniu do tego roz-dziau. Na potrzeby przepisu zostan uyte tylko trzy pierwsze pola tabeli: id, foo i bar.
Jak si przygotowa?Jeeli klasaJTable tworzona jest w ramach komponentu, trzeba najpierw utworzy folder tables(o ile jeszcze nie istnieje). Folder musi si znajdowa w gwnym folderze administracyjnymrozszerzenia. Na przykad w przypadku komponentu o nazwie ojkoponent waciwym fol-derem bdzie folder administrator/components/com_mojkomponent/tables .
W (rzadko spotykanym) przypadku, gdy klasaJTable tworzona jest dla innego rodzaju rozszerzenia,nie istnieje predefiniowana lokalizacja dla klas JTable. Aby wobec konkretnej klasy JTable, znaj-dujcej si w lokalizacji alternatywnej, zastosowa statyczn metod JTable::getInstance(),
naley wskaza klasie JTable, w ktrym folderze dodano podklasy JTable. Warto pamita, e ist-nieje moliwo dodawania wicej cieek ni jedna.
JTable::addIncludePath($ciekaDoObiektwJTable);
Jak to zrobi?Gdy tworzone s konkretne klasy JTable, bardzo wane s stosowane konwencje nazewnictwa.Plik, w ktrym definiowana jest klasa, powinien nosi tak sam nazw jak tabela reprezentowanaprzez t klas (w liczbie pojedynczej, a nie mnogiej). Klasa powinna nosi nazw zaczynajc si
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
22/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
92
sowem Table, po ktrym naley umieci nazw reprezentowanej tabeli (w liczbie pojedynczej,a nie mnogiej). Na przykad klasaJTable dla tabeli #__ojkoponent_foobars powinna nosi nazwTableFoobar i znajdowa si w plikufoobar.php.
W podstawowej implementacji klasy JTable pokrywa si zwykle dwie metody: __construct()
oraz check(). Ponadto dla kadego pola tabeli tworzy si zmienne instancji klasy.
Nie naley dodawa adnej zmiennej instancji klasy, ktra nie odnosi si do pola tabeli. Jeeli konieczne jestzdefiniowanie dodatkowych zmiennych instancji klasy, naley ich nazwy poprzedzi znakiem podkrelenia,co bdzie oznacza, e s one chronione.
Ponisza przykadowa klasa bdzie operowa na okrojonej wersji tabeli #__ojkoponent_foobars.
/**
* Klasa obsuguje 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('#__ojkoponent_foobars', 'id', $db);
/** * Czy dane s prawidowe? */
function check() { // sprawdzenie poprawnoci identyfikatora (warto int albo null)
if (!preg_atch('~^\d+$~', $this->id) || $this->id !== null) {$this->setError(JText::_('ID JEST NIEPRAWIDOWE'));
return false; // sprawdzenie poprawnoci pola foo
if(JString::tri($this->foo) == '') {$this->setError(JText::_('TABELA FOOBAR MUSI POSIADAm POLE FOO'));return false;
// wszystko w porzdku, dane s poprawne!
return true;
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
23/1265
Rozdzia 3. Praca z baz danych
93
Gdy gotowa jest ju konkretna implementacja klasy JTable, mona zacz jej uywa. Sposbdostpu do zaimplementowanej klasy zaley od tego, gdzie ma ona zosta wykorzystana. Jeelitworzony jest komponent MVC (co jest najczciej spotykanym przypadkiem), uywa si metodyJModel::getTable(). Metody JModel::getTable() zazwyczaj uywa si na poziomie modelu.Niemniej jednak naley pamita, e jest to metoda publiczna, dziki czemu mona j stosowa
rwnie z zewntrz.
class SoeModel extends JModel {...
function soeMethod() {$table =& $this->getModel('Foobar');...
Rozwizaniem alternatywnym jest bezporednie uycie metody JTable::getInstances().
$table =& JTable::getInstance('Foobar', 'Table');
Warto zwrci uwag na sposb, w jaki podano drugi parametr. Jest to prefiks nazwy tabeli, a jegodomyln wartoci jest JTable. Prefiks domylny jest uywany wzgldem niskopoziomowychimplementacji klasy JTable, takich jak klasaJTableUser.
Jak to dziaa?Konstruktor JTable przekazuje nazw tabeli, do ktrej klasa si odnosi, nazw klucza gwnegooraz obiekt DBO reprezentujcy konstruktor przodka klasy JTable. Metodacheck() pokrywa analo-
giczn metod przodka i suy do weryfikacji poprawnoci danych w zmiennych instancji klasy.Pokrywanie metody check() nie jest obowizkowe. W rzadkich przypadkach, gdy danych nieobowizuj adne reguy poprawnoci, metody check() nie trzeba pokrywa. Wprawdzie metodacheck() suy z zaoenia do ustalania poprawnoci danych, ale nic nie stoi na przeszkodzie, byw jej definicji modyfikowa rwnie dane, o ile modyfikacje te s stosunkowo nieskomplikowane.Przykadem takiego dziaania moe by skopiowanie wartoci do aliasu, jeeli warto aliasu niejest zdefiniowana.
Bardzo istotne jest prawidowe zrozumienie roli, jak peni metodacheck(). Metod wykonuje siprzed wprowadzeniem jakichkolwiek zmian w tabeli, czyli przed utworzeniem nowego albo
zmodyfikowaniem istniejcego rekordu. Rekordy tworzy si i uaktualnia przy uyciu metodyJTable::save() lub metody JTable::store(). Jeeli wykonywana jest metodaJTable::save(),rczne wywoywanie metody check() nie jest ju konieczne, poniewa zostanie ona wywoanaautomatycznie.
Zobacz rwnieNastpne cztery przepisy opisuj, jak tworzy si, odczytuje, zmienia i usuwa rekordy przy uyciuklasy JTable.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
24/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
94
Tworzenie nowego rekorduprzy uyciu JTable
Niniejszy przepis opisuje sposb tworzenia nowego rekordu w bazie danych przy uyciuobiektu klasy JTable. W przedstawionym przykadzie nadal uywana bdzie klasa JTable, zdefi-niowana w poprzednim przepisie. Dla celw niniejszego przepisu przyjto zaoenie, e dane, napodstawie ktrych zostanie utworzony nowy rekord, bd pochodzi z formularza przesanegometodPOST.
Jak si przygotowa?Najpierw trzeba utworzy obiekt klasy JTable. Wicej informacji na temat uzyskiwania instancji
klasy JTable przedstawiono w poprzednim przepisie.
Jak to zrobi?Najpierw trzeba pozyska dane, na podstawie ktrych ma by utworzony nowy rekord. Danebd powizane z obiektem JTable. Oznacza to, e wartoci bd skopiowane z tablicy do tabeli.Nie ma przy tym znaczenia, czy struktura, ktra zostanie powizana z obiektem JTable, zawierajakie dane, poniewa i tak bd one zignorowane przez obiekt JTable. W poniszym przykadziepobierana jest caa zawarto dania POST. Warto zwrci uwag, e poniewa do pobrania
zawartoci daniaPOST uywana jest metodaJRequest::get(), dane wejciowe pochodzcez tego dania zostan od razu zneutralizowane (wicej informacji na ten temat znajduje siw dalszej czci tego rozdziau).
// wartoci, z ktrych ma zosta utworzony nowy rekord$post = JRequest::get('POST');
Musimy si upewni, e warto polaid (czyli klucza gwnego) nie jest zdefiniowana tak, ebdzie rdem konfliktu w momencie tworzenia nowego rekordu. Dlatego polu id przypisanazostaje warto false. W ten sposb zyskujemy pewno, e rzeczywicie bdzie utworzony nowyrekord, a nie zmieniony rekord ju istniejcy.
// nie podajemy wartoci ID$post['id'] = false;
Ostatni krok polega na zapisaniu nowego rekordu przy uyciu metody JTable::save(). MetodaJTable::save() zwraca warto logiczn, ktra wskazuje, czy operacja si udaa, czy nie.
if (!$table->save($post)) { // nie udao si zapisa
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
25/1265
Rozdzia 3. Praca z baz danych
95
Jeeli wykonanie metody JTable::save() si nie powiedzie, mona sprbowa uy metodyJTable::getError(), aby uzyska tekstowe informacje o przyczynie bdu. Warto zauway, e niezawsze bd dostpne informacje o bdzie. MetodaJTable::save() wywouje szereg innych metod,w tym metod JTable::checkin(). Jeeli nie powiedzie si wykonanie metody JTable::checkin(),wwczas nie jest definiowany aden komunikat o bdzie!
Jak to dziaa?MetodaJTable::save() wykonuje komplet potrzebnych czynnoci. Mwic dokadniej, wywoy-wane s nastpujce czynnoci:
Q Zdefiniowanie powizania ze rdow tablic lub obiektem za pomoc metodyJTable::bind().
Q Weryfikacja poprawnoci danych przez metod JTable::check().Q Zapisanie danych metodJTable::store().Q Zatwierdzenie rekordu metodJTable::checkin().Q Uporzdkowanie rekordw metodJTable::reorder().
Podobnie jak w przypadku wakacyjnego wyjazdu all inclusive, rwnie nad procesem, ktry jestwykonywany caociowo, jak przez metod JTable::save(), nie ma si prawie adnej kontroli.Z tego powodu metodaJTable::save() nie zawsze jest najlepszym narzdziem. Analiza kodurdowego niektrych komponentw wykae, e nie zawsze korzystaj one z metody JTable::save(), a zamiast niej wszystkie potrzebne czynnoci wykonywane s po kolei. Wicej informacji
na ten temat znajduje si w nastpnym punkcie.
Informacje dodatkoweCzasami wymagany jest wikszy zakres kontroli nad danymi, ktre maj stanowi nowy rekord.Jeeli na przykad w danych znajduje si pole text, w ktrym mona przechowywa kod jzykaHTML, wwczas uycie zneutralizowanej zmiennej $post nie bdzie odpowiednim rozwiza-niem, poniewa wszelkie znaczniki HTML bd usunite. Aby uwzgldni ten fakt, naley samo-dzielnie przetworzy pole tak, aby utrzymane zostay w nim znaczniki HTML.
// pole foo moe zawiera warto oryginaln$post['foo'] = JRequest::getString('foo', '', 'POST',
JREQUEST_ALLOWRAW | JREQUEST_NOTRIM);
Przedstawione podejcie sprawdza si rwnie w sytuacji, gdy o przetwarzanych wartociachz gry wiadomo, e powinny by okrelonego typu. Jeeli na przykad wiadomo, e dana wartopowinna by liczb cakowit, mona uy metody JRequest::getInt(), aby mie gwarancj,e uzyskana warto rzeczywicie jest typu Integer. Wicej informacji na temat sposobw ko-rzystania z klasy JRequest znajduje si w rozdziale 2., w przepisie Bezpieczne pobieraniedanych z dania.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
26/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
96
Wizanie nie zawsze jest potrzebne
Zamiast przeprowadza wizanie z tablic lub obiektem, mona ustawi kady element oddzielnie za
pomoc metody JTable::set(). Jeeli uywana jest JTable::set(), wwczas w wywoaniu metodyJTable::save() naley przekaza pust tablic lub obiekt bdcy przedmiotem wizania.
W punkcie Jak to dziaa? powiedziano, e trzeci czynnoci, jak wykonuje metodaJTable::save(), jest wykonanie metody JTable::store(). To wanie metodaJTable::store() wykonujenajwaniejsz czynno, to znaczy wprowadza zmiany w bazie danych. Natomiast problemz metodJTable::save() polega na tym, e nie ma si nad ni prawie adnej kontroli.
Spjrzmy na przykad. MetodaJTable::store() posiada parametr, na podstawie ktrego monawskaza, czy uaktualniane maj by wartoci null. Gdy uywana jest metodaJTable::save(),z gry przyjmuje ona zaoenie, e wartoci null nie bd zmieniane. Moe to by jednak niepo-dane zachowanie, zwaszcza w przypadku tabeli, ktrej pewne pola mog zawiera wartoci null.Naley pamita, e metoda JTable::bind() nie moe ustanawia wizania z wartociami null.
Wykorzystanie metody JTable::reorder() rwnie jest w pewien sposb ograniczone. Domylniezakada si, e kolejno rekordw w tabeli jest wyznaczana wzgldem pola grupujcego i nie moeby definiowana jednoczenie w caej tabeli.
Definiowane komunikaty o bdach rwnie nie s specjalnie przydatne. Jeeli ktrakolwiekz metod wywoywanych przez JTable::save() si nie powiedzie, to nie powiedzie si wykonaniesamej JTable::save(). Jednak ustalenie, na ktrym etapie caego procesu pojawi si problem, jestbardzo trudne, a w niektrych przypadkach komunikat z informacj o bdzie w ogle nie zostanie
zdefiniowany!
Poniszy przykad stanowi implementacj bardziej kompletnego rozwizania. Aby atwiej byo jezrozumie, kady punkt, w ktrym obsugiwany jest bd, oznaczono komentarzem //bd. W takimpunkcie proces zostaje przerwany i konieczne jest obsuenie bdu.
// wartoci, ktre maj trafi do nowego rekordu$post = JRequest::get('POST');// nie definiujemy ID$post['id'] = false;// pole foo moe zawiera warto oryginaln
$post['foo'] = JRequest::getString('foo', '', 'POST', JREQUEST_ALLOWRAW |JREQUEST_NOTRIM);// powizanie $post z $tableif (!$table->bind($post)) { // bd// sprawdzenie poprawnoci danychif (!$table->check()) { // bd// zapisanie danych w tabeli bazy danych i uaktualnienie wartoci null
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
27/1265
Rozdzia 3. Praca z baz danych
97
if (!$table->store(true)) { // bd// zatwierdzenie rekorduif (!$table->checkin()) {
// bd
// uaktualnienie kolejnoci rekordw w tabeli (bez grupowania)if (!$table->reorder()) { // bd
Zobacz rwniePoprzedni przepis, Tworzenie tabeli JTable, pokazuje, jak tworzy si konkretn klas JTable.
Nastpne dwa przepisy opisuj sposb uaktualniania i wczytywania danych przy uyciu danejklasy JTable.
Modyfikacja rekordu przy uyciu JTableNiniejszy przepis opisuje metod modyfikowania rekordu ju istniejcego w bazie danychprzy uyciu obiektu klasy JTable. Na potrzeby przykadu bdzie uyta klasaJTable, zaimplemen-
towana w przedostatnim przepisie.
Jak si przygotowa?Najpierw trzeba utworzy obiekt JTable. Sposb tworzenia instancji obiektu JTable przed-stawiono w przedostatnim przepisie.
Jak to zrobi?Nietrudno zgadn, e modyfikowanie rekordu nie rni si specjalnie od operacji tworzeniarekordu. Tak naprawd nie rni si prawie niczym oprcz tego, e dodatkowo konieczne jestpodanie wartoci klucza gwnego zmienianego rekordu.
// wartoci, ktre maj zosta zapisane w istniejcym rekordzie// $post zawiera identyfikator ID modyfikowanego rekordu$post = JRequest::get('POST');if (!$table->save($post)) { // zapisanie danych si nie powiodo
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
28/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
98
Poniewa tworzenie i modyfikowanie rekordu przebiega bardzo podobnie, coraz czciej dy sido tego, by w ogle nie traktowa obydwch czynnoci oddzielnie. W komponencie MVC two-rzenie i modyfikowanie rekordu czsto jest realizowane przez jedn metod o nazwie edit().
Jak to dziaa?Wicej informacji przedstawiono w poprzednim przepisie, w punkcie Jak to dziaa?.
Informacje dodatkoweWicej informacji przedstawiono w poprzednim przepisie, w punkcie Informacje dodatkowe.
Odczytywanie istniejcego rekorduprzy uyciu JTableNiniejszy przepis opisuje sposb odczytywania zawartoci rekordu ju istniejcego w baziedanych przy uyciu obiektu JTable. Na potrzeby przykadu uyta bdzie klasa JTable, zaimple-mentowana w przepisie Tworzenie tabeli JTable.
Jak si przygotowa?Najpierw trzeba utworzy obiekt JTable. Sposb tworzenia instancji obiektu JTable przedstawionow przepisie Tworzenie tabeli JTable.
Jak to zrobi?Aby wczyta rekord z tabeli, uywa si metody JTable::load(). Metoda ta aduje rekord dozmiennych instancji klasy. Pierwszym i jedynym parametrem JTable::load() jest warto klucza
gwnego rekordu, ktry ma zosta wczytany. Metoda zwraca warto logiczn, dziki czemumoemy od razu sprawdzi, czy wykonanie metody zakoczyo si powodzeniem.
if ($table->load(JRequest::getInt('id'))) { // udao si!
Czasami identyfikator rekordu, ktry ma by wczytany, jest ju ustawiony w obiekcie. W takim przypadkudo metody JRequest::load() nie trzeba przekazywa wartoci klucza gwnego rekordu.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
29/1265
Rozdzia 3. Praca z baz danych
99
Wiemy ju, jak wczytuje si dane, ale gdzie one trafiaj i jak uzyskuje si do nich dostp? Jak juwiadomo, konkretna implementacja klasy JTable zawiera publiczne zmienne instancji, ktreodnosz si bezporednio do pl w tabeli reprezentowanej przez t klas. Dlatego gdy rekordzostanie ju zaadowany, pochodzce z niego dane mona uzyska metodJTable::get().
$jakiePole = $table->get('jakiePole');
Usuwanie rekordu przy uyciu JTableNiniejszy przepis opisuje, jak za pomoc obiektu JTable usuwa si rekord istniejcy w bazie da-nych. Na potrzeby przykadu bdzie uyta klasaJTable zaimplementowana w przepisie Two-rzenie tabeli JTable.
Jak si przygotowa?Najpierw trzeba utworzy obiekt JTable. Sposb tworzenia instancji obiektu JTable przed-stawiono w przepisie Tworzenie tabeli JTable.
Jak to zrobi?W przypadku usuwania danych najwaniejsza zasada mwi, e nie naley przywizywa siemocjonalnie do danych. Naprawd, przywizywanie si do danych moe by wrcz niezdrowe!A mwic powanie, do usuwania rekordw suy metodaJTable::delete(). Jeeli rekord jestju zaadowany, metod JTable::delete() mona wywoa bez koniecznoci podawania jakich-kolwiek parametrw usunie ona wwczas rekord biecy. Jeeli natomiast rekord nie zostazaadowany, do metody JTable::delete() mona przekaza parametr bdcy wartoci kluczagwnego rekordu, ktry ma by usunity z bazy.
if ($table->delete(JRequest::getInt('id'))) { // usunicie rekordu si powiodo
Usuwanie rekordu z tabeli, ktra jest powizana z innymi tabelami
Za pomoc metody canDelete() mona sprawdzi, czy istniej jakiekolwiek zalenoci, ktre naleyusun przed usuniciem samego rekordu. Do metody naley przekaza warto klucza gwnegorekordu, ktrego zalenoci trzeba sprawdzi, oraz tablic definiujc powizania tabeli, w ktrej tenrekord si znajduje.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
30/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
100
Blokowanie i odblokowywanie rekorduprzy uyciu JTable
Niniejszy przepis opisuje, jak za pomoc klasy JTable rcznie implementuje si mechanizmblokowania rekordu. Naley pamita, e tak zaimplementowany mechanizm jest nadzorowanyprzez system Joomla!, a nie serwer baz danych, dlatego serwer moe uniewani jego dziaanie.
Jak si przygotowa?Najpierw trzeba utworzy obiekt JTable. Sposb tworzenia instancji obiektu JTable przed-stawiono w przepisie Tworzenie tabeli JTable, we wczeniejszej czci tego rozdziau.
Rekordy mona blokowa jedynie wwczas, gdy tabela, w ktrej rekordy si znajduj, zawierapolachecked_out i checked_out_tie. Pierwsze pole wskazuje uytkownika, ktry zablokowa danyrekord, natomiast drugie pole przechowuje informacj o czasie zaoenia blokady na rekordzie.Typami pl na serwerze MySQL s, odpowiednio, INT UNSIGNED oraz DATETIME. Nasza przykadowatabela#__ojkoponent_foobarsposiada obydwa pola i dziki temu mona w niej blokowa rekordyprzy uyciu mechanizmu realizowanego przez klas JTable.
Jak to zrobi?Rekordy blokuje si wwczas, gdy rozpoczyna si edytowanie ich zawartoci. Gdy uytkownik naprzykad edytuje artyku w komponencie zarzdzania treci, rekord jest blokowany, aby adeninny uytkownik nie mg w tym czasie edytowa tego samego artykuu. Przed zablokowaniemrekordu trzeba najpierw sprawdzi, czy rekord nie zosta ju wczeniej przez kogo zablokowany.
// pobranie informacji o biecym uytkowniku$user =& JFactory::getUser();// zaadowanie rekordu$table->load($id);// sprawdzenie, czy rekord nie zosta ju wczeniej zablokowanyif ($table->isCheckedOut($user->get('id'))) { // kto nas uprzedzi!
Jeeli okae si, e rekord zosta ju wczeniej przez kogo zablokowany, standardow czynnocijest przekierowanie przegldarki do strony, na ktrej bdzie zaprezentowana zawarto rekordui wywietli si odpowiedni komunikat, informujcy, e rekord jest wanie edytowany przez kogoinnego.
Jeeli natomiast rekord nie bdzie zablokowany, w kolejnym kroku musimy go sami zablokowa.Do tego celu suy metodaJTable::checkout().
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
31/1265
Rozdzia 3. Praca z baz danych
101
// zablokowanie biecego rekordu$table->checkout($user->get('id'));
Gdy edycja rekordu zostanie zakoczona, naley rekord odblokowa. Czynno t wykonuje sizwykle wwczas, gdy uytkownik zapisa ju wprowadzone zmiany albo zrezygnowa z edy-
towania rekordu. Do odblokowywania rekordu suy metodaJTable::checkin().// odblokowanie biecego rekordu$table->checkin();
Informacje dodatkowePrzykadowy kod, przedstawiony w punkcie Jak to zrobi, prezentuje standardowy sposbuycia metody JTable::isCheckedOut() w odniesieniu do pojedynczego rekordu. W przypadku,gdy nie chcemy adowa rekordu do obiektu JTable (co jest przydatne wwczas, kiedy mamy do
czynienia z list elementw, i naley wywietli, ktre z nich zostay zaznaczone, a ktre nie), me-tod JTable::isCheckedOut() mona wywoa z drugim parametrem, ktrym bdzie warto polachecked_out. Metody tej mona uywa rwnie statycznie.
// pobranie informacji o biecym uytkowniku$user =& JFactory::getUser();// sprawdzenie, czy rekord nie zosta ju wczeniej zablokowanyif (JTable::isCheckedOut($user->get('id'), $checkedOut)) { // rekord jest zablokowany przez innego uytkownika
Metoda JTable::isCheckedOut() nie tylko wykonuje proste porwnywane wartoci, ale rwnie sprawdza,czy uytkownik, ktry zablokowa rekord, jest wci zalogowany.
Metod JTable::checkout() i JTable::checkin() mona uywa take wwczas, gdy rekord, ktrytrzeba zablokowa lub odblokowa, nie jest aktualnie zaadowany. W tym celu odpowiednimetod naley wywoa z opcjonalnym parametrem $oid. Parametr $oid wskazuje rekord, ktryma by zablokowany lub odblokowany. Aby na przykad zablokowa rekord, mona wykonanastpujc instrukcj:
// zablokowanie rekordu wskazanego przez $oid
$table->checkout($user->get('id'), $oid);
Natomiast do odblokowania rekordu suy nastpujca instrukcja:
// odblokowanie rekordu wskazanego przez $oid$table->checkin($oid);
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
32/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
102
Zmiana kolejnoci rekordwprzy uyciu JTable
Niniejszy przepis pokazuje, jak za pomoc klasy JTable definiuje si kolejno rekordw.Pierwszorzdnym przykadem mog by menu Joomla!, ktre administratorzy mog porzdkowaw dowolny sposb. Rysunek 3.4 pokazuje, jak okrela si kolejno menu w widoku administratora.Warto zwrci szczegln uwag na kolumn Porzdek.
Rysunek 3.4. Kolumna Porzdek wyznacza kolejno menu
Jak si przygotowa?Najpierw trzeba utworzy obiekt JTable. Sposb tworzenia instancji obiektu JTable przedstawio-no w przepisie Tworzenie tabeli JTable, we wczeniejszej czci tego rozdziau.
Uytkownikom mona zezwoli na zmian kolejnoci rekordw na podstawie indeksw licz-bowych jedynie wwczas, gdy w tabeli znajduje si pole ordering. Na serwerze MySQL poleordering jest typu INT UNSIGNED, zgodnie zreszt z definicj tabeli #__ojkoponent_foobars,przedstawion we wprowadzeniu do tego rozdziau.
Kolejno rekordw mona grupowa. Inaczej mwic, mona wskazywa rwnie inne pola tabeli,aby zdefiniowa, do ktrej grupy porzdkowej dany rekord naley. W wikszoci przypadkwporzdkowanie jest wykonywane na podstawie tylko jednego rekordu. W przykadowej tabeli#__ojkoponent_foobars, zdefiniowanej we wprowadzeniu do niniejszego rozdziau, grupowaniejest wykonywane wzgldem polacatid. Jeeli odniesiemy si do przykadowych danych przed-stawionych we wprowadzeniu, moemy zobaczy, w jaki sposb grupowanie wpywa na ko-lejno wartoci.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
33/1265
Rozdzia 3. Praca z baz danych
103
Jak to zrobi?Do obsugi porzdkowania rekordw su trzy metody klasy JTable. Pierwsza z nich to metodaJTable::getNextOrder(), ktra ustala kolejne dostpne miejsce. Zazwyczaj metod wywouje
si wwczas, gdy nowy rekord dodaje si na kocu listy. Poniszy przykadowy fragment kodusprawdza kolejne dostpne miejsce przy zaoeniu, e grupowanie jest wykonywane wzgldempolacatid i interesujca nas kategoria jest zdefiniowana przez $catid.
// przygotowanie grupowania$db =& JFactory::getDBO();$group = $db->naeQuote('catid') . ' = ' . intval($catid);// odczytanie nastpnego miejsca$next = $table->getNextOrder($group);
Czasami dany sposb porzdkowania rekordw staje si niespjny. Na przykad moe si zda-rzy, e na licie pojawi si puste miejsca albo konkretne pozycje zostan wykorzystane wicejni jeden raz. Aby usun wszelkie niespjnoci, naley wywoa metod JTable::reorder().Niespjnoci pojawiaj si czsto po usuniciu jakiego rekordu, a czasami take po dodaniunowego rekordu zamiast wywoania metody JTable::getNextOrder() w celu sprawdzenia, na ja-kiej pozycji rekord powinien si znale.
// przygotowanie grupowania$db =& JFactory::getDBO();$group = $db->naeQuote('catid') . ' = ' . intval($catid);// odczytanie nastpnego miejsca$next = $table->reorder($group);
Jak wida na rysunku 3.4, czsto si zdarza, e umoliwia si uytkownikowi przesuwanie rekor-dw w gr i w d za pomoc zielonych strzaek, dostpnych w kolumnie Porzdek. Do prze-suwania rekordw suy trzecia metodaJTable::ove(). Przesunicie rekordu w gr jest symbo-lizowane przez warto -1, natomiast przesunicie w d jest wyraane jako +1.
// przygotowanie grupowania$db =& JFactory::getDBO();$group = $db->naeQuote('catid') . ' = ' . intval($catid);// przesunicie biecego rekordu w gr o jedn pozycj$table->ove(-1, $group);
Metody JTable::ove() mona uy w jeszcze jeden, rzadziej spotykany sposb. Jeeli przesuni-cie rekordu zostanie wyraone wartoci0, mona zmieni pole stanowice podstaw sortowaniabiecego rekordu i wskaza wasn pozycj na posortowanej licie. Nie jest to jednak kompletnerozwizanie, poniewa nie przesuwa ono w odpowiedni sposb pozostaych rekordw (o ile takieprzesunicie jest wymagane).
Grupowanie metod sortowania nie zawsze jest potrzebne. Dotyczy to zwaszcza sytuacji, gdy nieistnieje aden logiczny element odrniajcy rekordy od siebie. W takich przypadkach parametr$group moe zosta w ogle pominity.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
34/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
104
Publikowanie i wycofywanie rekorduz publikacji przy uyciu JTable
Niniejszy przepis opisuje sposb, w jaki za pomocJTable publikuje si rekordy i wycofuje si jez publikacji. Podstawowy komponent Joomla! do zarzdzania treci jest najprostszym przykademnarzdzia, w ktrym za pomoc funkcji publikowania rekordu znajdujcego si w tabeli ste-ruje si jego widocznoci. Ekran tego komponentu przedstawiono na rysunku 3.5.
Rysunek 3.5. Publikowanie rekordw w Joomla!
Jak si przygotowa?Najpierw trzeba utworzy obiekt JTable. Sposb tworzenia instancji obiektu JTable przedstawionow przepisie Tworzenie tabeli JTable, we wczeniejszej czci tego rozdziau.
W Joomla! publikowanie to czynno, ktra polega na ustawieniu flagi, decydujcej o tym, czyrekord jest widoczny publicznie, czy nie. Precyzyjna definicja tego, czy co jest widoczne publicznie,zaley od tabeli zawierajcej dany rekord oraz moe take zalee od zakresu innych uprawnie.Publikowanie rekordw i wycofywanie rekordw z publikacji jest moliwe wycznie wwczas,gdy tabela zawiera pole published. Na serwerze MySQL pole published jest zdefiniowane jakoTINYINT(1) UNSIGNED. Warto 1 w tym polu oznacza, e rekord jest opublikowany, za 0 oznacza,e rekord nie jest opublikowany.
Jak to zrobi?W poniszym przykadowym kodzie nastpuje opublikowanie grupy rekordw na podstawiewartoci parametru cid pochodzcej z dania. W tym przypadku parametr cid jest tablic liczbcakowitych, ktre wyznaczaj identyfikatory jednego lub wikszej liczby rekordw znajdujcychsi w przedmiotowej tabeli. Wicej informacji na temat pobierania danych z dania znajduje siw rozdziale 2., w przepisie Bezpieczne pobieranie danych z dania.
// pobranie tablicy rekordw, ktre maj zosta opublikowane$cids = JRequest::getVar('cid', array(),'REQUEST', 'ARRAY');// opublikowanie rekordw$table->publish($cids);
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
35/1265
Rozdzia 3. Praca z baz danych
105
MetodaJTable::publish() jest inteligentniejsza, ni mogoby si na pocztku wydawa. Drugiparametr metody pozwala wskazywa, czy wykonywane jest publikowanie rekordw, czy terekordy s wycofywane z publikacji. Trzeci parametr z kolei przyjmuje warto identyfikatorauytkownika, dziki czemu mona oznaczy rekord jako zablokowany. Blokowanie rekordwjest w tym przypadku bardzo istotne, poniewa jeeli struktura tabeli pozwala na blokowanie
rekordw i ich odblokowywanie, to nie bdzie mona dokonywa publikacji ani wycofywaz publikacji tych rekordw, ktre bd zablokowane. Dziki podaniu identyfikatora uytkownikaw kryteriach wyboru rekordw uwzgldniany jest dodatkowo fakt, czy rekord zosta zablokowanyprzez innego uytkownika.
// pobranie tablicy rekordw, ktre maj zosta opublikowane$cids = JRequest::getVar('cid', array(),'REQUEST', 'ARRAY');// odczytanie danych biecego uytkownika$user =& JFactory::getUser();// wycofanie rekordw z publikacji$table->publish($cids, 0, $user->get('id'));
Niespodziewan, dodatkow czynnoci wykonywan przez metod JTable::publish() jest od-blokowywanie rekordw. Jeeli publikowany jest albo wycofywany z publikacji tylko jeden rekordi tabela posiada pole checked_out, to rekord zostanie odblokowany. Jeeli natomiast czynno jestwykonywana na liczbie rekordw wikszej ni jeden, wwczas odblokowanie nie bdzie miemiejsca.
Ramy czasowe publikacji
W takich komponentach, jak podstawowy komponent zarzdzania treci, zalecane jest podawanie okresu, przez
jaki dany artyku ma by opublikowany. Klasa JTable nie udostpnia jednak adnego mechanizmu, za pomocktrego mona by jawnie podawa okres publikacji artykuu. Stosunkowo atwo mona sobie jednak z tymporadzi. Wystarczy tylko zdefiniowa dwa pola typu DATETIME, ktre bd zawiera dat pocztku i datkoca okresu publikacji (zwykle rekordy te nosz nazwy odpowiednio publish_up oraz publish_down).
Zwikszanie licznika wywietle rekordu
przy uyciu JTableNiniejszy przepis prezentuje sposb uycia klasy JTable do zwikszania licznika wywietle re-kordu. Podstawowy komponent Joomla! do zarzdzania treci jest najprostszym przykadem na-rzdzia, w ktrym dziki licznikowi wywietle rekordu mona mierzy jego popularno.Na rysunku 3.6 wida, e najpopularniejszy jest artyku pod tytuem Joomla! Overview, po-niewa zosta wywietlony a 160 razy.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
36/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
106
Rysunek 3.6. Najpopularniejszy artyku by wywietlany 160 razy
Jak si przygotowa?Najpierw trzeba utworzy obiekt JTable. Sposb tworzenia instancji obiektu JTable przedstawio-no w przepisie Tworzenie tabeli JTable, we wczeniejszej czci tego rozdziau.
Rekordy mona publikowa i wycofywa z publikacji jedynie wwczas, gdy w tabeli znajduje sipole o nazwie hits. Na serwerze MySQL pole hits jest definiowane jako pole typu INT UNSIGNED.Przykadowa tabela #__ojkoponent_foobars umoliwia wic zaimplementowanie mechanizmupublikowania rekordw przy uyciu klasy JTable.
Jak to zrobi?Za kadym razem, gdy uytkownik wywietla rekord, wystarczy wywoa metod JTable::hit()
w nastpujcy sposb:// zwikszenie liczby wywietle biecego rekordu$table->hit();
Jeeli rekord, dla ktrego naley zwikszy licznik odwiedzin, nie jest aktualnie zaadowany,do metody JTable::hit() mona przekaza warto klucza gwnego tego rekordu.
// zwikszenie liczby wywietle$table->hit($id);
MetodaJTable::hit() zawiera rwnie opcj logowania wykonywanych czynnoci. Niestety, nie
zaimplementowano jeszcze odpowiedniej funkcji, ktra by z tej opcji korzystaa.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
37/1265
Spis treci
4
Rozdzia 3. Praca z baz danych 77
Wprowadzenie 77
Wykonywanie zapytania 80
adowanie pierwszej komrki ze zbioru wynikw zapytania 82
adowanie pierwszego rekordu z zapytania 84
adowanie wicej ni jednego rekordu z zapytania 87
Obsuga bdw DBO 89
Tworzenie tabeli JTable 91
Tworzenie nowego rekordu przy uyciu JTable 94
Modyfikacja rekordu przy uyciu JTable 97
Odczytywanie istniejcego rekordu przy uyciu JTable 98
Usuwanie rekordu przy uyciu JTable 99
Blokowanie i odblokowywanie rekordu przy uyciu JTable 100
Zmiana kolejnoci rekordw przy uyciu JTable 102
Publikowanie i wycofywanie rekordu z publikacji przy uyciu JTable 104
Zwikszanie licznika wywietle rekordu przy uyciu JTable 105
Rozdzia 4. Sesje i uytkownicy 107
Wprowadzenie 107
Pobieranie uchwytu sesji 108
Dodawanie danych do sesji 109
Pobieranie danych sesji 112
Sprawdzanie obecnoci danych w sesji 114
Sprawdzanie tokenu sesji 115
Pobieranie danych o uytkowniku 115
Sprawdzanie, czy aktualny uytkownik ma status gocia 117Odczytywanie imienia i nazwiska uytkownika oraz jego nazwy 118
Odczytywanie identyfikatora grupy uytkownika oraz typu uytkownika 120
Ograniczanie zakresu dostpu uytkownika przy uyciu poziomw dostpu Public,
Registered i Special 122
Odczytywanie wartoci parametrw uytkownika 124
Ustawianie wartoci parametrw uytkownika 126
Rozszerzanie i edytowanie parametrw uytkownika 127
Wysyanie wiadomoci poczty elektronicznej do uytkownika 131
Rozdzia 5. Jzyki narodowe 135
Wprowadzenie 135
Tworzenie tumaczenia 138
Tumaczenie wybranego tekstu 142
Sprawdzanie dugoci cigu znakw UTF-8 145
Usuwanie niewidocznych znakw UTF-8 z pocztku i koca cigu znakw 146
Porwnywanie cigw znakw UTF-8 148
Znajdowanie cigu znakw UTF-8 w innym cigu znakw UTF-8 149
Wykonywanie wyraenia regularnego na cigu znakw UTF-8 151
Odwracanie cigu znakw UTF-8 153
Wyodrbnianie cigu znakw z innego cigu znakw UTF-8 154
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
38/1265
Spis treci
5
Zastpowanie wystpie cigu znakw UTF-8 w innym cigu znakw UTF-8 155
Odczytywanie w cigu znakw UTF-8 znaku na wskazanej pozycji 157
Przeksztacanie cigu znakw z jednego standardu kodowania na inny 158
Tworzenie skryptu instalacji bazy danych uwzgldniajcego kodowanie UTF-8 159
Rozdzia 6. Interakcja z uytkownikiem i style 163Wprowadzenie 163
Odczytywanie parametrw strony i komponentu 164
Dodawanie do strony kaskadowego arkusza stylw CSS 166
Nadpisywanie szablonw w komponencie 168
Dodawanie kodu JavaScript na stronie 170
Tworzenie modalnego okna dialogowego 171
Generowanie treci modalnej 174
Uaktualnianie elementu przy uyciu Ajax i MooTools 176
Uaktualnianie elementu na podstawie formularza przy uyciu Ajax i MooTools 179
Przesyanie odpowiedzi Ajax z komponentu 181Wczanie stronicowania na licie elementw 184
Rozdzia 7. Dostosowywanie dokumentw 189
Wprowadzenie 189
Definiowanie tytuu dokumentu 191
Definiowanie generatora dokumentu 192
Definiowanie opisu dokumentu 192
Dodawanie metadanych do dokumentu 193
Zmiana zestawu znakw uywanego w dokumencie 194
Zmiana typu MIME dokumentu 196
Kontrola mechanizmu zapisywania odpowiedzi w pamici podrcznej klienta 198
Tworzenie dokumentu PDF w komponencie 200
Tworzenie kanau RSS lub Atom w komponencie 201
Zwracanie dokumentu w formacie RAW z komponentu 206
Uywanie wasnego dokumentu JDocument w komponencie (dotyczy wycznie PHP5) 208
Rozdzia 8. Dostosowywanie elementw standardowych 215
Wprowadzenie 216
Wyczanie paska menu 216
Ustawianie tytuu i ikony paska narzdziowego 218
Dodawanie do paska narzdziowego przycisku operujcego na jednostce danych 219Dodawanie do paska narzdziowego przycisku operujcego na zestawie danych 222
Dodawanie wasnych przyciskw do paska narzdziowego 224
Dodawanie odstpw i separatorw na pasku narzdziowym 227
Dodawanie systemu pomocy do komponentu 228
Tworzenie nagwka filtru dla danych tabelarycznych w komponencie MVC 230
Filtrowanie danych tabelarycznych w komponencie MVC 234
Tworzenie nagwkw kolumn sterujcych sortowaniem danych tabelarycznych
w komponencie MVC 238
Porzdkowanie danych tabelarycznych w komponencie MVC 240
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
39/1265
Spis treci
6
Rozdzia 9. Utrzymywanie rozszerzalnoci i modularnoci 243
Wprowadzenie 244
adowanie moduw dodatkowych 245
Wywoywanie moduu dodatkowego 247
Tworzenie dodatkowego moduu w systemie Joomla!, realizujcego wyszukiwanie 248
Tworzenie wasnej biblioteki i funkcji importujcej 254
Instalowanie moduu dodatkowego z poziomu kodu rdowego
w trakcie instalacji komponentu 257
Prosty sposb zarzdzania kategoriami 260
Definiowanie parametrw JParameter przy uyciu jzyka XML 262
Tworzenie obiektu JParameter 265
Renderowanie obiektu JParameter 266
Zapisywanie danych JParameter 268
Odczytywanie i ustawianie wartoci obiektu JParameter 269
Definiowanie wasnego typu JParameter 271
Rozdzia 10. Obiekty JObject i tablice 275
Wprowadzenie 275
Odczytywanie waciwoci JObject 278
Odczytywanie wszystkich publicznych waciwoci JObject 279
Ustawianie waciwoci JObject 280
Ustawianie zbioru waciwoci JObject 281
Raportowanie bdu w JObject 281
Pobieranie bdu z JObject 283
Pobieranie wszystkich bdw z JObject 284
Przeksztacanie obiektu w tablic 285Przeksztacanie tablicy w obiekt 287
Odczytywanie kolumny z tablicy wielowymiarowej 288
Odczytywanie wartoci z tablicy 289
Rzutowanie wszystkich elementw tablicy na liczby cakowite 291
Sortowanie tablicy obiektw 292
czenie elementw tablicy 293
Rozdzia 11. Obsuga i raportowanie bdw 297
Wprowadzenie 297
Zgaszanie bdu J!error 299
Zgaszanie ostrzeenia J!error 301
Zgaszanie informacji J!error 304
Kolejkowanie komunikatu 306
Zmiana domylnego sposobu obsugi bdw J!error 308
Obsuga i zgaszanie dedykowanych bdw J!error 311
Zapisywanie bdw i zdarze przy uyciu JLog 314
Rzucanie wyjtkw w PHP5 316
Przechwytywanie wyjtkw w PHP5 319
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
40/1265
Spis treci
7
Rozdzia 12. Pliki i foldery 323
Wprowadzenie 323
Sprawdzanie, czy plik lub folder istnieje 325
Odczytywanie pliku 327
Usuwanie pliku lub folderu 329
Kopiowanie pliku lub folderu 331
Przenoszenie i zmiana nazwy plikw i folderw 332
Tworzenie folderu 334
adowanie plikw do systemu Joomla! 336
Odczytywanie struktury katalogw 340
Zmiana uprawnie do pliku i folderu 343
Skorowidz 345
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
41/1265
3
Praca z baz danych
Ten rozdzia zawiera nastpujce przepisy:
Q Wykonywanie zapytaniaQ adowanie pierwszej komrki ze zbioru wynikw zapytaniaQ adowanie pierwszego rekordu z zapytaniaQ adowanie wicej ni jednego rekordu z zapytaniaQ Obsuga bdw DBOQ Tworzenie tabeli JTableQ Tworzenie nowego rekordu przy uyciu JTableQ Modyfikacja rekordu przy uyciu JTableQ Odczytywanie istniejcego rekordu przy uyciu JTableQ Usuwanie rekordu przy uyciu JTableQ Blokowanie i odblokowywanie rekordu przy uyciu JTableQ Zmiana kolejnoci rekordw przy uyciu JTableQ Publikowanie i wycofywanie rekordu z publikacji przy uyciu JTableQ Zwikszanie licznika wywietle rekordu przy uyciu JTable
WprowadzenieWikszo danych Joomla! jest przechowywanych w bazie danych. Dotyczy to midzy innymigwnych rozszerze, a take rozszerze pochodzcych od dostawcw zewntrznych. Joomla!czsto jest okrelana mianem aplikacji PHP i MySQL. Rzeczywicie, Joomla! korzysta z serweraMySQL, lecz architektura systemu pozwala na uycie rwnie innych serwerw baz danych.Aktualnie wersja 1.5 oficjalnie obsuguje jedynie bazy danych MySQL.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
42/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
78
Nazwy wszystkich tabel w bazie danych Joomla! rozpoczynaj si od okrelonego prefiksu.Posta prefiksu jest ustalana globalnie dla caej instalacji systemu, dlatego w odwoaniach do tabelzawsze trzeba uywa prefiksu zdefiniowanego dla konkretnej instalacji. Na szczcie prefiksu nietrzeba definiowa samodzielnie. Wyobramy sobie, e prefiksem jest jos i istnieje tabela o nazwiejos_ojkoponent_foobars. Zamiennikiem dla prefiksu jest cig znakw #_, dziki czemu nazw
tabeli mona wyrazi w nastpujcy sposb:
#__ojkoponent_foobars
Obiektem, ktrego uywa si najczciej do interakcji z baz danych, jest globalny obiekt DBO(Database Object). Jest on uzyskiwany przy wykorzystaniu klasy JFactory. Warto zaznaczy, e doprzypisania obiektu zmiennej naley uy operatora=&. Jeeli operator ten nie bdzie uyty,a wersja jzyka PHP bdzie nisza ni 5, utworzona zostanie jedynie kopia obiektu DBO.
$db =& JFactory::getDBO();
Bezpieczestwo a kod SQL
W trakcie tworzenia zapyta SQL trzeba zachowa szczegln ostrono, poniewa bardzo atwo jest narazisi na niebezpieczestwo. Wicej informacji na temat tworzenia bezpiecznych zapyta SQL znajduje si
w przepisach dotyczcych jzyka SQL, w rozdziale 2.
Na potrzeby niniejszego przykadu w kadym przepisie uywana bdzie tabela zdefiniowana jakotabela 3.1. Oczywicie, nie oznacza to, e w kadym przepisie tabela bdzie uywana w caoci w odpowiednich przypadkach bdziemy bazowa wycznie na okrelonych zbiorach danychz tej tabeli.
Oprcz zdefiniowanej tabeli bdziemy uywa rwnie przykadowych danych, wskazanychw tabeli 3.2.
Aby utworzy tabel do celw testowania, najlepiej jest pobra archiwum przykadowych kodwzwizanych z t ksik, dostpne na stronie wydawnictwa Helion, pod adresemftp://ftp.helion.pl/przyklady/jo15od.zip.
Przeznaczenie pola paras nie jest w tym rozdziale wyjaniane. Pole to suy do rozszerzania bazy danych
poza jej pierwotn struktur. Wicej informacji na ten temat mona znale w przepisie dotyczcymobiektw JParaeter i JEleent, w rozdziale 9., Utrzymywanie rozszerzalnoci i modularnoci.
Jedn z najbardziej rozbudowanych klas udostpnianych przez Joomla! jest klasaJTable. Abstrak-cyjna klasaJTable umoliwia zaimplementowanie w krtkim czasie interfejsu dla kadej z tabelznajdujcych si w bazie danych. Oprcz standardowych elementw, ktre zwykle wchodzw skad tego typu klas, JTable udostpnia ca gam metod, za pomoc ktrych bez trudu im-plementuje si funkcje najczciej wykonywane w Joomla!, takie jak choby blokowanie re-kordw. Ponisza lista prezentuje wbudowane funkcje udostpniane przez klas JTable:
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
43/1265
Rozdzia 3. Praca z baz danych
79
Tabela 3.1. Definicja tabeli #__mojkomponent_foobars bazy danych na potrzeby przepisw w niniejszym rozdziale
Pole TypNOTNULL
Autoincrement
Unsigned Opis
id int(11) TAK TAK TAK Klucz gwny.
foo varchar(100) TAK Oglne pole tekstowe,ktre nie moe by puste.
bar varchar(100) Oglne pole tekstowe, ktre moe by puste.
checked_out int(11) TAK TAK Uytkownik, dla ktrego rekord zostazablokowany.
checked_out_tie
datetie TAK Czas zablokowania rekordu.
ordering int(11) TAK TAK Pozycja, na ktrej powinien znajdowa siten rekord w grupie rekordw.
published tinyint(1) TAK TAK Wskazuje, czy rekord jest opublikowany.hits int(11) TAK TAK Liczba wywietle rekordu.
catid int(11) TAK Klucz obcy do tabeli kategorii.
paras text TAK Dodatkowe parametry.
Tabela 3.2. Przykadowe dane dla przepisw z niniejszego rozdziau
id foo bar checked_out checked_out_time ordering published hits catid params
100 NULL 0 0000-00-00 00:00:00 4 1 13 1
101 Lorem NULL 0 0000-00-00 00:00:00 3 1 43 1
102 ipsum NULL 0 0000-00-00 00:00:00 1 1 72 1
103 dolor NULL 62 2009-03-11 11:18:32 2 1 55 1
104 sit NULL 0 0000-00-00 00:00:00 1 0 0 2
105 amet NULL 0 0000-00-00 00:00:00 2 1 49 2
Q Wizanie kopiowanie danych z tablicy lub obiektu do obiektu JTable.Q XML prezentowanie rekordu w formacie XML.Q
Zarzdzanie rekordami tworzenie, odczytywanie, modyfikacja i usuwanie rekordw.Q Weryfikacja poprawnoci sprawdzanie, czy dane w rekordzie odpowiadaj
zestawowi zdefiniowanych regu poprawnoci.
Q Blokowanie zapobieganie edycji danego rekordu jednoczenie przez wicej nijednego uytkownika.
Q Wyznaczanie kolejnoci porzdkowanie rekordw zgodnie z preferencjami uytkownika.Q Publikowanie udostpnianie rekordu na widok publiczny lub jego wycofywanie
z publikacji.
Q Zliczanie wywietle rejestrowanie liczby wywietle rekordu.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
44/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
80
W tym rozdziale wyjanimy, jak tworzy si konkretn implementacj JTable. Ponadto pokazanezostanie, jak korzysta si z poszczeglnych funkcji opisanych powyej.
Zarzdzanie rekordami bazuje na paradygmacie CRUD, ktry stanowi skrt od angielskich nazwczynnoci wykonywanych na rekordach: Create (tworzenie), Read (odczytywanie), Update (mody-
fikowanie) i Delete (usuwanie). Cztery czynnoci skadajce si na paradygmat CRUD wyznaczaj jednoczenie cykl ycia elementu przechowywanego w staej skadnicy danych. Cykl ycia ele-mentu wraz ze schematem CRUD przedstawiono na rysunku 3.1. W kontekcie JTable i CRUDskadnic danych jest baza danych, natomiast elementem jest rekord przechowywany w jednejlub wicej tabel tej bazy albo, mwic precyzyjniej, w tabeli reprezentowanej przez dany obiektklasy JTable.
Rysunek 3.1. Paradygmat CRUD i cykl ycia rekordu
Czasami moe by do trudno zrozumie cel klasy JTable oraz sposb, w jaki wpasowuje si onaw komponent MVC systemu Joomla!, zwaszcza jeli ju posiada si model oraz dostp do bazydanych za porednictwem DBO. Aby lepiej zrozumie kontekst, najlepiej jest myle o JTablejak o kolejnej warstwie abstrakcji midzy programist a baz danych. Dziki JTable unika sikoniecznoci operowania na nieprzetworzonych danych.
Wykonywanie zapytaniaNajbardziej podstawow spord wszystkich metod klasy JDatabase sucych do wykonywaniazapytania jest metodaJDatabase::query(). Metody tej uywa si jedynie wwczas, gdy wykony-wane zapytanie nie zwraca adnego zbioru wynikowego, poniewa metoda zwraca odpowiedziw postaci nieprzetworzonej. Jeeli na przykad pomylnie zostanie wykonane zapytanie SELECT,metoda zwrci zasb z danymi wynikowymi. Trudno si jednak spodziewa, by jakikolwiek
programista chcia rcznie operowa na zasobie!
Kiedy wic uywa si metody JDatabase::query()? Mwic najprociej, uywa si jej wwczas,gdy wynikiem zapytania jest warto logiczna, czyli gdy wynikiem bdzie informacja, czy wy-konanie si powiodo, czy nie. Poniej znajduje si lista rodzajw zapyta na danych, ktremona wykonywa przy uyciu metody JDatabase::query():
Q DELETEQ INSERT
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
45/1265
Rozdzia 3. Praca z baz danych
81
Q RENAMEQ REPLACEQ 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, ktre ma zosta wykonane. Poniszy przykadtworzy proste zapytanie DELETE, ktre usunie wszystkie rekordy z tabeli #__ojkoponent_foobars z wartociordering wiksz ni 4:
// przygotowanie nazw$tableNae = $db->naeQuote('#__ojkoponent_foobars');$colunNae = $db->naeQuote('ordering');// sformuowanie zapytania DELETE$sql = "DELETE FROM $tableNae " .
. "WHERE $colunNae > 4 ";
Przed wykonaniem zapytania trzeba wskaza obiektowi DBO, gdzie to zapytanie si znajduje. Brzmiprzystpnie i rzeczywicie jest to prosta czynno, ale bardzo czsto si o niej zapomina:
$db->setQuery($sql);
Na koniec pozostaje ju tylko wykona zapytanie.
if ($db->query()) { // zapytanie si powiodo else { // zapytanie si nie powiodo
Poniewa wiemy, e wynikiem zapytaniaDELETE zawsze bdzie warto true lub false, nic nie
stoi na przeszkodzie, by na podstawie wartoci zwrconej przez metod JDatabase::query()oceni, czy wykonanie zapytania si powiodo, czy nie. Wicej informacji na ten temat monaznale w przepisie Obsuga bdw DBO, w dalszej czci tego rozdziau.
Informacje dodatkoweGdy zapytanie zostanie ju pomylnie wykonane, przydatn metod moe si okaza metodaJDatabase::getAffectedRows(). Metoda ta zwraca liczb rekordw, ktre byy przedmiotemostatnio wykonywanego zapytania.
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
46/1265
Joomla! 1.5 od kuchni. Ponad 130 przepisw!
82
// zapytanie si powiodo$affectRowCount = $db->getAffectedRows();// wywietlenie potwierdzeniaecho JText::sprintf('USUNI}TO %u REKORDY(W)', $affectRowCount);
Zobacz rwnieKolejne trzy przepisy, adowanie pierwszej komrki ze zbioru wynikw zapytania, ado-wanie pierwszego rekordu z zapytania oraz adowanie wicej ni jednego rekordu z zapytania,prezentuj sposoby wykonywania zapytaniaSELECT i pobierania danych zwrconych przezto zapytanie.
adowanie pierwszej komrkize zbioru wynikw zapytaniaCzasami wykonywane zapytania s bardzo proste i maj na celu odczytanie wycznie jednejwartoci. Przykadem moe by odczytywanie za pomoc funkcji COUNT() liczby rekordw, ktrepasuj do zadanych kryteriw, albo sprawdzanie wartoci jednej kolumny w rekordzie, ktregoidentyfikator jest dany. W takich przypadkach nie ma potrzeby pobierania caych, zoonychzbiorw danych, aby odczyta interesujc nas warto. KlasaJDatabase udostpnia prosty i szybkisposb odczytywania pierwszej wartoci z pierwszego rekordu ze zbioru danych.
Jak si przygotowa?Aby odczyta pojedyncz warto, naley utworzy instancj obiektu DBO Joomla!.
$db =& JFactory::getDBO();
Jak to zrobi?
Najpierw trzeba przygotowa zapytanie. W poniszym przykadzie za pomoc funkcji agregujcejCOUNT() ustala si liczb rekordw w tabeli #__ojkoponent_foobars.Jest to modelowa sytuacja,w ktrej odczytywana jest tylko jedna warto.
// przygotowanie nazw$tableNae = $db->naeQuote('#__ojkoponent_foobars');// sformuowanie zapytania COUNT$sql = "SELECT COUNT(*) FROM $tableNae";
Zanim zapytanie bdzie mona wykona, trzeba je wskaza obiektowi DBO.
$db->setQuery($sql);
8/3/2019 joomla! 1.5 od kuchni. ponad 130 przepisw! ebook
47/1265
Rozdzia 3. Praca z baz danych
83
Na koniec pozostaje wykona zdefiniowane zapytanie.
$total = $db->loadResult();
Jeeli przykadowe zapytanie bdzie wykonane na tabeli zdefiniowanej we wprowadzeniu doniniejszego rozdziau,
Top Related