spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Róbert Balaško 9.8.2011
Hodnoť článok:
0 0

Dynamická stránka s PHP include (pre absolútnych začiatočníkov s PHP)

Každého z nás, ktorí robíme webové stránky, a hlavne tých z nás, ktorí začali len nedávno, určite zaujíma, či sa obyčajná statická stránka v HTML dá nejak vylepšiť tak, aby s ňou nebolo toľko roboty (zmena rovnakých údajov na mnohých stránkach...).

Úvod

Každého z nás, ktorí robíme webové stránky, a hlavne tých z nás, ktorí začali len nedávno, určite zaujíma, či sa obyčajná statická stránka v HTML dá nejak vylepšiť tak, aby s ňou nebolo toľko roboty (zmena rovnakých údajov na mnohých stránkach...). Je vhodné robiť statické stránky do tých, povedzme 5 podstránok. Tých 5 podstránok je vhodných preto, že keď si napr. dáte nejakých 10 linkov na jednu a potom zistíte, že by ste ich radi mali aj na ostatných piatich, je dosť možné, že pri úprave piatich podstránok si ešte nevytrháte vlasy a hravo to zvládnete. Predstavte si ale, že by ste takto mali pridať tie isté odkazy na 20 stránok, čo potom? Potom už radšej prejdete na dynamický web, avšak, existuje mnoho stránok, ktoré aj pri takýchto, ba možno aj vyšších počtoch stránok stále fungujú staticky.

Už dlhú dobu je tu pre nás PHP, ktoré nám poskytuje možnosti, ktorými je možné robiť naše stránky dynamickými, no a preto si dnes o jednom zo spôsobov, ako urobiť svoju statickú stránku dynamickou, povieme.

PHP include

Z angličtiny vieme, že slovo „include“ v slovenčine znamená zahŕňať, obsahovať atď., čiže tento kód v podstate do stránky, v ktorej je vložený zahrnie obsah určitého súboru. Lepšie však bude, keď si funkciu PHP include vysvetlíme na nejakom praktickom príklade.

Máme vytvorený súbor index.php, ktorý má nejakú hlavičku, menu, sidebar a footer.

<div id="header">
    <h1>Nadpis stránky</h1>
</div>
    <ul id="navigation">
        <li><a href="#">Nav link 1</a></li>
        <li><a href="#">Nav link 2</a></li>
        <li><a href="#">Nav link 3</a></li>
    </ul>
<div id="content">
    <p>Obsah stránky</p>
</div>
<div id="sidebar">
    <ul id="partners">
        <li><a href="#">Partner 1</a></li>
        <li><a href="#">Partner 2</a></li>
        <li><a href="#">Partner 3</a></li>
    </ul>
</div>
<div id="footer">
<p>
    Copyright © 2009 - 2011 Firma s.r.o.
</p>
</div>

My potrebujeme, aby sme mali na každej stránke rovnaké menu, sidebar a footer. Najprv si musíme vytvoriť tri súbory, osobitne pre každú časť stránky, ktorú chceme includovať. Vytvoríme si teda súbory navigation.php, sidebar.php a footer.php.

Začnime navigáciou. Potrebujeme, aby sa nám linky nášho menu zobrazovali medzi značkami elementu ul, čiže všetkých potomkov (li elementy a ich priamich potomkov a elementy) skopírujeme do súboru navigation.php, ktorý by teraz mal obsahovať toto:

<li><a href="#">Nav link 1</a></li>
<li><a href="#">Nav link 2</a></li>
<li><a href="#">Nav link 3</a></li>

A teraz miesto elementov li a a do elementu ul vložíme náš php include kód v tomto tvare:
<?php include('navigation.php'); ?>.

Náš kód by mal teraz vyzerať nasledovne:

<ul id="navigation">
    <?php include('navigation.php'); ?>
</ul>

Po uložení a spustení súboru vidíme ako nám PHP-čko pekne naincludovalo naše menu linky do úvodnej stránky (index.php).

A teraz si týmto istým spôsobom naincludujeme aj ostatné časti stránky, ktkoré potrebujeme mať dynamické. Postup by vám už mal byť známy, ale pre istotu pridávam kód pre všetky časti stránky.

Include pre sidebar

V našom prípade máme v sidebar-e vložený jeden netriedený zoznam, ktorý je potomkom elementu div s id sidebar, ktorý drží celý náš bočný panel pokope. Čiže, vytvoríme si subor sidebar.php, do ktorého teraz nevložíme len li elementy z netriedeného zoznamu, ale celý netriedený zoznam! Možno sa niekto pýta prečo? Lebo keby sme tam element ul nechali a potom doň náš php include vložili, celý obsah súboru sidebar.php by sa includoval medzi tagy elementu ul, čiže celý sidebar by bol jeden netriedený zoznam a to my nechceme. Teraz by náš kód v súbore index.php mal vyzerať nasledovne:

<div id="sidebar">
    <?php include('navigation.php'); ?>
</div>

Teraz, keď máme v našom navigation.php súbore vložený náš netriedený zoznam, skúsme si tam pridať ešte nejaký div s textom a triedený zoznam ol. A po stustení nám to PHP-čko znova pekne naincluduje do stránky.

No a nakoniec, týmto istým spôsobom vytvoríme aj include pre footer:

<div id="footer">
    <p><?php include('footer.php'); ?></p>
</div>

Keď máme toto všetko hotové a všetko nám funguje ako má, skúste vytvoriť ďalšiu stránku, napr. navlink2.php a v súbore navigation.php na ňu do druhého linku pridajte odkaz. Čo sa stalo? Odkaz na súbor navlink2.php teraz nájdete na každej stránke, ktorá ma includovaný súbor navigation.php ako menu. Tým pádom sme sa dopracovali k výsledku tohto tutoriálu, či si už vytvoríte takto stránku s dvomi alebo dvadsiatimi podstránkami, veci, ktoré máte v každej z nich includované pomocou PHP, budete meniť v požadovanom súbore už LEN RAZ, o zvyšok sa postará dynamika :).

Nakoniec ešte jeden screencast ako to celé funguje. Toto video je môj prvý screencast vôbec, tak aj vyzerá (berte to s rezervou :))

Róbert Balaško Róbert Balaško

Programátor, grafik, web developer, budúci učiteľ informatiky a anglického jazyka.


Hodnoť článok:
0 0

23 komentárov k článku:

Komentovať môžu iba prihlásení

Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)

Prihlás sa tu, ak už máš profil na Zajtra.sk:


Zabudol som heslo

0 0 Michal Rybár 8.11.2011 16:31:41
@František „SNiPI“ Čaník no to by bolo super. Staci tak kratko aby som vedel akym smerom sa uberat zbytok si uz najdem. Lebo pouzivanie echo "dlhe niekolkoriadkove html"; sa mi nezda ako spravny smer (tak to robim teraz). A ak sa do toho nahodou pustis tak vopred vdaka :)
0 0 František Čaník 8.11.2011 10:54:07
Matúš: Zaujímavé chápanie "PHP" ako "templejtovacieho" jazyku. Pokiaľ viem, je to skriptovací a nie templejtovací jazyk a prečo to využívať? Aby si logicky oddelil kód od html.
0 0 Matúš Koprda 8.11.2011 10:28:25
Smarty som nikdy celkom nepochopil.. veď PHP samotné je templejtovací jazyk. So short tagmi nie je ani rozdiel v počte znakov taký výrazný. Keď napíšeš ten článok, rád by som si prečítal prečo by som mal používať Smarty :)
0 0 František Čaník 8.11.2011 09:15:46
@Michal Rybár: Ak máš záujem, môžem napísať čo to o stavaní jednoduchého webu za pomoci PHP a SMARTY ;).
0 0 Michal Rybár 7.11.2011 09:16:47
nenasiel by sa niekdo kdo by napisal profesionalnejsi clanok ako ma vyzerat kod aby to bolo aspon trochu profesionalnejsie. Kam dat HTML kam dat PHP a pod...
0 0 František Čaník 15.8.2011 19:31:07
@Róbet: Určite nie je za čo, rád pomôžem keď viem, len som chcel podotknúť, že ak sa niekto chystá spraviť si vlastný web a ešte nevie presne koľko podstránok ten web bude mať, tak je lepšia cesta skúsiť sa poobzerať po hotových riešeniach a na nich sa potom niečo naučiť. Tiež som začínal presne tak ako popisuješ ty sám a je mi jasné, že takto bude začínať väčšina samoukov a práve preto som rád, že tu na Zajtra.sk Vám prinášame radu seriálov o rôznych PHP frameworkoch aj keď to je asi skôr pre pokročilejších... Skúsim však niečo vyhútať...
1 0 Róbert Balaško 15.8.2011 17:05:21
@František: Diky za comment! Viem, že to nie je najlepšia cesta ako dynamický web vytvoriť. Nehovorím, že treba kadejaké php includy roznahávať po 50 stránkovom webe. Napísal som, že takto je to aj pri 20 stranovom webe lepšie ako mať to celé statické. Keď niekto naozaj vie len to HTML a chce si to s tým webom nejak uľahčiť, bude mu určite ľahšia aj táto cesta nápomocná :) Smarty nepoznám, ale pozriem to. Myslím, že ako "pre abs. zaciatocnikov" posluzi aj tento navod. Este raz dakujem za pripomienky :)
0 0 František Čaník 15.8.2011 15:22:48
@Robert & @clanok: prepac, mozno je to vecou toho, ze zacinas, mozno je to vecou toho, ze sa asi ucis na kolene, ale pisanie kodu v tomto style: BAD WAY! ... Nie je to najcistejsia forma programovania a stretol som sa s niekolkymi projektmi, ktore boli programovane prave takto a bolo o drzku ponachadzat vsetky mozne a nemozne includy v 50 suboroch. Ak by som ti mohol poradit, skus sa pozriet po roznych weboch a po nastrojoch, ktore ti umoznia a ulahcia pracu. Napr. v tvojom pripade by som skusil hladat nieco v style template - napr.: Smarty Templates. Ale inak drzim paste v uceni.
0 0 Róbert Balaško 10.8.2011 19:02:55
@andrej & @mph - Aspoň som sa aj ja zas niečo priučil :) Thx vám všem ;)
0 0 - 10.8.2011 18:43:39
@andrej: nz, ja dakujem za diskusiu.
0 0 Ike Sallas 10.8.2011 17:13:07
@mhp ďakujem za linky, máš pravdu, som rád že niekto spravil test so správnou metodikou (tzn. že neincludoval stále ten istý súbor ale vždy vytvoril nový).

škoda že sa tu nedajú opravovať príspevky, opravil by som sa :-/
0 0 Miroslav Rosival 10.8.2011 16:49:23
áno, ako základ je to fajn, 1 funkcia=1 include=1 súbor, ale pri väčších aplikáciach je rozumnejšie si písať funkcie a volať potom tie-> x funckií=1 include= 1 súbor. Samozrejme si funkcie grupovať podľa akéhosi kľúča.
0 0 - 10.8.2011 13:44:46
@moderny obcan: jasne, pripajam nizsie.

@andrej: stranka, ktoru uvadzas obsahuje este informacie z obdobia PHP4, takze nie je moc aktualna. nepozeral som ten "kopec odkazov", ale rozdiel v meraniach je dobre vysvetleny tu: http://blog.seeit.org/2010/06/php-the-include-include_once-performance-debate/ .

ja osobne mam toto tvrdenie z tohto zdroja: http://arin.me/blog/php-require-vs-include-vs-require_once-vs-include_once-performance-test .

+ ty si uviedol argument, preco nepouzit "require_once()", takze som reagoval na to. nehovorim o tom, ci to potrebujes overovat. ak to overi a je to rychlejsie, tak to je len plus :).
0 0 Ike Sallas 10.8.2011 12:48:47
@mhp v pohode, ja som to nijako netestoval, idem na to len logicky podľa toho, čo by tá funkcia mala robiť. pokiaľ existuje nejaký korektný test, tak sa naň rád pozriem a dám ti za pravdu tým pádom.

evidentne ale nie som jediný, komu sa to nezdá:

http://www.sitepoint.com/forums/php-34/what-makes-include_once-require_once-so-slow-269085.html

plus kopa iných dotazov po hodení "require vs. require_once".

vkladanie hlavičky - hlavička nebude mať v sebe nijaké funkcie, triedy, atď., je to len šablóna. nepotrebujem overovať, či ju vkladám len raz, keďže to nemôže spraviť paseku, preto by som radšej použil require(). to sú už ale naozaj len kozmetické veci.
0 0 Moďerný Občan 10.8.2011 11:32:49
@mhp a odkaz na ten test je? ked poviem A, zvycajne sa hodi povedat aj B.
0 0 - 10.8.2011 09:17:37
@andrej: test hovori, ze je rychlejsi pri jedinom pouziti. uplne v pohode ho mozes pouzit napr. na navigaciu, header atd... "udajne" je v mojom komentari preto, ze som ten test nerobil osobne ja, ale OK, ak mas ine cisla, mozes hodit, naozaj rad sa necham vyviest z omylu :)

edit: a preco sa nehodi na vkladanie hlavicky? podla mna sa hodi prave tam, lebo urcite ju chcem len 1x na stranke.
0 0 Tomas Dolezal 9.8.2011 22:38:00
Dakujem
0 0 Róbert Balaško 9.8.2011 19:27:25
@Michal Som rád, že ti to pomohlo a všetkým dík za komentáre a pripomienky, mne ako začiatočníkovy v publikovaní článkov to dosť pomáha :).
0 0 Ike Sallas 9.8.2011 18:34:41
pre upresnenie, xxx_once() určite nie je "údajne rýchlejšie" v prípade popisovanom v článku, keďže okrem samotného prevedenia kódu ešte aj vykonáva jeho kontrolu pre zistenie duplicity, takže na vkladanie pätičky / hlavičky sa vôbec nehodí.

hodí sa len v prípade, že máme povedzme 10 súborov využívajúcich jeden spoločný súbor s knižnicou, no nevieme, ktoré z tých 10 súborov za behu použijeme. preto na začiatok každého dáme xxx_once('subor_s_kniznicou.php'), ktoré nám zaručí, že sa spoločný súbor nevloží x-krát a nehodí chybu kvôli duplicitnej definícií funkcie / triedy.

tento spôsob je ale dosť náročný na údržbu, takže v takom prípade je lepšie napísať si za pomoci __autoload() vlastný loader.
0 0 - 9.8.2011 16:07:08
len tak pre doplnenie: ak by islo o zlozitejsi kod/aplikaciu/cokolvek, pri ktorej je treba ladit performance (napr. pre vlastny framework,atd...), tak include_once()/require_once() je udajne rychlejsie. funguje to skoro rovnako ako include() s tym rozdielom, ze pri "..._once()" sa po prvom "includovani" sa uz viac ten isty subor "neincluduje" a require() vam pri neuspesnom pokuse hodi error. (dufam, ze som to napisal zrozumitelne :) )
Zajtra.sk > Programovanie > PHP > Dynamická stránka s PHP include (pre absolútnych začiatočníkov s PHP)


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama