joomla! 1.5 od kuchni. ponad 130 przepisów! ebook

Upload: krzys90

Post on 06-Apr-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 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,