Tato návštěvní kniha využívá moderních technologií jako je PHP a mySQL. Bude zde možnost pro zasílání novinek na e-mail, smajlíci a snadná změna vzhledu. Napíšeme si i malého správce této knihy a pro ty kdo PHP neovládají bude v závěrečné části připraven hotový archiv s instalátorem.
Kniha se bude skládat z 6 php souborů a jednoho souboru kaskádových stylů. Budu postupovat podle souborů, i když sami o sobě nebudou zpočátku fungovat. Začnu tím největším - gbook.php - a dál se v tomto článku ani nedostanu. Nemějte však strach, další soubory jsou už podstatně kratší.
Začínáme
*Zdrojové kóody byly odstraněny, prosím stáhněte si archiv se zdrojovými kódy z druhého dílu tohoto tutoriálu.
Zde jsme vytvořili začátek HTML básničky, napsali titulek a odeslali hlavičky - k tomu snad není co dodat. Inkludovaný soubor nastaveni.php vytvoříme v dalším díle, obsahuje přístupové údaje k mySQL serveru, heslo k administraci atd. V závěru se připojíme k databázi.
Formulář a JavaScript
*Zdrojové kóody byly odstraněny, prosím stáhněte si archiv se zdrojovými kódy z druhého dílu tohoto tutoriálu.
Nyní vytvoříme formulář pro přidávání příspěvků. Je zde autor,mail, možnost zasílání novinek, domovská stránka a samotný příspěvek. Formulář nesměrujeme na žádny externí skript, protože bude zpracováván přímo tímto souborem. Následuje krátký JavaScript, který jsem někde obšlehnul, protože tento jazyk neumím. Slouží k vkládání značek do určité kolonky. Všimněte si řádku kde je deklarována funkce. Je zde ,,document.form.prispevek...." což reprezentuje ,,document.název_formuláře.název_kolonky...." Odkazy obsahují také něco málo z JavaScriptu, to proto, že slouží právě k vkládání značek. V závorce za add_smile jak jsme tuto funkci pojmenovali je mezi apostrofy značka která bude vložena do kolonky. Na konci je tlačítko, sloužící k odeslání.
Ošetření uživatelského vstupu
*Zdrojové kóody byly odstraněny, prosím stáhněte si archiv se zdrojovými kódy z druhého dílu tohoto tutoriálu.
Tady si vytvoříme dvě pole. Jedno bude obsahovat všechny značky, které jsme předtím dali uživatelům prostřednictví odkazů a druhé obsahuje HTML tagy, které tyto značky nahradí. Funkce strip_tags nás zbaví případných HTML tagů, které by mohl uživatel vložit. Funkce str_replace nám nahradí znacky tagama v řetězci html.
Závěrečné testy, odesílání příspěvku a mailu
*Zdrojové kóody byly odstraněny, prosím stáhněte si archiv se zdrojovými kódy z druhého dílu tohoto tutoriálu.
Nyní otestujeme jestli byly vyplněny povinné položky příspěvek a autor - za předpokladu že bylo stisknuto tlačítko odeslat. Pokud je tato podmínka splněna, očistíme od případných nebezpečných značek i ostatní položky formuláře, zjistíme si aktuální datum a vše zapíšeme do databáze. Poté otestujeme zda si uživatel přeje odebírat novinky + samozřejmě jestli zadal e-mail. Pokud jsou tyto podmínky vyhodnoceny jako pravdivé, zapíšeme navíc do tabulky mailing uživatelovo e-mail. Hned potom si načteme data z tabulky mailing (s parametrem distinct aby jsme někomu kdo si omylem vícekrát přidal svůj mail neposílali duplicitní informace) a pomocí cyklusu while odešleme všem z tabulky mailing informační mail, že byl přidán nový příspěvek. Tímto jsme dosáhli toho, že bezprostředně po každým vložení nového příspěvku budou odeslány informační e-maily. Před odesláním ještě převedeme text mailu z UTF-8 do ISA 8859-2 (funkce iconv), protože s UTF-8 jsem měl z mě neznámého důvodu problémy s diakritikou v některých web-mailech. Samotná funkce mail má jako parametr příjemce, dále předmět, samotný text a hlavičky mailu kde nastavíme odesílatele proměnou, za kterou bude později díky souboru nastaveni.php dosazen E-mail provozovatele, tedy Vás. Funkce mail odesílá pouze čistý text, a proto nemá smysl odesílat html tagy - těch se tedy zbavíme. Na konec mailu dáme uživateli odkaz na soubor zrusit.php s parametrem odpovídajícím jeho mailu, aby se mohl z této informační služby odhlásit.Na konci vypíšeme tabulku s hlášením, pokud vše proběhne v pořádku.
Chybné vyplnění formuláře a stránkování.
*Zdrojové kóody byly odstraněny, prosím stáhněte si archiv se zdrojovými kódy z druhého dílu tohoto tutoriálu.
Teď ještě vyřešíme případ, když se uživatel nepodepíše nebo nepošle žádný příspěvek. V tom případě vypíšeme hlášení ve kterém uživatele informujeme, že o takový příspěvek nestojíme a díky tomu, že jsme ve formuláři nastavili výchozí hodnoty na proměnné odeslané formulářem, formulář se vyplní původními hodnotami. Z toho vyplývá, že pokud se někdo omylem nepodepíše a odešle svůj příspěvek, jeho text nebude ztracen, pouze dopíše jméno a odešle formulář znovu.
Teď se dostáváme k samotnému výpisu příspěvků. Protože se nechceme do budoucna dostat do situace, kdy by bylo na jedné stránce třeba 200 příspěvků, napíšeme si pro naší knihu stránkování - tím si bohužel trošku prodloužíme práci, ale není to nic hrozného. Nejdříve provedeme dotaz na databázi s parametrem count, čímž získáme celkový počet záznamů. Toto číslo vydělíme proměnou (počet příspěvků na stránku), kterou později zadáme v již několikrát zmíněném souboru nastaveni.php. Toto celé ještě proženeme funkcí ceil, která nám výsledek zaokrouhlí. Poté pomocí cyklusu for vypíšeme odkazy jednotlivých stránek a pomocí podmínky if zajistíme, aby se na prohlížené stránce nevypisoval odkaz, ale prostý text. Nebudu přesně popisovat, jak to celé funguje, myslím že to je ze zdrojového kódu celkem jasné, důležité je, že odkazy budou odkazovat na tento soubor, čili gbook.php ale deklarují zde navíc proměnou strana, podle které budeme limitovat výpis příspěvků. Uvědomte si že LIMIT sql dotazu je dán způsobem: pocatecni_polozka,pocet_polozek a proto nemá smysl generovat proměnou strana se stejnými hodnotami jako je číslo stránek - čili 0,1,2,3,... . Vynásobíme-li však tato čísla počtem příspěvků na jednu stránku, můžeme už tuto proměnou použít v limitu. Zbytek už je jasný, samotný výpis pomocí cyklusu while. V každé iteraci zkrátka vytvoříme jednu řádku tabulky s daty z databáze přičemž vždy testujeme, zda uživatel zadal WWW stránku a E-mail a podle toho vypíšeme příslušné řetězce. Dolů jsem navíc nakopíroval znovu stránkovací cyklus (Tentokrát však už bez dotazu na databázi !) pro větší pohodlnost.
nekomentováno