Professional Documents
Culture Documents
Nagy Gusztv
Ad Librum Kiad
Budapest, 2011
A mnek erre a vltozatra a Nevezd meg!-Ne add el!-Ne vltoztasd! licenc felttelei1 rvnyesek: a mvet a felhasznl msolhatja, tbbszrzheti, tovbbadhatja, amennyiben feltnteti a szerz nevt s a m cmt, de kereskedelmi clra nem hasznlhatja fel. A knyv elektronikus vltozata, a fontosabb pldaprogramok s webcmek elrhetek a http://nagygusztav.hu/ oldalrl. A szerz a lehetsgei szerinti legnagyobb gondossggal jrt el a knyv rsa kzben. De ettl mg szmtani kell szerkeszti pontatlansgra, st nem zrhat ki a trgyi tveds sem. Mindezzel egytt a knyv alkalmas az alapismeretek megszerzsre. A kiadvny ltrejttt a Kecskemti Fiskola2 Gpipari s Automatizlsi Mszaki Fiskolai Kara3 tmogatta
ISBN: 978-615-5110-26-9
Nyomda: Litofilm Kft. Bort terv: Vrhegyi Attila E knyv megrendelhet a kiadtl a http://www.adlibrum.hu/Webprogramozas cmen.
1 2 3 4
Bevezets
Ezzel a knyvvel arra vllalkozom, hogy a Kecskemti Fiskola GAMF Karn tanul mszaki informatikus hallgatk kezbe olyan rsos anyagot adjak, amely az eladsok s gyakorlatok mellett tovbbi segtsget ad a web kliens s szerver oldali nyelvei, alapvetbb technolgii megismersre. A knyv felttelezi az alapvet programozsi s hlzati alapismeretek megltt. Ennek hinyban az anyag elsajttsra tbb idt kell fordtani.
A knyvkiadsrl
A knyv elkszlst ngy tanv oktatsi tapasztalatai s hat jegyzetknt kzreadott verzi elzte meg. Az elz verzihoz kpest a kisebb javtsok s kiegsztsek mellett a HTML 5, a CSS 3 s a PHP 5-s verzi nhny fontosabb jdonsga is bekerlt. Ezek mg nem mindig hasznlhatk a munka sorn, de hamarosan szksgnk lesz az ismeretkre. A PDF formtum jegyzeteimet eddig 10-20.000 alkalommal tltttk le, elg sok weboldalon ajnljk, s tbb egyetemen (pl. ELTE, BME, budai Egyetem, Debreceni Egyetem, Szegedi Egyetem) is hasznljk ktelez vagy ajnlott irodalomknt.
A knyv ra
3.600 Ft, ha a kiadtl rendeli meg a papr alap verzit 0 Ft a GAMF nappali vagy levelez tanrend, a jegyzethez tartoz kurzust felvev hallgatja 0 Ft annak szmra, aki ugyan letlti, de nem tallja hasznosnak egy kszn e-mail a nagy.gusztav@gmail.com cmre azok szmra, aki ugyan hasznosnak tartja, de fizetni nem tud rte 2.500 Ft annak szmra, aki hasznosnak tallja s tud is rte fizetni Ez utbbi esetben a nagy.gusztav@gmail.com cmre kldtt e-mailben lehet jelezni a fizetsi szndkot a szmlzsi cm megadsval. Akik inspirltak abban, hogy ezt az zleti modellt alkalmazzam: Jzus Krisztus, akitl (kzvetve vagy kzvetlen) mindent kaptam, A szabad szoftveres kzssg Kecskemt, 2011. jnius a szerz
1
1. Az alapok
Ezzel a knyvvel nem vllalkozhatunk arra, hogy minden szksges elismeretet bemutassunk s minden hatrterlettel foglalkozzunk. De felvzolunk nhny olyan terletet, amely a weboldalak kszti szmra ismert kell legyen. Egyes tmkat alaposabban meg fogunk vizsglni, ms tmkhoz pedig tovbbi anyagok forrsait fogjuk megnzni.
8. oldal
A webes tipogra korltai tbbek kztt a kvetkezk: Korltozott betkszlet
1. Az alapok
Nincs elvlaszts, gy a sorkizrt elrendezs csnya lesz keskenyebb oszlopok esetn Nem lehet tudni, hogy hol s hogyan nzik majd meg a munkt, gy a dizjnereknek minden kpernymretre, felbontsra s krnyezetre gondolniuk kell Ennek megrtsre a kvetkezk olvassa javasolt: Paul Haine: Tipogra a weben
http://dev.opera.com/articles/view/11-tipografia-a-weben/
9. oldal
Br a tmval foglalkoz rsok, weboldalak, vllalkozsok nem mindig tesznek klnbsget a keresoptimalizls s keresmarketing kztt, itt ezt megtesszk. A keresre optimalizls a sajt oldalunk fejlesztsvel trtnik. Emiatt minden weboldal-tulajdonosnak szksge van r. Mi itt erre tudunk koncentrlni. A keresmarketing sok egyb eszkzt (pl. hrlevl, zetett hirdetsek) is felhasznl, amelyek nem kpezik a weboldalunk rszt. (Ez a terlet nem tmja a knyvnek.) Nhny hasznos informciforrs: Google keresmotor-optimalizlsi tmutat kezdknek
http://googlewebmastercentral.blogspot.com/2009/06/seo-starter-guide-now-available-in-40.html
Longhand: Keresoptimalizls
http://longhand.hu/keresooptimalizalas
rdemes azonban megjegyezni, hogy a keresmarketing terletn sok tvhit kering, s sok minsgen aluli cg knlja szolgltatsait. A tvhitekkel kapcsolatban kt gondolatbresztt emltnk meg: Kungl Istvn: SEO mtoszok
http://www.seotools.hu/blog/seo-mitoszok
10. oldal
1. Az alapok
1. bra. A kliens-szerver architektra A felhasznl, aki a web szolgltatsait ki akarja hasznlni, megteheti ezt egy tetszleges modern webbngszvel. (E kt szereplt egyttesen a kliens oldalnak tekintjk.) A felhasznl a bngszt hasznlva kezdemnyezheti egyes weboldalak letltst. A web kezdeti idszakban a webszerver azokat az llomnyokat tudta kiszolglni, amiket a httrtrain elhelyeztek. (Ez tulajdonkppen statikus tartalmat eredmnyez, vagyis az ilyen tartalom jellemzen nem vltozik.) Bizonyos esetekben ez ma is gy van: pldul egy honlapba illesztett kp nem fog megvltozni, akrhnyszor tltjk is le, ezrt a webszervernek a bngsz krsre vlaszul mindssze vissza kell azt adni. Ksbb egyre nagyobb igny lett a dinamikus tartalmak irnt, amikor a tartalom mr a ltogat tevkenysgei, vagy ms okok miatt sznesebb, vltozbb lehet. Ebben az esetben a webszerver nem nmaga vlaszol a bngsz krsre, hanem PHP, vagy ms nyelv program lltja el a vlaszt, amit a webszerver csak tovbbt. Tovbb nvelheti az oldal dinamizmust, ha a tartalmak ellltshoz szksges adatokat (legalbb rszben) adatbzisban troljuk. Ekkor a PHP nyelv forrsprogram az adatbzisszerverrel kapcsolatot pt fel, s adatbzisbl szrmaz informcikat is felhasznl a vlasz elksztshez, illetve a felhasznlk vlaszait is eltrolja az adatbzisban.
1.2.1. Webszerver
A webkiszolgl/webszerver egy kiszolgl, amely elrhetv teszi a rajta trolt weblapokat a HTTP protokollon keresztl. A webszerverekhez webbngszkkel lehet kapcsoldni.
11. oldal
Br a webszerverek sok mindenben klnbznek, az alapvet funkciik azonosak. Minden webszerver HTTP krseket fogad a hlzatrl, s HTTP vlaszokat kld vissza. A HTTP vlasz az esetek tbbsgben egy HTML dokumentum, de lehet mg egyszer szveges fjl, kp, vagy ms tpus fjl is.
Krs
A webszerverek a klienstl kapott krsekben tbbek kztt URL cmet kapnak, melyet aztn ktflekppen rtelmezhet a szerver a belltsaitl fggen: 1. A tartomnynv utn ll relatv mappa s fjl struktrt hozzrendelik egy gykrmapphoz. (A gykrmappa a webszerver belltsaiban van megadva, s az adatokat kr kliens szmra lthatatlan. Tovbbi informcik a 3.1.1. fejezetben.) 2. A tartomnynv utn ll relatv mappa s fjlstruktra (vagy akr mg a tartomnynv is) teljesen fggetlen a krt cmben szerepl struktrtl. Ebben az esetben szerver meghatrozott szablyok szerint formzza a krt cmet. Ennek segtsgvel egy mappra irnyul krs teljesen ms mappra vagy akr egy fjlra is mutathat s fordtva. A kliens pldul az albbi URL-t kri: http://www.pelda.com/utvonal/fajl.html A kliens webbngszje ezt rtelmezve ltrehoz egy kapcsolatot a www.pelda.com kiszolglval, s elkldi a kvetkez HTTP 1.1 krst:
GET /utvonal/fajl.html HTTP 1.1 Host: www.pelda.com
Vlasz
1. A www.pelda.com cmet megfelelteti a webszerver az adott gykrmapphoz (pl. /var/www/pelda), amelyhez hozzfzi a /utvonal/fajl.html elrst ezzel megtrtnt a megfeleltets a fjlrendszer erforrshoz. A krt eredmny a szerveren teht: /var/www/pelda/utvonal/fajl.html. Ezt kveten a webszerver ellenrzi, hogy kiszolglhat-e az adott krs, ill. hogy ltezik-e. Ha nem ltezett, akkor 404-es hibakddal tr vissza, ha hozzfrhet, akkor beolvassa, elvgzi rajta az esetleges tovbbi mveleteket, majd elkldi a kliensnek. A vlasz termszetesen szintn magban foglalja a megfelel fejlcet. 2. A msodik megolds esetben, az erforrsokhoz trtn megfeleltets eltt a cmet tformzza. Pldul:
www.pelda.com/toplista/kutyak+es+macskak
12. oldal
1. Az alapok
Modulok
Lehetsg van a vlaszok feldolgozsa eltt, az esetlegesen a krsben rkezett adatok feldolgozsra s ennek eredmnynek visszakldsre. Ilyenkor a szerver oldalon fut webszerver-modulok illetve a webszerver ltal meghvott CGI rutinok vgzik el ezt a feladatot. A programrszletek (webszerver-modulok) rendszerint a HTML kdba vannak begyazva s maga a webszerver-program hajtja ezeket vgre. Ilyenek pldul a PHP, ASP, JSP.
1.2.2. Webtrhely
A mai weboldalak kis hnyada ignyli, hogy egy vagy esetleg tbb (n. dediklt) szerver teljes egszben a weboldal kiszolglst vgezze. ppen ezrt a legtbb honlap ms honlapokkal osztozik egy webtrhely erforrsain. A virtulis webtrhely szolgltats alatt egy olyan internetes szolgltatst rtnk, ahol egy webszerver erforrsait tbb felhasznl/honlap kztt osztjk fel. Minden felhasznl egy a rendszer ltal dediklt trhelyet foglal el, aminek nyilvnos tartalma egyedi domn nven rhet el. Kisebb forgalm weboldalt kltsghatkonyan lehet brelt webtrhelyen zemeltetni. Trhelyet n. trhelyszolgltatktl6 brelhetnk. A webtrhely szolgltats ltalban tartalmaz egy adminisztrcis felletet (pl. cPanel7), hogy a brl a trhelyt menedzselni tudja. Osztott trhelyszolgltatk rendszerint az egyes szolgltatsokat zikailag elklntett kiszolgl rendszereken oldjk meg, az gyflkiszolgl s adminisztrcis rendszer, a levelez kiszolgl, az adatbzis szerver, a webszerver zikailag elklntett kiszolglkon mkdik. A legtbb webkiszolgl alacsony kltsg Linux vagy BSD alap LAMP szerver. (A LAMP a Linux, Apache, MySQL, PHP szavak rvidtst jelenti.) Az egyes opercis rendszerekre ptett szolgltatsok lnyegben meghatrozzk a felhasznl ltal elrhet technolgik csoportjt is. Windows alap webtrhely esetn a felhasznl vlaszthat ASP.NET s Microsoft SQL Server, de akr PHP s MySQL Server tmogatst is; mg LAMP szerver esetn csak PHP nyelv weboldalakat kszthetnk MySQL Server tmogatssal.
13. oldal
gosan az adott virtulis szerver veheti ignybe a neki kiosztott erforrsokat, fizikai hardver elemeket, vagy megosztottak: pl. kt virtulis szerver hasznlhatja az egyik proceszszort, azaz osztoznak a teljestmnyn, de lehetsgk van nagyobb kapacits kihasznlsra is, amennyiben a msik fl kevsb terheli (2. bra).
2. bra. VPS architektra A szerver virtualizcival teljestmnyben s hardver felptsben is (ezek virtulis hardverek, amik az egyes fizikai hardverekbl vagy azok bizonyos hnyadbl llnak) fizikai gphez mlt konfigurcit hozhatunk ltre, melynek kezelse gyakorlatilag megegyezik a vals szerverekvel, ugyanakkor rengeteg elnnyel br velk szemben.
HttpFox
A gyakorlatban a HTTP megismershez a Firefox bngsz HttpFox 8 nev kiegsztje nagyszer lehetsget nyjt.
8 https://addons.mozilla.org/en-us/firefox/addon/httpfox/
14. oldal
1. Az alapok
A 3. brn ltszik, hogy a weboldal letltshez (fell az els sor) milyen HTTP krst kldtt el a bngsz (lent balra), s milyen vlaszt kapott a webszervertl (lent jobbra). A tovbbi sorok (fent) a HTML feldolgozsa utn szksges CSS, JavaScript s kp llomnyok letltst is mutatjk.
Krs (request)
Egy HTTP krs els sora mindig metdus erforrs verzi alak, pldul gy:
GET /images/logo.gif HTTP/1.1
Ezt a sort kvetheti tetszleges szm fejlc sor kulcs: rtk alakban, pldul gy:
Accept: text/plain,text/html Accept-Language: en
A fejlc sorok vgt egy res sor jelzi, melyet az opcionlis zenettest kvet. A sorokat a CRLF (azaz kocsi vissza + soremels) karakterprral kell elvlasztani. A fejlc vgt jelz res sor csak ezt a kt karaktert tartalmazhatja, nem lehet benne szkz s tabultor sem.
Metdusok
HTTP protokoll nyolcfle metdust definil. A metdusok a megadott erforrson vgzend mveletet hatrozzk meg.
15. oldal
Ugyanazt adja vissza, mint a GET, csak magt az zenettestet hagyja ki a vlaszbl. A megadott erforrs letltst kezdemnyezi. Ez messze a leggyakrabban hasznlt metdus. Feldolgozand adatot kld fel a szerverre. Pldul HTML rlap tartalmt. Az adatot az zenettest tartalmazza. Feltlti a megadott erforrst. Trli a megadott erforrst. Visszakldi a kapott krst. Ez akkor hasznos, ha a kliens oldal arra kvncsi, hogy a kztes gpek vltoztatnak-e illetve mit vltoztatnak a krsen. Visszaadja a szerver ltal tmogatott HTTP metdusok listjt. talaktja a krst transzparens TCP/IP tunnell. Ezt a metdust jellemzen SSL kommunikci megvalstshoz hasznljk.
GET
POST
OPTIONS CONNECT
Vlasz (response)
A HTTP vlasz els sora a sttuszsor, amely verzi sttuszkd indokls alak. A sttuszkd egy hrom szmjegy szm, az indokls egy angol nyelv zenet. Az elbbit inkbb gpi, az utbbit inkbb emberi feldolgozsra szntk. Egy egyszer plda sttuszsorra:
HTTP/1.1 200 OK
A sttuszkdok jelentst az RFC 26169 tartalmazza rszletesen, az albbi lista egy ttekint osztlyozst ad a kezd szmjegy alapjn:
http://rfc-ref.org/RFC-TEXTS/2616/index.html
16. oldal
1xx 2xx 3xx 4xx 5xx
1. Az alapok
Informatv Krs megkapva. Siker A krs megrkezett; rtelmezve, elfogadva. tirnyts A krs megvlaszolshoz tovbbi mveletre van szksg. Kliens hiba A krs szintaktikailag hibs vagy nem teljesthet. Szerver hiba A szerver nem tudta teljesteni az egybknt helyes krst.
A fejlc sorokat itt is res sor zrja, melyet az opcionlis zenettest kvet.
Munkamenet (session)
A HTTP egy llapot nlkli protokoll. Az llapot nlkli protokollok elnye, hogy a szer vernek nem kell nyilvntartania felhasznli informcikat az egyes krsek kiszolglsa kztt. A HTTP eredetileg nem arra kszlt, hogy felhasznlk jelentkezzenek be rajta keresztl szerverekre s ott munkamenetet (session-t) indtsanak. Trtnetileg azonban gy alakult, hogy a HTTP terjedt el szles krben ms, felhasznli bejelentkezst tmogat protokollok helyett, ami arra knyszertette a webfejlesztket, hogy kerlutakon jrva troljk a felhasznlk munkamenet-llapotait, ha arra szksg van.
17. oldal
Azt a folyamatot, amikor egy tvoli szmtgprl fjlt mentnk a sajt szmtgpnk httrtrra, letltsnek nevezzk; feltltsnek nevezzk, ha a folyamat fordtott irnyban zajlik, s mi tltnk fjlt ms gpre. Az FTP kapcsolat gyfl/kiszolgl alap, vagyis szksg van egy kiszolgl (szerver) s egy gyflprogramra (kliens). Elterjedt protokoll, a legtbb modern opercis rendszerhez ltezik FTP-szerver s kliens program, sok webbngsz is kpes FTP-kliensknt mkdni.
Ennek rszei: A http hatrozza meg a hasznland protokollt. A protokoll neve utn kettspont (:) rand. A hu.wikipedia.org adja meg a clgp tartomnynevt. Ez el kt perjel ( //) rand. A 80 adja meg a clgp azon hlzati portszmt, amin krsnket vrja; ez el kettspont (:) rand. Ezt a rszt gyakran teljesen elhagyhatjuk, pldul esetnkben a HTTP protokoll alaprtelmezett portszma a 80. A /wiki/Bit a krt elrsi t a clgpen. Ez a rsz mindig a per-jellel (/) kezddik. A legtbb bngsz nem is ignyli, hogy a http:// rszt begpeljk egy weblap elrshez, hiszen az esetek dnt tbbsgben gyis ezt hasznljuk. Egyszeren begpelhetjk a
10 http://tools.ietf.org/html/rfc1738
18. oldal
1. Az alapok
lap cmt, pldul: hu.wikipedia.org/wiki/Bit. A cmlap megtekintshez ltalban elg a tartomny nevt berni, pldul hu.wikipedia.org. A webcmek egyb rszeket is tartalmazhatnak, http esetben pldul az elrsi t utn, egy krdjel (?) mg helyezve keressi krds szerepelhet, ami egy get metdus HTML rlapbl vagy specilis mdon sszelltott hiperhivatkozsbl szrmazik. Az elrsi t utn, attl egy ketts kereszttel (#) elvlasztva szerepelhet a hiperszveg egy rszre hivatkoz azonost. Ez az azonost nem rsze a webcmnek, de gyakran szerepel vele kapcsolatban. Pldk:
http://hu.wikipedia.org/w/wiki.phtml?title=Bit&action=history http://hu.wikipedia.org/wiki/1999#Esemnyek
A webcm az URI11 egy olyan fajtja, ahol az azonosts a dokumentum helye alapjn trtnik. Ha egy weblapot egyrtelmen meghatroz egy webcm, akkor r mutat hivatkozst hozhatunk ltre. Ez a helyzet nem mindig ll fenn, pl. egy menpont megvltoztathatja a lapon bell az egyik keret 12 tartalmt anlkl, hogy ennek az j kombincinak kln webcme lenne. Ezen kvl egy weblap fgghet ideiglenesen trolt informcitl is. Mg ha van is egy weblapnak vagy keretnek nll webcme, ez nem mindig nyilvnval annak a szmra, aki r mutat hivatkozst kvn ltrehozni. Egy keret webcme nem ltszik a cmsvban, s ltrehozhat cmsv nlkli ablak is. A webcm ilyenkor a lap forrsa, illetve egyes rszeinek tulajdonsga alapjn meghatrozhat. Azon kvl, hogy r mutat hivatkozst hozzunk ltre, egyb okokbl is kvncsiak lehetnk egy lap webcmre: ha tartalmt nllan akarjuk megjelenteni, illetve, ha bizonyos megszortsokat (eszkztr nlkli, vagy kicsi, mretezhetetlen ablak) meg akarunk kerlni.
19. oldal
interj clja az elrend clok teljes kr feltrkpezse. Egy konkrt esetben teht bizonyos krdseket ki is hagyhatunk, ha azok feleslegesnek, rtelmetlennek tnnek. Ms esetben tovbbi krdsek is szksgess vlhatnak. Mi a clunk a honlappal? Kik lesznek a ltogatink? Mit szeretnnk bemutatni? Mik a kulcsfontossg funkcik? Milyen visszajelzseket vrunk a ltogatinktl? Rszt vesznek-e a ltogatink a tartalom ellltsban? Miben fog a tartalom s a szolgltats fejldni (pl. 1 hnap, 1 v mlva)? Ki fogja az oldalt karbantartani? Milyen csoportos s szemlyes jogosultsgi krkre lesz szksg? Hol s hogyan szeretnk a honlapot az interneten reklmozni? Ltogatottsgi statisztikkat szeretnnk-e megismerni? Termszetesen a krdsek akkor is alkalmazhatk, ha a sajt vagy cgnk honlapjt szeretnnk elkszteni. Tovbbi rszletek a szerz honlapjn tallhatak: http://nagygusztav.hu/honlap-interju-mi-az-oldal-celja Nhny hasonl forrs: Kanga Design Gyakori krdsek
http://kangadesign.hu/honlap-keszites-gyakori-kerdesek.html
20. oldal
1. Az alapok
13 Forrs: http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/
21. oldal
4. bra. Oldaltrkp Ezutn nevezzk el az oldalainkat, s rjuk hozz rvid tartalmi sszefoglalkat.
14 A kenyrmorzsa men a felhasznli felleteken hasznlt navigcis eszkz, amely a kiindulponttl a felhasznl jelenlegi tartzkodsi helyig vezet utat mutatja. Pl.: Cmlap ECDL Vizsgakzpontok GAMF Kar
22. oldal
1. Az alapok
Jl t kell gondolnunk, hogy a ltogatink szmra a leglogikusabb, legttekinthetbb struktrt tudjuk nyjtani. Az oldalelrendezs megtervezshez igen hasznos a Paper prototyping mdszere (5. bra).
5. bra. Paper prototyping plda Ezen kvl egyre elterjedtebb a drtvz (wireframe, mockup) eszkzk hasznlata is. Pldaknt a MockFlow egy Youtube tervt15 nzzk meg (6. bra).
23. oldal
http://arth2o.com/blog/honlap-drotvaz-es-gui-prototipus
Linux
Az elterjedtebb, s nem kimondottan asztali (desktop) hasznlatra sznt Linux16 disztribcik teleptsvel mkd web-, s adatbzis szervert kapunk. Akr rgebbi, ms felhasznlsok szmra rtktelen hardverre is telepthetnk Linuxot. Egy kisebb forgalm honlapot tkletesen kpes kiszolglni. A nagy nev disztribcik friss verzii a mai cscsgpek meghajtsra s cscs ignyek kiszolglsra alkalmas, szintn knnyen telepthet lehetsget nyjtanak a rendszergazdknak. nll szerver zemeltetse nlkl, web-hosting szolgltats 17 ignybe vtelvel is tbbnyire Linux alap szerverekkel tallkozhatunk.
16 http://www.linux.hu/ 17 http://tarhely.lap.hu/
24. oldal
1. Az alapok
BSD
Kevsb kzismert, de egyes rendszergazdk krben stabilitsa miatt nagy npszersgnek rvend Unix18 opercis rendszerek. Az alapvet vltozatok szerver feladatokra optimalizltak, gy nagyszeren alkalmasak a webes krsek kiszolglshoz.
Windows
Br les webes krnyezetben nem jelents a rszesedse, azrt elfordul az alkalmazsa. A tanuls szakaszban azonban sokszor a legkzenfekvbb megolds az egyetlen (tbbnyire Windows opercis rendszerrel mkd) szmtgpnket szerverr alaktani. A fejezet tovbbi rszben ezzel a tmval fogunk foglalkozni. Ha a fejlesztshez Windows opercis rendszert alkalmazunk, akkor rdemes nhny technikai dologra figyelni. Elszr is az llomnynevekben a Windows nem tesz klnbsget kis-, s nagybet kztt, ezrt ha pl. HTML-ben vagy CSS-ben nem vagyunk kvetkezetesek, akkor Windows alatt mg mkdni fog az oldal, de ha a ksz munkt ms opercis rendszert futtat gpre kell tvinni, akkor az problms lesz. Javasolhat, hogy webes fjl esetn nagybet soha ne szerepeljen a fjlnvben. Az FTP kliens alkalmazsok az ilyen jelleg hibk elkerlse rdekben ltalban lehetv teszik az FTP-vel tvitt llomnyaink kisbetstst is. Hasonl okok miatt nem clszer az llomnynevekben kezetes betket vagy egyb specilis karaktereket alkalmazni. Vgl szintn fontos, hogy a knyvtrnevek megadsnl a \ helyett mindig a / jelet hasznljuk, s soha ne adjunk meg Windows alatt rvnyes teljes elrsi utat, pl. kerlend a <img src="C:\www\kep.gif"> forma.
25. oldal
is. Ezek kzl csak egyet mutatunk be rszletesen, a tbbi alkalmazsa hasonl. A szolgltatsok krben lehetnek jelentsebb eltrsek is.
A telept-csomagok htrnya, hogy br tbbnyire mkdnek, egy esetleges hiba elllsa esetn a hiba megszntetse elgg bajos lehet, mivel kevsb tudunk a csomag mkdsbe beleltni.
A szerz ltal leginkbb ajnlott integrlt telept csomag az XAMPP20. Az XAMP for Windows 1.7.3 vltozata tbbek kztt a kvetkez szoftvereket telepti s konfigurlja: Apache 2.2.14 (IPv6 enabled) + OpenSSL 0.9.8l MySQL 5.1.41 + PBXT engine PHP 5.3.1 phpMyAdmin 3.2.4 A letlttt teleptprogram a Windows alatti teleptsek szoksos krdseit teszi fel. Legfontosabb a telepts helye. A telepts utn a Start menbl s parancssorbl is vezrelhetjk az alkalmazsokat, de legegyszerbb az XAMPP Control Panel alkalmazsa (7. bra). A webszerver mkdst a bngsz cm sorba rt localhost cm lekrsvel tudjuk tesztelni. Ekkor az It works! szveg a mkds bizonytka. A PHP s a MySQL mkdst legegyszerbben a localhost/phpmyadmin lekrsvel tesztelhetjk.
20 http://www.apachefriends.org/en/xampp-windows.html
26. oldal
1. Az alapok
Bngsz
A weboldalt ltogatk igen sokfle bngszt hasznlnak. Emiatt a webfejlesztnek legalbbis az elterjedtebb tpusokat ismernie s hasznlnia kell tesztelsi clokbl.
Hogy pontosan milyen arnyban hasznljk a ltogatk az egyes bngszket s azok verziit, igen sok vita trgya. A szerz a weboldal jelenlegi adatait a Google Analytics alapjn szokta figyelni, ltalnos informciknt pedig a http://www.w3schools.com/browsers/browsers_stats.asp statisztikit.
Ezen kvl fejlesztknt sem mindegy, melyik bngsz mennyi tmogatst ad a fejlesztsi folyamat gyorstshoz. Ebbl a szempontbl legjobb vlaszts a Firefox, amelyhez j nhny fejlesztshez hasznlhat kiegszt tlthet le21. A szerz ltal gyakrabban hasznlt kiegsztk:
21 https://addons.mozilla.org/hu/firefox/extensions/web-development/
27. oldal
A 8. brn lthat, ahogy a sznkiemels alatt a szintaktikai hibk s a hibk rszletes lersa is megtekinthetk. Kis gyessggel (Oldal javtsa gomb) akr a hibk egy rsztl is megszabadulhatunk.
FireBug23
A 9. brn lthat kiterjeszts az oldalt s a forrskdjt teljesen szimultn mutatja, rdemes megfigyelni az egrkurzorral irnythat kk dobozokat.
22 http://users.skynet.be/mgueury/mozilla/ 23 http://getfirebug.com/
28. oldal
1. Az alapok
9. bra. A Firebug mkds kzben A kvetkez videkkal alaposabban megismerhetjk a Firebug szolgltatsait: rrd (Radharadhya dasa): Firebug 10 percben
http://webmania.cc/firebug-10-percben/ http://webmania.cc/firebug-10-percben-2/ http://webmania.cc/firebug-10-percben-3/
Web Developer24
A Web Developer segtsgvel szintn rengeteg informcit gyjthetnk az oldalrl (10. bra), de akr tesztelhetjk is CSS, JavaScript vagy kpek nlkl az oldal kinzett, mkdst.
24 https://addons.mozilla.org/hu/firefox/addon/60/
29. oldal
HTML Validator25
A HTML Validator az oldalunk HTML s CSS szabvnyossgt tudja ellenrizni.
Fjlkezel
A webfejleszts kzben igen gyakran van szksg llomnykezelsi feladatokra. Ehhez a Windows intz helyett clszer valamelyik kt paneles szoftvert alkalmaznunk. Az llomnyok msolsa, szinkronizlsa, biztonsgi mentsek kezelse napi szint feladat. Legismertebb manapsg a Total Commander26, Linux alatt a Krusader27, de vannak szp szmmal tovbbi szoftverek is.
FTP kliens
Szksgnk lesz valamilyen FTP kliensre az llomnyok szerverre feltltshez. Erre a clra megolds lehet a Total Commander, de clszer inkbb megismerni a FileZilla28 alkalmazst. A FileZilla egy szabad FTP kliens, amely knnyen hasznlhat, tbb szlon is kpes fel-, s letlteni, folytatja a megszakadt letltseket, tbb opercis rendszeren s nyelven mkdik. Az egyre gyakoribb SFTP-hozzfrs miatt j megolds a WinSCP29 hasznlata is.
30. oldal
1. Az alapok
mas a feladatra a Jegyzettmb. De nem nagyon alkalmasak az n. WYSIWYG (What You See Is What You Get) editorok sem, mert tlsgosan megktik a keznket. A szerz vlemnye szerint a webfejlesztnek olyan eszkzkre van szksge, amelyek gy adnak tmogatst, hogy a folyamatot a fejleszt, s nem a program vezrli. Ezen szoftverek egyik legjobbika a Komodo Edit30, amelyik a kdsznezs mellett kdkiegsztssel s l (FTP feletti) szerkesztssel is megbirkzik.
Kpszerkeszt program
A fejleszt a vals letben tbbnyire kp(ek) formjban kapja meg az oldal ltvnytervt, valamilyen szveges formtumban a szveges rszt, s nyers formban a tartalomhoz kapcsold fnykpeket. Ebben az esetben a fejleszt feladata az, hogy a ltvnyterv alapjn elksztse az oldal HTML s CSS kdjt, s rhzza minderre a dizjnt, a szveget s a fnykpeket. A grafikus programok szempontjbl ez azt jelenti, hogy a dizjnt alkot kpet tglalap alak rszekre kell vgni, a fnykpeket pedig mretre hozni, javtani, sznkorrekcit, vilgostst stb. vgrehajtani. E feladatok elltsra rszben a Paint is megfelel, de rdemes valamivel komolyabb szoftvert alkalmazni. A Paint.NET31 olyan ingyenes kpszerkeszt, amely a szmtalan hagyomnyos rajzeszkz mellett tbb klnleges rajzszerszmmal rendelkezik Ilyenek a varzsplca, az utmunklatra hasznlhat tsznez ecset vagy a klnblyeg. A beptett, ltvnyos effektusai segtsgvel egyszerv vlik a retusls. Tovbbi rdekessge a rtegkezels, a lapolvask, a digitlis fnykpezgpek s rajzpadok kezelse. Linux alatt a GIMP-et alkalmazhatjuk vals idej ktegfeldolgoz rendszerknt, vagy mint nagy teljestmny kpszmol, de hasznlhatjuk egyszeren kpkonverternek is. A GIMP hihetetlenl jl bvthet. gy lett tervezve, hogy plug-in bvtsekkel brmire kpes legyen. Fejlett script-fellete lehetv teszi, hogy a legegyszerbb feladatoktl a legbonyolultabb kpfeldolgozsi eljrsokig minden knnyen elrhet legyen parancsfjlokbl is.
30 http://www.activestate.com/komodo-edit 31 http://www.getpaint.net/
2
2. A tartalom s a kinzet
A weboldalak eredeti, s mig legfontosabb clja a tartalmak kzzttele. Erre a HTML mellett a CSS nyelvet hasznljuk. A HTML a tartalom szerkezett, a CSS pedig a kinzett rja le. E kett szorosan sszefgg, de megfelel tervezssel preczen el is vlaszthat egymstl.
A szerz kedvenc illusztrcis pldja a CSS Garden 32 oldala, ahol ugyanazt a HTML struktrt ezernyi klnbz mdon lehet megtekinteni, pusztm a dizjn (CSS llomnyok s a kpek) cserjvel.
2.1.1. Mi az a HTML?
A HTML a Hyper Text Markup Language rvidtse A HTML llomny egyszer szvegllomny, amely rvid jell tagokat tartalmaz A jell tagok alapjn tudja a bngsz, hogyan kell megjelentenie az oldalt
32 http://www.csszengarden.com/tr/magyar/
32. oldal
A HTML llomny html kiterjesztssel rendelkezik
2. A tartalom s a kinzet
Nyissuk meg a bngsznket, majd a Fjl men Webcm megnyitsa parancst vlasztva keressk meg az elbb elmentett oldal.html llomnyt! (Tovbbi lehetsgnk, hogy a Windows Intzben, vagy Total Commanderben dupln kattintunk az llomny nevre. De az llomny bngszre vonszolsval is clt rhetnk.) A 11. brhoz hasonlt kell ltnunk a bngsznkben:
A plda magyarzata
A dokumentum els tagja a <html>. A bngsz errl fogja tudni, hogy hol kezddik a HTML oldal. Az utols tag a </html>, itt r vget a dokumentum a bngsz szmra. A <head> s </head> tagok kztti rsz a fejlc informci. Az itt lert szveget a bngsz nem jelenti meg kzvetlenl.
33. oldal
A <title> tagok kztti szveget a bngsz a cmsorban jelenti meg, ahogy az brn is lttuk. A <body> tagok kztti szveg jelenik meg a bngsz ablakban. A <strong> s </strong> tagok hatsra a szveg kiemelten (alaprtelmezetten flkvren) jelenik meg.
34. oldal
2. A tartalom s a kinzet
A HTML tagot a < s > rsjelek veszik krl (ezek az rsjelek az egyszer szvegekben nem engedlyezettek) A HTML tagok ltalban prban vannak, mint a <html> s </html> A pr els tagja a kezd, a msodik a zr tag A szveg (tartalom) a kezd s a zr tag kztt helyezkedik el A HTML tagok kis-, s nagybetvel is rhatk
A HTML elem kezd tagja <strong>, az Ez a szveg kiemelt. a tartalom, s </strong> a zr tag. A kvetkez is egy HTML elem:
<body> Ez az els honlapom. <strong>Ez a szveg kiemelt.</strong> </body>
A tulajdonsgok nv-rtk prokkal (src="logo.png") adhatk meg, egymstl szkzzel elvlasztva akr tbb is.
35. oldal
Alaptulajdonsgok
class: az elem osztlya, tbb tagnak lehet ugyanaz az rtke. Clja, hogy tbb elemet is azonos kinzetre formzhassunk. id: a tag egyedi azonostja, ugyanazon rtk nem fordulhat el tbbszr. style: soron belli stlus definci.
title:
Nyelvi tulajdonsgok
dir: az rs irnyt definilja lang: a nyelvet adja meg Ezek segtsgvel akr egy bekezdsnek, vagy ms elemnek is adhatunk egyedi informcit a weboldal alaprtelmezshez kpest. (Pl. egy magyar oldalon idznk egy francia verset.)
Billenty tulajdonsgok
accesskey: gyorsbillentyt rendel az elemhez. tabindex: tabultorral trtn elemvlts sorrendjt befolysolja. (rlapok esetn hasznlhat.)
2.1.9. Megjegyzsek
A megjegyzs tagot megjegyzsek elhelyezsre hasznljuk. A bngsz nem veszi figyelembe a megjegyzsbe rt szveget. (Termszetesen a megjegyzs megtekinthet a forrskdban.)
<!Ez egy megjegyzs -->
36. oldal
2. A tartalom s a kinzet
kezetes karakterek
Az angol abc-ben nem szerepl karakterek (gy a magyar nyelv kezetes karakterei is) sokig problmt okoztak a HTML szerkeszts sorn. Ezrt korbban szoks volt az kezetes karaktereket is entitsok segtsgvel megadni. A mai napra azonban ezek a problmk lnyegben megszntek, ezrt a szerz vlemnye szerint teljesen indokolatlan az entitsok alkalmazsa. Helyette inkbb a pontos karakterkdolsra rdemes figyelmet fordtani.
A karakterkdols megadsra elszr HTML meta tagok lehetsgt fogjuk megismerni. Ksbb a PHP-bl kldtt HTTP header alkalmazsa mg jobb megolds lesz. Tovbbi informcik a 3.1.5. fejezetben tallhatak.
37. oldal
Jelents nem trhet szkz kisebb, mint nagyobb, mint s idzjel aposztrf bekezds copyright
Entits nv
< > & " ' § ©
Entits szmkd
  < > & " ' § ©
38. oldal
2. A tartalom s a kinzet
A klnbz listkat a lista elemekkel definiljuk. (<ul>, <ol>, <dl>). Taln nem trivilis, de a menket is <ul>, <li> elemmel rdemes megadni. (A menpontok is egyfajta listt jelentenek.) Ide tartozik mg, hogy a HTML 5 tovbb ersti a szemantikus HTML kialakts lehetsgeit. Ezekrl ksbb lesz sz, pl. a 2.4.7. fejezetben.
2.1.12. Szabvnyossg
A HTML nyelv a kezdetektl fogva szigor szablyokra plt. A Microsoft Internet Explorer s a Netscape Navigator34 harcnak egyik mellktermke, hogy a bngszk felismernek, rtelmeznek olyan HTML oldalakat is, amelyek nem felelnek meg a szabvnynak. St a webfejlesztk ezekre a pontatlansgokra r is szoktak, s ebbl a korszakbl sok mig is elrhet de elavult szemllet, ismertet tallhat a weben. A HTML nyelv minden verzija, vltozata egy gynevezett Document Type Definition (DTD) segtsgvel definilt. A bngszk szmra segtsg, ha a dokumentum elejn pontosan lerjuk, hogy melyik verzihoz tartjuk magunkat. A HTML 4.01 vltozata 3 fle DTD-vel rvnyesthet. A legpontosabb (strict) vltozat nem engedlyezi az elavult rszek (tbbnyire formz elemek s tulajdonsgok) hasznlatt, valamint a kereteket. A kvetkez elemet kell a dokumentum els elemeknt elhelyezni:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
Keretek hasznlata esetn hasznlhat harmadik DTD-t gyakorlatilag nem fogjuk hasznlni.
Az oldalunk HTML szabvnyossgnak ellenrzsre tbb lehetsgnk van: http://validator.w3.org/ online hasznlata Firefox bngszbe bepl HTML Validator35.
34 A Netscape 2007 utols heteiben hossz haldokls utn befejezte plyjt. tadta helyt a pusztn ksrleti clokbl ltrehozott, de villmgyorsan felemelked Mozilla Firefoxnak. 35 http://users.skynet.be/mgueury/mozilla/
39. oldal
2.1.13. HTML 5
Br a HTML 5-s vltozata36 mg nem vgleges szabvny, folyamatosan ersdik a tmogatsa. Emiatt mindenkppen rdemes megismerkednnk a mg fejleszts alatt ll, de holnap mr szabadon hasznlhat megoldsokkal. Tbbek kztt a 2.4.7., 2.7.3. s 2.10.2. fejezetekben olvashatnak ennek rszleteirl.
2.1.14. XHTML
Az XHTML nyelvet a HTML 4 levltsra hoztk ltre egy vtizede, de ez nem terjedt el a gyakorlatban. A HTML 5 jelenlegi fejldsnek fnyben gy tnik, hogy nem is fogunk vele a jvben sokat tallkozni. Ezt azonban csak ksbb tudhatjuk meg. Nem felesleges azonban, ha tudunk a kvetkez nhny alapelvrl. St, akr mg hasznos is lehet az alkalmazsuk. A kvetkez sorokban nhny pontban megnzzk, miben tr el egy XHTML dokumentum a HTML-tl.
Egymsba gyazs
Az elemek csak megfelelen egymsba gyazva s mindig lezrva lehetnek. A kvetkez pldban az egymsba gyazssal van problma:
<b><i>Ez egy flkvr s dlt szveg</b></i>
A helyes megolds:
<b><i>Ez egy flkvr s dlt szveg</i></b>
A helyes vltozat:
<body> <p>Ez egy bekezds.</p> </body>
Elemek lezrsa
A HTML elemeket le kell zrni. Hibs:
36 http://www.w3.org/TR/html5/
40. oldal
<p>Ez egy bekezds. <p>Ez egy msik bekezds.
2. A tartalom s a kinzet
A helyes:
<p>Ez egy bekezds.</p> <p>Ez egy msik bekezds.</p>
Zr pr nlkli elemek
Zr pr nlkli elemek esetn is le kell zrni. Itt azonban egy rvidtett rsmd is alkalmazhat:
Sortrs<br /> Elvlaszt vonal<hr /> Kp <img src="happy.gif" alt="Happy face" />
A / eltti szkz csak a visszafele kompatibilits miatt kell, az XHTML nem ignyli. Teht azrt kell szkz, hogy a csak HTML-t ismer bngszk is meg tudjk jelenteni az oldalt.
Helyes:
<img src="picture.gif" id="kep" />
41. oldal
Kedvcsinl
Mieltt a CSS alapos megismershez kezdennk, mindenkppen clszer a CSS Zen Garden37 oldalt megltogatni. Ez az oldal azzal a cllal jtt ltre, hogy a CSS-sel szembeni ellenrzseket lerombolja, s bemutassa, milyen risi lehetsgek vannak a dizjner kezben, ha a CSS-t komolyan s szakszeren hasznlja. Ezen az oldalon ugyanazt a HTML ol dalt lthatjuk sok-sok klnbz dizjnn formlva csupn a CSS llomny (s termszetesen a dekorcis kpek) cserjvel. A teljessg ignye nlkl nhny kpernykp (1215. bra):
42. oldal
2. A tartalom s a kinzet
43. oldal
Ksbb a kt nagy bngsz (a Netscape Navigator s az Internet Explorer) jabb s jabb HTML tagokat s tulajdonsgokat adott a bngsz ltal felismert HTML nyelvhez (pl. a font tag, vagy a color tulajdonsg). gy belekeveredtek a HTML nyelvbe a megjelentst befolysol elemek. (Radsul a bngszk csak rszben s ksbb tmogattk a vetlytrs jtsait.) A problmt a World Wide Web Consortium 38 (W3C), egy non-profit, szabvnyokat alkot szervezet oldotta meg. A HTML 4.0-s verzijval s a vele prhuzamosan fejlesztett CSS segtsgvel ltrejtt egy jl hasznlhat eszkzpros a webfejlesztk rszre. Mra minden jelentsebb bngsz tmogatja a CSS-t, br a tmogatottsg mrtkben vannak eltrsek.
A Microsoft (s tbb ms, magt a sajt terletn monopolhelyzetben tud cg) mdszere, hogy a fggetlen szabvnyokat (a szerz vlemnye szerint) tudatosan s szndkosan figyelmen kvl hagyja azt remlve, hogy a versenytrsak helyzett ezzel lehetetlenn teszi. Egszen a Firefox megjelensig s a felhasznlk krben val viharos sebessg elterjedsig (kb. 2005-ig) ez a taktika sikeresnek ltszott. Ksbb azonban knytelen volt vltoztatni hozzllsn, az gretek szerint az IE 9-es megelzi a ms bngszket HTML 5 s CSS 3 tmogatottsgban. Kb. 2009-tl a Google Chrome is komoly rszesedst rt el. Ebben a felgyorsult versenyben az igazi gyztesek mi, a felhasznlk vagyunk.
Lpcss elrendezs
Melyik stlus fog rvnyeslni, ha tbb stlust is definilunk ugyanahhoz a HTML elemhez? A kvetkez ngy bellts rvnyesl egyre nagyobb prioritssal (teht tkzs esetn a ksbbi fellrja az elzt). 1. a bngsz alapbelltsa 2. kls stluslap
38 http://www.w3.org/
44. oldal
3. head elemben definilt stlus 4. soron belli stlus
2. A tartalom s a kinzet
Teht a soron belli stlus a legmagasabb priorits, s fellr minden alacsonyabb szint formzst. Ezen kvl fontos mg figyelembe venni egy ltalban jl hasznlhat klszablyt: az a stlusdefinci fog rvnyeslni, amelyik a legszkebb hatkrrel rendelkezik. Pl. ha minden bekezdst barna sznre lltunk, de egy egyedi azonostval rendelkez bekezdst zldre, akkor az utbbi szably rendelkezik szkebb hatkrrel. gy ennl a bekezdsnl zld lesz a szn.
Kezd (st kzphalad) CSS hasznlat esetn is nagyszeren lehet boldogulni az igen bonyolult szablyok precz ismerete nlkl, erre az klszablyra s a jzan paraszti szre alapozva. Egy bevezett azonban mgis figyelmkbe ajnlunk Tommy Olsson tollbl39.
Kls stluslap
A kls stluslap alkalmazsa a legidelisabb eset. Ekkor a HTML llomny az oldal informatv rszt tartalmazza, a kls CSS llomny pedig sszegyjtve a megjelentsre vonatkoz formzsokat. A HTML oldalhoz a head elemben elhelyezett <link> tag segtsgvel csatolhatunk kls CSS llomnyt:
<head> <link rel="stylesheet" type="text/css" href="stilus.css"> ... </head>
Ezzel a szintaxissal akr a CSS llomnyba is importlhatunk tovbbi CSS llomnyokat, a C vagy PHP nyelvek include megoldsaihoz hasonlan.
39 http://dev.opera.com/articles/view/28-inheritance-and-cascade/#thecascade
45. oldal
Kls stluslap fjlt nem HTML oldalanknt kln-kln, hanem akr egy egsz portlhoz egyetlen (vagy nhny) fjlknt szoks kszteni. gy a tovbbi oldalak ltogatsa esetn nincs szksg a CSS fjl jbli letltsre.
Begyazott stluslap
Begyazott stluslapot ksz oldalnl akkor szoks alkalmazni, ha az oldal egyedi (a kls stluslapot nem lehetne msik oldalhoz felhasznlni), vagy nagyon egyszer stlusrl van sz. Persze a dizjn kialaktsnak fzisban is j megolds lehet. Begyazott stluslapot a head elemben szerepl style tag segtsgvel definilhatunk.
<head> <style type="text/css"> body {background-color: red} p {margin-left: 20px} </style> ... </head>
Soron belli stlus alkalmazshoz a kivlasztott elemet kell style tulajdonsggal elltni. A kvetkez plda csak e bekezds megjelentst vltoztatja meg:
<p style="color: red; margin-left: 20px">Ez egy bekezds</p>
A kivlaszt legegyszerbb esetben egy HTML tag, a tulajdonsg azt hatrozza meg, hogy milyen jellemzt akarunk mdostani, mg az rtk a vltozst hatrozza meg. A tulajdonsgot s az rtket egy kettsponttal kell egymstl elvlasztani, s a kettt egytt kapcsos zrjelbe tenni:
body {color: black}
46. oldal
2. A tartalom s a kinzet
Ha egy kivlaszt esetn tbbfle tulajdonsgot is mdostani szeretnnk, knnyedn megtehetjk, mindssze pontosvesszvel kell elvlasztani a tulajdonsg-rtk prokat.
p {text-align:center; color:red}
Egyszerre akr tbb kivlasztra is rvnyesthetjk a formzst. Ekkor a kivlasztkat vesszvel elvlasztott listaknt kell felsorolni. A pldban minden cmet zlden szeretnnk megjelenteni:
h1, h2, h3, h4, h5, h6 { color: green }
A p tagoknak nem ktelez megadni class tulajdonsgot, vagy akr ms is lehet a class rtke, de ezekben az esetekben a fenti stlusoknak nem lesz hatsa a bekezdsekre. Az osztly szint kivlasztst nem ktelez taghoz ktni, lehet tagoktl fggetlen, ltalnos osztly kivlasztt is definilni. A plda minden center osztly elemet kzpre igazt. (Mr amelyik HTML elemnl egyltaln van rtelme a kzpre igaztsnak.)
.center { text-align: center }
47. oldal
rdemes megemlteni, hogy a class tulajdonsg tbb rtket is kaphat, egymstl szkzzel elvlasztva:
<h1 class="center alahuz">
Ilyen esetben mr az egyik kivlaszt (.center) hasznlata esetn is tallat lesz. Ha csak azokat a tagokat akarjuk kivlasztani, amelyek tbb class tulajdonsgot is tartalmaznak, akkor a .center.alahuz szintaxist kell hasznlnunk. Ekkor az egyik osztlyba igen, de a msikba nem tartoz elemek nem lesznek kivlasztva.
Univerzlis kivlaszt
A * szelektorral minden elemet egysgesen tudunk formzni:
* { border: 1px solid #000000; }
Tulajdonsg kivlaszt
A kvetkez plda csak azokra a kpekre fog vonatkozni, amelyek alt tulajdonsga meg van adva:
img[alt] { border: 1px solid #000000; }
48. oldal
2. A tartalom s a kinzet
Gyermek kivlaszt
Gyakori, hogy az elemek tlzott id s class tulajdonsggal val elltsa helyett inkbb az elemek hierarchijra (ms megfogalmazsban leszrmazsra, mint a csaldfnl) ptnk. Pl. a kvetkez plda csak a h3 elemen bell kzvetlenl elhelyezked strong tagra lesz rvnyes. Teht nem vonatkozik a h3 elem ms rszeire, s nem vonatkozik a nem kzvetlenl h3-ban lev strong elemekre sem.
h3 > strong { color: blue; }
Leszrmazott kivlaszt
Az elzhz igen hasonl lehetsg nem csak a kzvetlen szl-gyermek kapcsolatra, hanem az akr tbb szint rkldsre, vagy mshogy fogalmazva a tartalmazsra pt. Nzznk egy pldt:
<div> <em>Szia!</em> <p>Ez a bekezds <em>ksznt</em> tged. </p> </div>
Ekkor a div > em kivlaszt csak az els, mg a div em kivlaszt mindkt em tagot formzza.
Testvr kivlaszt
Gyakran van szksg arra, hogy egymst kzvetlen kvet elemek (vagyis testvrek) irnybl fogalmazzuk meg a kivlasztsunkat. Pl. egy h2-es cmet kvet bekezdsek kzl az elst mshogy szeretnnk formzni, mint a tovbbiakat. Ekkor j megolds lehet a h2 + p kivlaszt, amely a h2 utni p tagot cmzi meg.
Megjegyzs
A CSS fjlba azrt szoktunk megjegyzseket tenni, hogy a ksbbi megrtst s mdostst knnyebb tegye. CSS megjegyzsknt egyedl a C nyelvbl ismert /*...*/megjegyzs hasznlhat:
/* Ez itt egy megjegyzs */ p { text-align: center; /* Ez itt egy msik megjegyzs */ color: black; font-family: arial }
49. oldal
A gyakorlatban szoktuk mg arra is hasznlni a megjegyzseket, hogy egyes formzsokat ideiglenesen kikapcsoljunk vele.
Termszetesen ez a lersi md nem teljesen mechanikus, tbbflekppen is lehet a logikai csoportostst szervezni.
Tematikus sztvlaszts
Bonyolultabb esetekben szoks a CSS llomnyokat tipogrfiai (a szvegekhez szorosan kapcsold) s dizjn (a menk, blokkok, stb. megjelentshez kapcsold) szempontok mentn kln llomnyokra bontani.
CSS keretrendszerek
Egyesek ltal felmagasztalt, msok ltal lenzett megolds a CSS keretrendszerek alkalmazsa. A tmogati az jrafelhasznlhat megoldsokkal indokoljk dntseiket. Sokszor tnyleg egyszerbb egy jl sszelltott alapra pteni, mint egy j rendszert kipteni. A sok lehetsg kzl a 960 Grid System40 az egyik leggretesebb megolds. Jl mutatja, hogy a tervezs a kiadvnyszerkesztsnl szoksos gondolkozsmdra pt. Ezt demonstrlja a kvetkez bra41 is:
50. oldal
2. A tartalom s a kinzet
Msik gyakran alkalmazott lehetsg, amikor a HTML kdhoz kln-kln stluslap llomnyokat ksztnk:
<link rel="stylesheet" type="text/css" href="screen.css" media="screen"> <link rel="stylesheet" type="text/css" href="print.css" media="print">
51. oldal
Nzznk nhny gondolatot Matkovsk Pter CSS lpsrl-lpsre: nyomtats cikke42 alapjn. Ne nyomtassunk ki felesleges rszeket:
#header, #footer, #menu { display: none; }
A fontosabb mdiatpusok:
all aural handheld print projection screen
minden eszkz felolvas szoftver kzi megjelent lapozhat (nyomtats) vetts (mint egy kirakati reklm, vagy az S543 mdszer) kperny
4. tblzat. Mdiatpusok
42 http://weblabor.hu/cikkek/cssnyomtatas 43 http://meyerweb.com/eric/tools/s5/
52. oldal
2. A tartalom s a kinzet
2.2.6. Validtor
A CSS kd ellenrzsre az online is hasznlhat W3C CSS Validation Service 44 egy nagyon j eszkz. Arra azrt figyelni kell, hogy csak rvnyes HTML kddal lehet a CSS r vnyessgt vizsglni.
2.2.7. CSS 3
Az elmlt vekben a HTML-hez hasonlan a CSS terletn sem volt sok vltozs. A CSS 2 ta megszoktuk, hogy a weboldalak szpek is lehetnek. Nagyon szpek. Hamarosan kialakultak olyan technikk, amelyek ersen ptettek a grafikus szoftverek tudsra s a kisebb-nagyobb egyedi trkkkre. Ma ezek (mint pl. a lekerektett sarkok, szntmenetek, rnykok stb.) mr annyira ltalnosan hasznltak, hogy a laikus internetez nem is sejti, mennyi kreativits s munka szksges ezek hasznlathoz. Ma a CSS 3 terletn is a vltozs kort ljk. Egyre-msra jelennek meg az jabb verzik, javtsok a nagyobb bngszkbl. Sokat grnek, s egyre tbbet meg is valstanak a CSS 3 lehetsgeibl. Egyelre mg csak jtk, de hamarosan napi munkv vlhat, ezrt nem hagyhatjuk ki a tmink kzl. A 2.12. fejezetben rszletesen megnznk nhny jdonsgot.
44 http://jigsaw.w3.org/css-validator/
53. oldal
ltalban egyszer alkalmazzuk a h1-es cmet, ezutn nhnyszor a h2-est, szksg esetn a tovbbi szintekkel. A 17. bra jelzsei jl mutatjk, hogy szemantikus rtelemben minden cmhez tartozik egy tartalmi, kifejt rsz. A tartalmi rszben a cmek egy szinttel alacsonyabbak a fcmknl, s mindig tartalmaznak foly szveget (ami mr nem cm), pl. p elemeket.
17. bra. Cmek szemantikus hasznlata A cmsorokhoz a bngsz alaprtelmezetten trkzket is kapcsol, amit majd CSS segtsgvel mdosthatunk. A kvetkez CSS formzsok nem csak cmekre, hanem sokfle ms tagra is alkalmazhatak lesznek.
2.3.1. Httr
Egy elem httert httrszn s httrkp segtsgvel vltozatosan formzhatjuk. A httrkp ismtldhet is fgglegesen, vzszintesen, s lehet a bngszablakhoz vagy a grgetett tartalomhoz ragasztott.
54. oldal
2. A tartalom s a kinzet
Httrszn
A background-color tulajdonsg segtsgvel meghatrozhatjuk az elemek httrsznt. A korbban megismert sznmegadsi mdok kzl itt is tetszlegesen vlaszthatunk. Tovbbi lehetsg a transparent megadsa, ami tltsz htteret fog jelenteni.
body {background-color: yellow} h1 {background-color: #00ff00} h2 {background-color: transparent} p {background-color: rgb(250,0,255)}
Az eredmny:
Httrkp
Az egyszn httr helyett akr ltvnyos httrkpet is elhelyezhetnk az elemek httereknt a background-image tulajdonsg segtsgvel.
background-image: url('bgdesert.jpg')
Ismtlds
A httrkp alaprtelmezs szerint kitaptzva jelenik meg, ha az elem mrete ezt szksgess teszi. Termszetesen ez megvltoztathat, mind vzszintes, mind fggleges irnyban megtilthatjuk az ismtldst. A kvetkez pldban csak y irnyban ismtldik a httrkp:
background-image: url('bgdesert.jpg'); background-repeat: repeat-y;
55. oldal
Pozci
A httrkp pozcija is megvltoztathat: az alaprtelmezett bal fels sarok helyett mshol is lehet a httrkp.
Ennek mg akkor is van jelentsge, ha a teljes htteret kitaptzva ltjuk, ugyanis a kezd taptt van rtelme mshol s mshol megadni.
Az rtk megadsnl elszr a fggleges, majd a vzszintes pozcit kell megadnunk. A 33 konstans (top, center, bottom s left, center, right) mellett szzalkos s pixeles pozicionls is lehetsges. A kvetkez pldban az ablak fels rszn, kzpen jelenik meg a kp.
body{ background-image: url('nagygusztav.jpg'); background-repeat: no-repeat; background-position: top center; }
Az eredmny:
19. bra. Httrkp Mg a kett kzl az egyiket is elhagyhatjuk, ha az egyetlen megadott rtk egyrtelmv teszi a fejleszt szndkt.
Httrkp ragasztva
Elssorban hosszabb grgethet tartalom esetn van jelentsge annak, hogy a httrkp nem csak a grgetsvval egytt mozogva, hanem fixen pozicionlva is krhet. Sok rdekes megolds rhet el ezzel az apr trkkel.
background-image: url('nagygusztav.jpg'); background-repeat: no-repeat; background-attachment: fixed;
56. oldal
2. A tartalom s a kinzet
Mindent bele
Ha tbbfle httrtulajdonsgot is lltunk, tmrebb rsmdot eredmnyez az sszevont background tulajdonsg. gy egyszerre akr mindent is bellthatunk.
background: #00ff00 url('nagygusztav.jpg') no-repeat fixed center;
2.3.2. Szeglyek
A CSS border tulajdonsgaival szeglyeket rajzolhatunk az elemek kr. A kvetkez plda nhny fontosabb vonalstlust mutat be.
Nem minden bngsz az elrsoknak megfelelen rajzolja a szeglystlust.
h1 {border-style: dotted} h2 {border-style: double} p {border-style: solid}
Az eredmny:
20. bra. Seglyek hasznlata Az elemek szeglyt nem csak egysgesen llthatjuk be. Tbbfle lehetsgnk van az eltr megadsra. Egyrszt egyenknt is llthatjuk a szeglyek stlust a border-top-style, borderright-style, border-bottom-style s border-left-style segtsgvel. Msrszt a fenti megadsnl nem csak egy rtket, hanem 2, 3 vagy 4-et is hozzrendelhetnk a defincihoz. Ennek logikjt a kvetkez rszben, a sznekkel kapcsolatban fejtjk ki.
Szeglyszn
A szneket tbbfle mdon kzelthetjk meg. Itt most a monitorok kpmegjelentsnl hasznlatos, ppen ezrt a webfejlesztsben is ltalnos RGB megkzeltst alkalmazzuk. Az RGB sznek hrom sszetevbl llnak, mint piros (red), zld (green), s kk (blue). Mindhrom rtk egy bjton trolt eljel nlkli szmknt hatrozhat meg, vagyis rtke
57. oldal
s 255 kztt (hexadecimlisan 00 s FF kztt) lehet. Ezzel a mdszerrel teht a 3 bjton brzolhat 16 milli szn kzl brmelyik kivlaszthat. Ezen kvl 16 alapszn nvvel is rendelkezik (aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, s yellow). A szeglyek sznt bellthatjuk a border-color tulajdonsggal. Az albbi pldk minden oldal szeglyt meghatrozzk. Minden oldal egyforma szn:
border-color: #0000ff;
A fenti s lenti szegly #ff0000 szn , mg a bal s jobb oldali #0000ff szn:
border-color: #ff0000 #0000ff;
A ngy oldal az ramutat jrsnak megfelelen (kezdve a fenti szegllyel) a felsorolt 4 rtket veszi fel:
border-color: #ff0000 #00ff00 #0000ff rgb(250,0,255)};
Vgl rdemes megemlteni, hogy ilyen specilis RGB szneknl lehetsg van a sznkd felezsre is. Ennek felttele, hogy mindhrom sznkd dupla jel legyen. gy az utols pldnkat gy is rhatnnk:
border-color: #f00 #0f0 #00f rgb(250,0,255)};
A szegly vastagsga
A szegly vastagsgt a border-width tulajdonsggal llthatjuk be. A kvetkez plda folyamatos vonallal szeglyezi a bekezdst, de a szegly vastagsgt megnveli az alaprtelmezett 1px-hez kpest:
p { border-style: solid; border-width: 15px }
A ngy oldal szeglyeit nem csak egyszerre, hanem akr kln-kln is lehet lltani, pldul a bal oldalit. Itt a szegly minden oldalon folyamatos lesz, de csak a bal oldalon lesz vastagabb:
p { border-style: solid; border-left-width: 15px }
58. oldal
2. A tartalom s a kinzet
Kzs deklarci
Az eddigi szegly tulajdonsgok (hasonlan a korbbi tulajdonsgcsoportokhoz) sszevonhatk a border, vagy a border-top, border-right, border-bottom s a border-left tulajdonsg segtsgvel. Pldul az als szegly tbb tulajdonsgnak belltsa:
p {border-bottom: medium solid #ff0000}
Az egyes bngszk bizonyos alaprtelmezett margbelltsokat eltren rtelmezhetnek. Az ebbl ered kellemetlensgek s bosszsgok elkerlse rdekben a szerz szoksa, hogy egy j oldal CSS llomnyt vala hogy gy kezdi:
body, p, h1, h2, h3, table, tr, th, td, img { margin: 0; padding: 0; }
Eric Meyer Reset CSS45 megoldsa mg tovbb megy. Mindenkppen rdemes tgondolni.
45 http://meyerweb.com/eric/tools/css/reset/
59. oldal
2.4.1. Mretek
Az elemek szlessg (width) s magassg (height) tulajdonsga segtsgvel az elem mrete befolysolhat. Elssorban doboz-jelleg elemeknl van rtelme hasznlni: pldul egy kp mrett, vagy a navigcis sv szlessgt gyakran lltjuk be ilyen mdon. A width s a padding megadsa esetn a width a tartalom (content) tnyleges szlessgt jelenti. Nzznk egy pldt:
div#doboz { width: 200px; padding: 10px; }
A szabvny szerint ebben az esetben a tnyleges szlessg 200 pixel lesz. (Egyes korbbi bngszk itt ms logikt alkalmaztak.)
2.4.2. Megjelents
A display tulajdonsg egy elem ms elemekhez viszonytott megjelenst befolysolja. A tulajdonsg hrom legalapvetbb rtke a block, inline s none. Egyes HTML elemeknek (pl. h1..h6, p, ul, ol, div) a block az alaprtelmezse, mg msoknak (pl. small, img, span) az inline.
60. oldal
2. A tartalom s a kinzet
Nzznk egy egyszer pldt a bekezdsek inline-knt val hasznlatra, s a div elemek eltntetsre:
p {display: inline} div {display: none} <p>Els bekezds.</p> <p>Msodik bekeds.</p> <div>Nem lthat div elem.</div>
Az eredmny:
21. bra. Soron belli formzs Egy msik gyakorlati szempontbl rdekes plda, ami szerint az oldal fmenjt felsorolt listval is szoks ltrehozni, s a CSS szintjn inline listaelemekkel megoldani a menpontok egyms mell kerlst. Ezt a pldt a 2.4.3. fejezetben mg alaposabban megvizsgljuk. Felmerlhet a krds, hogy mi rtelme van egy elem lthatsgt kikapcsolni. Sok rdekes eset kzl csak egy faszerkezet navigcis szitucit gondoljunk t. (A Windows Intz bal oldali panelre rdemes gondolni.) Itt praktikus, ha egyes faelemeket, vagy akr nagyobb rszeket is be lehet csukni, hogy a navigci ttekinthetbb legyen. Ezt JavaScripttel tmogatva egyszeren meg lehet tenni: kattints hatsra egy bizonyos elem display tulajdonsgt kell none vagy block rtkre vltani az eltntetshez vagy megjelentshez.
2.4.3. A lebegtets
Eredetileg a kpeknl alkalmazott, de az oldalkialaktsnl is nlklzhetetlen lehetsg a float tulajdonsg alkalmazsa. Ennek segtsgvel a soron bell megjelen elemet ki tudjuk emelni a sor-folytonossgbl, s a krnyez tartalom krl tudja futni az elemet.
61. oldal
Kp lebegtetse
Nzznk egy kpes pldt elszr CSS nlkl. A kp a bekezds belsejben, sor-folytonosan szerepel (pontosan gy, mintha egy nagy mret bet lenne a szvegben):
<p> Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. <img src="logocss.gif" width="95" height="84"> Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. Ez egy szveg. ...
Az eredmny:
22. bra. Kp lebegtets nlkl Ha a kp elem megkapja a float: right formzst, a kp jobb oldalt jelenik meg, krbefuttatva a kvetkez tartalommal:
23. bra. Kp lebegtetve Ha a kp s a krbefuttatott tartalom kzt nagyobb helyet szeretnnk kihagyni, akkor ezt a kp margin tulajdonsgaival tehetjk meg. Ha a kphez feliratot is szeretnnk trstani, akkor ez egy apr trkkel megvalsthat. A megolds lnyege, hogy nem kzvetlenl a kpet lebegtetjk, hanem egy div elem segtsgvel egysgbe zrjuk a kpet s a feliratt, s ezt a csoportost div elemet lebegtetjk.
62. oldal
div { float:right; width:120px; margin:0 0 15px 20px; padding:15px; border:1px solid black; text-align:center; }
2. A tartalom s a kinzet
<div> <img src="logocss.gif" width="95" height="84"><br> A CSS szuper! </div> <p>Ez egy szveg. Ez egy szveg. ...
Az eredmny:
24. bra. Lebegtets alrssal Az eddigiek alapjn egy inicil lebegtetse egyszer feladat. Tipp: a bekezds els betjt tegyk egy span elembe, hogy tudjunk formzst hozzkapcsolni.
Horizontlis men
Nzzk most meg a korbban begrt mens pldt. A men egyszer HTML lista:
<ul> <li><a href="#">Men 1</a></li> <li><a href="#">Men 2</a></li> <li><a href="#">Men 3</a></li> </ul>
A kvetkez eredmnyt szeretnnk ltni. (A kpen nem ltszik, hogy az egrkurzor a Men 1 felett van.)
25. bra. Horizontlis men Nzzk meg kzelebbrl a plda fontosabb pontjait.
63. oldal
Fix szlessg gombok rhetk el. rdemes azonban vigyzni ezzel a mdszerrel, mert ha a szveg nem fr ki, a dizjn sztesik.
text-decoration:none;
A menn kvli httrszn s a jobb oldali szegly szne itt meg kell, hogy egyezzen.
a:hover { background-color:#ff3300}
Az egrkurzorra sznvltssal reagl a menpont. rdemes megfigyelni, hogy a link a teljes li terlett elfoglalja, ezrt a teljes li elem linkknt mkdik.
li { display:inline }
64. oldal
2. A tartalom s a kinzet
lal gazdagodott. A CSS 2-es verzija ta semmi szksg az ilyen elavult s rtelmetlen technikkra. Pldaknt nzznk egy alap oldalelrendezst fejlccel, lblccel s baloldali (pldul men kialaktsra alkalmas) svval. A kvetkezt szeretnnk elrni:
26. bra. Tipikus kt hasbos oldalszerkezet A HTML szerkezet kialaktsnl alapveten a fentrl lefel, azon bell balrl jobbra halad tervezst rdemes kvetni. (Termszetesen sszetettebb esetben ez a sorrend nem ilyen egyszer, s legtbb esetben tbbfle megolds is adhat. Msrszt az is egy fontos szempont, hogy a lnyegi informcitl haladjunk a kevsb lnyeges fel.) Az oldal HTML szerkezete:
<body> <div class="container"> <div class="header"> <h1 class="header">Praesent...</h1> </div> <div class="left"> <p>Phasellus wisi nulla...</p> </div> <div class="content"> <h2>Aenean nummy odio orci</h2> <p>Phasellus wisi nulla...</p> <p>Adipiscing elit praesent...</p> </div> <div class="footer">Praesent...</div> </div> </body>
65. oldal
A container nevet gyakran alkalmazzk az oldal f troljnak azonostshoz. rdemes mg azt is megfigyelni, hogy a left s content doboz nincsenek egy kzs dobozba szszefogva, br bizonyos esetekben ez is szksges lehet.
div.container { width: 100%; margin: 0px; border: 1px solid gray; line-height: 150%; }
A container szlessge alapveten az egsz oldal szlessgt hatrozza meg. Ltszik, hogy az oldal ki fogja tlteni a teljes ablakszlessget. A margin s border tulajdonsgok mr ismersek, csak erre a dobozra lesznek hatssal, mg a line-height rkldni fog a tartalmazott dobozok irnyba. Ehhez hasonlan szneket, bettpusokat szoks ilyen mdon, egysgesen megadni.
div.header, div.footer { padding: 0.5em; color: white; background-color: gray; clear: left; }
Az utols sor megakadlyozza, hogy a kt doboz bal oldaln lebeg (float) elem legyen.
h1.header { padding: 0; margin: 0; } div.left { float: left; width: 160px; margin: 0; padding: 1em; } div.content { margin-left: 190px; border-left: 1px solid gray; padding: 1em; }
A plda taln legrdekesebb rszhez rtnk: a left s content egyms mell helyezshez. Alap tulajdonsgokkal ez a kt doboz egyms al kerlne, de a left elem float formzsa lehetv teszi, hogy a forrskdban utna kvetkez content doboz ne alatta, hanem mellette (is) jelenjen meg. Ezen kvl mg fontos, hogy a content elem bal margja (margin-left) is be lett lltva, gy a left s content dobozok soha nem fogjk egymst zavarni. A megrtshez rdemes a mkd pldt a FireBug kiegszt Layout nzetvel is megnzni. Az bra azt a pillanatot mutatja, amikor a content doboz van kijellve (ez a bal als rszen jl ltszik). Megfigyelhet a 190 pixel szles, srgval sznezett bal oldali margin terlet, s a konkrt szmrtk is a jobb als Layout elemben.
66. oldal
2. A tartalom s a kinzet
67. oldal
Relatv pozci
Az elemeket alaprtelmezett (static) helyzetktl el tudjuk mozgatni a relatv pozicionls segtsgvel vzszintes s fggleges irnyban. A relatv eltols mrtkt a left, right, top s bottom tulajdonsgokkal hatrozhatjuk meg. Az gy eltolt elem eredeti helye resen marad, oda ms elem nem fog becsszni. (Ez lnyeges eltrs a lebegtetett elemekhez kpest.) A kvetkez rnykkal elltott cm plda szemantikusan ugyan nem szerencss, de jl szemllteti a relatv pozicionls lehetsgeit. A megolds lnyege, hogy a cm szvege kt pldnyban szerepel a HTML forrsban, de vizulisan majdnem egymst elfedve, s ms sznnel jelennek meg. Nzzk a pldt:
<h1 class="shadow">Fcm</h1> <h1 class="main">Fcm</h1> <p> Bekezds. Bekezds. Bekezds... </p> h1 { font-size: } h1.main { color: position: top: left: } h1.shadow { color: }
2em;
Az eredmny:
28. bra. Relatv pozicionls A megolds htrnya is jl ltszik a kpen: a cmet kvet bekezds nem kveti kzvetlenl a cmet. Termszetesen ez a htrny tovbbi trkkkkel kikszblhet.
68. oldal
2. A tartalom s a kinzet
Abszolt pozci
A relatv pozci esetn csak eltoltuk az elemet a helyrl, de az eltols a krnyezetre nem volt ms hatssal. Ezzel szemben az abszolt mdon pozicionlt elem nem tart fenn egy terletet. A megadott pozcik itt a tartalmaz dobozon belli abszolt pozcik, s a kvetkez elemek szmra nem is lteznek. Az elz plda gy megoldhat abszolt pozicionlssal is a korbbi htrny nlkl.
h1 { font-size: } h1.main { color: top: left: position: } h1.shadow { color: margin: } 2em; black; 6px; 6px; absolute; #bbb; 2px;
Az eredmny:
29. bra. Abszolt pozicionls rdemes mg kln kiemelni, hogy az abszolt pozci a szlk hierarchijban a hozz legkzelebb es, abszolt vagy relatv pozicionlt elemhez kpest pozicionl, ennek hinyban pedig a body-hoz. Teht ha a szlje nem rendelkezik position tulajdonsggal, de annak szlje igen, akkor a szl szljhez kpest szmt a top, left, right vagy bottom eltols. Emiatt nem ritka, hogy a kvnt szlt a kvetkez formzssal ltjuk el.
#valamelyikszulo { position: relative; top: 0; left: 0; }
Fix pozci
A fix pozci az elz specilis esete. Az elem itt is kikerl a pozicionlsi smbl, de itt nem a tartalmaz doboz, hanem a lttr (kperny) a viszonytsi pont.
69. oldal
2.4.5. Z-index
Sok esetben az elemek nem takarjk egymst. Ha mgis, akkor alaprtelmezetten a (HTML forrskdban) ksbbi elem takarja el a korbbit. Ha ez nem megfelel, akkor a z-index rtkek meghatrozsval manipullhatjuk a vizulis takarst.
A masikoldal.html nmagban is hasznlhat HTML oldal kell legyen. Youtube47 videt gy gyazhatunk a sajt weboldalunkba:
<iframe width="425" height="349" src="http://www.youtube.com/embed/Cy5ZZFIRY50" frameborder="0" allowfullscreen></iframe>
46 Egy nagyon szp megolds: http://www.456bereastreet.com/archive/200609/css_frames_v2_fullheight/ 47 http://www.youtube.com/ 48 A fejezet tbb pldja A List Apart: Articles: A Preview of HTML 5 oldalrl (http://www.alistapart.com/articles/previewofhtml5) szrmazik.
70. oldal
2. A tartalom s a kinzet
30. bra. Tipikus kt hasbos oldalelrendezs A HTML 5 hasznlatval ezt a furcsa torldst megszntethetjk, ha a kvetkezkppen terveznk:
31. bra. A div elemek helyett header, nav, section, article, aside s footer Ez a kvetkez HTML kddal valsthat meg:
<body> <header>...</header> <nav>...</nav> <article> <section> ... </section> </article> <aside>...</aside> <footer>...</footer> </body>
71. oldal
Szekci
A szekci (section elem) egy olyan strukturlis elem, amely akr egymsba is gyazva rhatja le a tartalmi struktrt. Termszetesen cmek ( h1-h6 elemek) a szekci cmt is megadhatjk.
<section> <h1>Level 1</h1> <section> <h1>Level 2</h1> <section> <h1>Level 3</h1> ... </section> </section> ... </section>
Fejrsz
A header elem navigcis clokat szolgl. Alkalmazhat egy szekci vagy az egsz oldal (body) fejrsznek lershoz. Tartalmazhat h1..h6 elemeket is. A teljes weboldal fejlce:
<body> <header> <h1>A Preview of HTML 5</h1> <p class="byline">By Lachlan Hunt</p> </header> ...
Lbrsz
A footer elem a lbrsz lershoz hasznlhat.
<footer>© 2011 Example Inc.</footer>
Navigci
A menket ul-li listaknt volt clszer eddig is kszteni. Most mr rdemes a nav elemet is alkalmazni:
72. oldal
<nav> <ul> <li><a <li><a <li><a <li><a </ul> </nav>
2. A tartalom s a kinzet
Oldalsvok
A legtbb honlap tartalmaz egy vagy tbb oldalsvot. A HTML 5 az aside elemet javasolja alkalmazni ilyen esetekben.
<aside> <h1>Archives</h1> <ul> <li><a href="/2007/09/">September 2007</a></li> <li><a href="/2007/08/">August 2007</a></li> <li><a href="/2007/07/">July 2007</a></li> </ul> </aside>
A f tartalom
A weboldalak f tartalmi elemeinek (pl. blog esetn egy blogbejegyzs, az egyes kommentek) kialaktshoz a HTML 5 az article elemet javasolja.
<article id="comment-2"> <header> <h4><a href="#comment-2" rel="bookmark">Comment #2</a> by <a href="http://example.com/">Jack O'Niell</a></h4> <p><time datetime="2007-08-29T13:58Z">August 29th, 2007 at 13:58</time></p> </header> <p>That's another great article!</p> </article>
2.5.1. Bekezdsek
Bekezdseket a p taggal lehet definilni:
73. oldal
<p>Fl ve csatlakoztam a Tisztessges vllalkozs mozgalomhoz.</p> <p>Szmomra ez nem csak egy plecsni. Jl kifejezi, milyen alapokra ptem a vllalkozsomat. Szmlt adok, szeretek adzni, s nem csapom be az gyfeleimet.</p>
Ugyangy, mint a papr alap szvegszerkeszts esetn, itt sem soronknt, hanem gondolati egysgenknt szoks a bekezdseinket szttagolni.
A bekezdsek hosszra a ltogat nagyon rzkeny, gy legalbb 2-3 bekezdsenknt rdemes egy cmmel kiemelni a lnyeget, illetve a bekezds se legyen hosszabb 6-8 sornl.
A bekezdsek trdelsrl ltalban nem neknk kell gondoskodnunk, hanem hagyhatjuk a bngsz hatskrben. A kvetkez pldban hiba szerepel a forrskdban az jsor s tbb szkz karakter, a bngsz minden elvlaszt karakter-sorozatot (az n. white spaceeket) egy szkzknt rtelmez s jelent meg, a 17. bra szerint.
<p>Fl ve csatlakoztam a Tisztessges vllalkozs mozgalomhoz.</p> <p>Szmomra ez nem csak egy plecsni. Jl kifejezi, milyen alapokra ptem a vllalkozsomat. Szmlt adok, szeretek adzni, s nem csapom be az gyfeleimet.</p>
A tnyleges trdelst mindig a bngsz ablakmrete s a benne lev szveg hatrozza meg.
2.5.2. Sortrsek
A br tag hasznlhat, ha szeretnnk j sort, de nem akarunk j bekezdst kezdeni. A br kiknyszerti a sortrst. Hibs gyakorlat viszont a bekezdsekre bonts helyett 2-2 br tagot rni. Pl. a kvetkez vers esetn szabad hasznlni:
<p> Mikor trsz mr az eszedre, te Sndor?<br> Tivornya jjeled s napod;<br> Az istenrt! hisz az rdg elvisz,<br> Ha mg sok gy folytatod. </p>
74. oldal
2. A tartalom s a kinzet
Szvegkiemels
em strong sub sup ins del Kiemeli a szveget Ersebb kiemels Als indexet definil Fels indexet definil Beszrt szveget jell Trlt szveget jell
Az utols kt tag hasznlatra rdemes egy kis magyarzatot adni. Egy olyan weboldalnl, ahol a szvegen kisebb de annl lnyegesebb vltoztatsokat ejtnk, nem fog feltnni azoknak a ltogatknak, akik korbban mr lttk a tartalmat. De ha a del taggal jelljk
75. oldal
a trlt, s szksg esetn ins taggal az jonnan beszrt szveget, akkor teljesen egyrtelm lesz minden olvas szmra. Nzznk egy pldt a del hasznlatra:
<h4>Idpont:</h4> <p>2010. <del>jnius 21</del> jnius 20 - <del>jlius 2</del> jlius 1. (2 hten t htftl pntekig) dleltt 9.00-11.00 vagy dlutn 18.00-20.00 rig.</p>
Az eredmny:
Szmtgp kimenet
code Forrskdot definil pre Elformzott szveget definil: az elvlaszt (white space) karaktereket nem a HTML-ben szoksos, hanem direkt mdon rtelmezi
76. oldal
<acronym title="World Wide Web">WWW</acronym> <bdo dir="rtl"> Ez a szveg jobbrl olvashat </bdo> <blockquote> Az ilyen hosszabb idzeteket a bngsz trkzkkel is kiemeli </blockquote>
2. A tartalom s a kinzet
A szveg szne
A szveg sznt a color tulajdonsg hatrozza meg:
h1 {color: #00ff00} h2 {color: #dda0dd} p {color: rgb(0,0,255)}
Bettvolsg
A betk kztti tvolsg a letter-spacing tulajdonsggal mdosthat. A pozitv rtk ritktst eredmnyez, a negatv pedig srtst:
h1 {letter-spacing: -3px} h4 {letter-spacing: 0.5cm}
Sztvolsg
A bettvolsghoz hasonl mdon adhat meg a word-spacing tulajdonsg segtsgvel.
A szveg igaztsa
A kvetkez plda bemutatja, hogyan lehet a szveget balra, kzpre, jobbra vagy sorkizrtan igaztani:
h1 {text-align: center} h2 {text-align: left} h3 {text-align: right} p {text-align: justify}
77. oldal
Termszetesen az igazts meghatrozsnak csak blokk szint elem esetn van rtelme. Az alaprtelmezett a balra igazts.
A sorkizrt igaztssal rdemes csnjn bnni, mivel az automatikus elvlaszts hinya miatt a szkzk nagyon csnyn megnylhatnak. Keskeny szvegblokk esetn klnsen kerlend. A kzpre zrt igaztst is csak indokolt esetekben szabad alkalmazni. Pl. cmek, bra feliratok esetn.
A szveg dekorcija
A kvetkez plda bemutatja, hogy hogyan lehet a szvegnket fl hzott, thzott, alhzott vonallal megjelenteni:
h1 h2 h3 a {text-decoration: {text-decoration: {text-decoration: {text-decoration: overline} line-through} underline} none}
A szveg behzsa
A bekezds els sort a kvetkez mdon tudjuk 1 cm-el behzni:
p {text-indent: 1cm}
Bettpus megadsa
A kvetkez pldban a h3 cmeknek s a bekezdseknek ms-ms bettpust hasznlunk.
78. oldal
h3 {font-family: times} p {font-family: courier} p.sansserif {font-family: sans-serif}
2. A tartalom s a kinzet
A bettpusok kzl rdemes ltalnosan hasznlt, a kpernyn jl olvashat tpusokat megadni. Kevsb elterjedt bettpus esetn rdemes elterjedtebb alternatvkat is felsorolni, hogy a bngsz nem ismert tpus esetn is tudjon hasonlt vlasztani.
Betmret
A betk mrett a font-size tulajdonsggal llthatjuk be. A megadsnl ktelez mrtkegysget is alkalmazni, s ltalban rdemes relatv megadsi mdot alkalmazni, hogy a felhasznl a sajt ignyei szerint tudja azt kicsinyteni vagy nagytani.
p {font-size: 1,1em} h1 {font-size: 130%}
A szmszer megadson tl szvegesen is megadhatjuk a mretet: xx-small, x-small, small, medium, large, x-large, xx-large, smaller s larger. Az gy megadott mretek is relatvak.
Betstlus
A dlt betstlus alkalmazsra lthatunk egy pldt:
p {font-style: italic}
Betvastagsg
A betk vastagsga a font-weight tulajdonsggal befolysolhat. Szveges konstansok (normal, bold, bolder s lighter) mellett 100, 200, 900 rtkek hasznlhatk.
p.normal {font-weight: normal} p.vastagabb {font-weight: bold} p.legvastagabb {font-weight: 900}
Betformzsok sszevonsa
Az sszes betformzs sszevonhat akr egyetlen deklarciv:
p {font: italic small-caps 900 12px arial}
Els gyermek
A :first-child ltszlagos osztly egy adott elem els gyermekt kpes kivlasztani. Nzzk a kvetkez pldt:
a:first-child { text-decoration:none }
79. oldal
Ennek hatsra minden els gyermekknt elfordul a elemre rvnyes lesz a fenti formzs. Pldul:
<p>Nzze meg a <a href="http://www.gamf.hu">GAMF</a> s az <a href="http://informatika.gamf.hu"> Informatika tanszk</a> honlapjt!</p>
Ha az adott elemben (itt p) nem link (a) az els gyermek elem, akkor az adott krnyezetben ennek a formzsnak semmilyen hatsa nem lesz. A kvetkez verziban a strong elem tvette az els gyermek szerept, ezrt a formzsnak itt nem lesz hatsa:
<p> <strong>Nzze meg</strong> a <a href="http://www.gamf.hu">GAMF</a> ...
2.6. Linkek
A HTML linkeket (hivatkozsokat) hasznl arra, hogy az oldalunkhoz ms tartalmakat kapcsolhassunk.
80. oldal
A link szintaxisa a kvetkez:
<a href="url">Megjelen szveg</a>
2. A tartalom s a kinzet
A href tulajdonsghoz rendelt rtk hatrozza meg, hogy a bngsz hogyan reagljon a link kivlasztsra. (Itt nem csak kattints jhet szba, hiszen billentyzetrl is lehet linket kivlasztani a TAB segtsgvel, s akr gyorsbillenty (accesskey) is rendelhet egy linkhez.) A kezd s a zr tag kztti szveg (vagy akr bonyolultabb tartalom) lesz kattinthat, s (alaprtelmezetten) kk sznnel alhzott link. A kvetkez plda egy linket definil a Weblabor honlapjra:
<p>A <a href="http://weblabor.hu/">Weblabor</a> honlapja.</p>
A target tulajdonsg
Alaprtelmezetten egy link kivlasztsa esetn az j oldal az aktulis helyett jelenik meg. Ez azonban mdosthat. A kvetkez link egy j ablakban nyitja meg a Weblabor honlapjt:
<a href="http://weblabor.hu/" target="_blank">Weblabor</a>
A name tulajdonsg
Egy hivatkozs alaprtelmezetten a HTML oldal tetejt jelenti. Nha azonban praktikus, ha egy oldalon bell is pontostani tudjuk a link cljt. Erre szolgl ez a tulajdonsg. A kvetkez mdon tudunk ltrehozni egy ugrsi clpontot:
<a name="term107">PHP</a>
Ez az elem vizulisan nem fog megjelenni (pl. alhzssal), hiszen ez a kapcsolat vgpontja lehet, s nem a kezdpontja. Ha erre a pontra akarunk hivatkozni egy linkkel, akkor a kvetkez mdon kell alkalmaznunk:
<a href="http://weblabor.hu/szojegyzek#term107">
Hasznos tippek
Ha egy alknyvtrra akarunk hivatkozni, az URL vgre tegyk ki a / karaktert. gy a webkiszolgl egy felesleges prblkozst megsprolva gyorsabban fogja megtallni a keresett knyvtr tartalmt. (Elszr a knyvtrnevet llomnynvknt prblja rtelmezni, ha nincs mgtte / karakter.)
2.6. Linkek
81. oldal
Hossz oldal esetn tegynk az elejre egy tartalomjegyzket a fontosabb fejezetekre mutat bels linkekkel. Ezen kvl szoks az oldal vgn (vagy akr tbb helyen is) az oldal tetejre (elejre) mutat linket alkalmazni (erre a href="#" hasznlhat). Ennek a megoldsnak az a htrnya, hogy a vissza gomb hatsra is az oldalon bell fog a felhasznl ugrlni.
Ma taln a :hover ltszlagos kivlasztval tallkozhatunk a legtbbszr, s nem is csupn a betsznek, hanem akr komolyabb viselkeds is megvalsthat vele.
2.7. Multimdia
A HTML trtnete a szvegek strukturlt megjelentsnl indult. Ma mr nem olvasni, hanem hallani s ltni szeretnnk a weben. Ezrt a kpek mellett az audio s vide tartalmak beillesztse mindennapos feladatnak szmt.
2.7.1. Kpek
A HTML nyelvben az img tag segtsgvel tudunk kpeket definilni. Ez az elem res, s nincs zr tagja sem (hasonlan a br elemhez).
82. oldal
2. A tartalom s a kinzet
A kp megjelentshez elszr is meg kell adni a src tulajdonsgot, vagyis a kp llomny helyt s nevt. A szintaxis a kvetkez:
<img src="url">
Abszolt, a base href-ben megadott helytl, ennek hinyban a domain gykerben keres:
<img src="/kep.gif">
Az alt tulajdonsg
Az alt tulajdonsg alternatv szveg definilst teszi lehetv. A szabvny szerint teht ennek a szvegnek akkor kell a bngszben lthatv vlni, ha a kp valamilyen oknl fogva nem jelenthet meg (pl. mg nem tltdtt le, nem rhet el, vagy eleve ki van kapcsolva a kpek letltse).
A Microsoft Internet Explorer akkor is megjelenti ezt a szveget, ha az egrkurzort visszk a kp fl, de ez eltr a HTML eredeti cljtl. Erre a szabvny a title tulajdonsgot rja el.
<img src="hajo.gif" alt="1 rbcos vitorls haj">
Mret megadsa
A bngsz ugyan a mret megadsa nlkl is meg tudja jelenteni a kpet, mgis clszer a width s height tulajdonsgokat megadni. Lass kapcsolat vagy sok nagy kp esetn kimondottan zavar lehet, amikor egy jabb kp letltdsekor az ekkor ismertt vlt mret adatok alapjn a flig megjelent oldal ugrl.
<img src="hajo.gif" width="144" height="50">
Termszetesen a kp fizikai mrettl eltr mretek is megadhatk, ekkor kicsinyts, nagyts, vagy akr torzts is lehet az eredmny. Ezt azonban nem szabad a kpszerkesz program alternatvjaknt hasznlni. Rendkvl illetlen magatarts a 10-20 KB-os blyegkpek helyett tbb MB-os kpeket letltetni a ltogatval, majd 100px-es mretben megjelenteni.
Kp hasznlata linkknt
Link aktv fellethez szveg mellett vagy helyett kp is rendelhet. Erre mutat pldt a kvetkez kd:
2.7. Multimdia
<p> <a href="lastpage.htm"> <img border="0" src="kovetkezo.gif" width="65" height="38"> </a> </p>
83. oldal
Flowplayer
A mltn npszer Flowplayer49 lejtsz dokumentcija alapjn pl. a kvetkezhz hasonl kd hasznlhat:
49 http://flowplayer.org/
84. oldal
2. A tartalom s a kinzet
<object width="500" height="375" type="application/x-shockwave-flash" id="swf12970890251" data="/flowplayer3/flowplayer-3.2.5.swf"> <param name="swliveconnect" value="default"> <param name="play" value="true"> <param name="loop" value="true"> <param name="menu" value="false"> <param name="quality" value="autohigh"> <param name="scale" value="showall"> <param name="align" value="l"> <param name="salign" value="tl"> <param name="wmode" value="opaque"> <param name="bgcolor" value="#FFFFFF"> <param name="version" value="9"> <param name="allowfullscreen" value="true"> <param name="allowscriptaccess" value="sameDomain"> <param name="base" value="/files/"> <param name="src" value="/flowplayer3/flowplayer-3.2.5.swf"> <param name="width" value="500"> <param name="height" value="375"> ... </object>
Termszetesen nem mindig szksges ennyi paramter tadsra. A pontos jelents pedig az adott lejtsz dokumentcijbl olvashat ki.
A kdban ltsz redundancik oka a bngszk klnbzsgben keresend.
JW Player
A szintn npszer JW Player50 a kvetkez begyaz kdot javasolja:
<embed flashvars="file=/data/bbb.mp4&autostart=true" allowfullscreen="true" allowscripaccess="always" id="player1" name="player1" src="player.swf" width="480" height="270" />
Videmegoszt kd begyazsa
Igen gyakori, hogy nem a sajt trhelynkn, hanem valamelyik videmegoszt oldalon elhelyezett videkat szeretnnk az oldalunkba begyazni. Pldaknt nzzk meg a Ustream51 ltal nyjtott kd felptst:
50 http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5 51 http://www.ustream.tv/
2.7. Multimdia
85. oldal
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="296" id="utv32777" name="utv_n_585188"><param name="flashvars" value="loc= %2F&autoplay=false&vid=12499218&locale=en_US&hasticket=fals e&id=12499218&v3=1"><param name="allowfullscreen" value="true"><param name="allowscriptaccess" value="always"><param name="src" value="http://www.ustream.tv/flash/viewer.swf"><embed flashvars="loc= %2F&autoplay=false&vid=12499218&locale=en_US&hasticket=fals e&id=12499218&v3=1" width="480" height="296" allowfullscreen="true" allowscriptaccess="always" id="utv32777" name="utv_n_585188" src="http://www.ustream.tv/flash/viewer.swf" type="application/x-shockwaveflash"></object>
A npszer Youtube52 videmegoszt egy teljesen ms megoldst nyjt a szmunkra. Erre lthattunk egy pldt a 2.4.6. fejezetben.
Audio beillesztse:
<audio src="music.oga" controls> <a href="music.oga">Download song</a> </audio>
A HTML 5 multimdia szolgltatsai mg nagyon kplkenyek. De a bngszgyrtk folyamatos vetlkedse szemltomst jt tesz a fejldsnek.
52 http://youtube.com/
86. oldal
2. A tartalom s a kinzet
2.8. Listk
A listkat igen szles krben alkalmazhatjuk a weblapok struktrjnak kialaktsnl.
Felsorolt lista
A felsorolt listk olyan elemeket tartalmaznak, amelyeket nem kell szmozssal azonostanunk, ehelyett egy felsorolsi szimblum (alaprtelmezetten egy fekete kr) jelzi vizulisan a listaelemek kezdett. Teht ilyenkor a felsorolt elemek sorrendje nem lnyeges, nem hordoz informcit. A felsorolt lista az ul elemmel rhat le, a lista elem pedig az li elemmel.
<ul> <li>a macska nyvog, szrs llat</li> <li>kutya ugar, szrs llat, kergeti a macskt</li> </ul>
Az eredmny:
Szmozott lista
A szmozott listk elemei (tbbnyire) szmmal azonostottak. A szmozott listt ol taggal kell ltrehozni, a lista elemek az elzhz hasonlan li-vel definilhatk.
<p>Hogy lehet hrom mozdulattal betenni egy elefntot a htbe?</p> <ol> <li>Kinyitod az ajtt,</li> <li>beteszed az elefntot,</li> <li>becsukod az ajtt.</li> </ol>
Az eredmny:
2.8. Listk
87. oldal
Defincis lista
A defincis lista nem csupn egy felsorols, hanem a definilt elemek s a definciik sorozata. Egy defincihoz akr tbb elem is megadhat. A defincis lista dl taggal, a definilt elem dt taggal, maga a definci pedig dd taggal definilhat.
<dl> <dt>macska</dt> <dd>nyvog, szrs llat</dd> <dt>kutya</dt> <dt>eb</dt> <dd>ugar, szrs llat, kergeti a macskt</dd> </dl>
Az eredmny:
Tovbbi pldk
Felsorolt s szmozott listk esetn a szimblumok vlaszthatk. A kvetkez lista az angol abc kisbetit rja ki:
<ol type="a"> <li>alma</li> <li>bann</li> <li>citrom</li> </ol>
88. oldal
2. A tartalom s a kinzet
rdemes azonban megfigyelni, hogy a bels lista nem kt li elem kztt, hanem egy li elem belsejben, a /li tag eltt szerepel. Vagyis az egymsba gyazott tagok lnca:
ul
li ul li.
Lista jellk
Felsorolt listk esetn az egyes listaelemek sorrendisge nem jelent informcit, ezrt minden listaelem eltt ugyanazt a jellt szoks alkalmazni. rdemes megfigyelni a kvetkez pldban, hogy a formzs a lista (ul) s nem az egyes listaelemek ( li) tekintetben trtnik.
ul.disc ul.circle ul.square ul.none {list-style-type: {list-style-type: {list-style-type: {list-style-type: disc} circle} square} none}
Szmozott listk esetn jval tbb lehetsgnk van, br ezek kzl is csak nhny tartozik a gyakrabban hasznltak kz.
ol.decimal ol.lroman ol.uroman ol.lalpha ol.ualpha {list-style-type: {list-style-type: {list-style-type: {list-style-type: {list-style-type: decimal} lower-roman} upper-roman} lower-alpha} upper-alpha}
Az elre adott lehetsgeket magunk is tovbb bvthetjk azzal, hogy tetszleges kpet alkalmazhatunk listajellnek:
list-style-image: url('arrow.gif')
2.8. Listk
89. oldal
A listajell pozcija
A listajell a szveg belsejben, vagy az eltt is szerepelhet:
ul.inside { list-style-position: inside } ul.outside { list-style-position: outside }
Kzs deklarci
A listaelemek esetn is hasznlhat a mr jl megszokott, rvidebb rsmdot lehetv tev kzs deklarci. Erre is lthatunk egy pldt:
list-style: square inside url('arrow.gif')
2.9. Tblzatok
A tblzatok segtsgvel mtrix-szer, ktdimenzis adathalmazt tudunk megjelenteni. rdemes azonban figyelemmel lenni arra, hogy nagy mret tblzatok kezelse mg nagy monitoron se egyszer, ezrt rdemes tesztelni kisebb felbonts esetn is. Nagy tblzatok helyett rdemesebb lehet tbb kisebb tblzatot, vagy felsorolst hasznlni.
Az eredmny:
90. oldal
2. A tartalom s a kinzet
Tblzat szeglyek
Alaprtelmezetten a tblzatok szeglyek nlkl jelennek meg. Van azonban lehetsg arra, hogy szeglyek is megjelenjenek az oldalon: az elz pldban is lthat border tulajdonsggal lehet belltani a szegly szlessgt. (A szm kppontban rtend.)
Hamarosan ltni fogjuk, hogy CSS-ben ennl jobb lehetsgeink lesznek a kinzet befolysolsra.
Tblzat fejlc
A tblzat els (nhny) sorba, els (nhny) oszlopba szoks fejlc informcikat elhelyezni. Ez magyarzza az alatta vagy mellette tallhat rtkek jelentst. Ebben az esetben az els sort cellit a th tagokkal kell megadni:
<table border="1"> <tr> <th>1. fejlc</th> <th>2. fejlc</th> </tr> <tr> <td>1. sor, 1. cella</td> <td>1. sor, 2. cella</td> </tr> <tr> <td>2. sor, 1. cella</td> <td>2. sor, 2. cella</td> </tr> </table>
Az eredmny:
Tblzat cm
Mltatlanul keveset hasznlt elem a caption, amivel a tblzat cmt tudjuk korrekt mdon megadni. Lehetsg van annak kivlasztsra is, hogy a ngy lehetsges oldal kzl hol jelenjen meg a cm. A caption elemnek meg kell elznie a sorokat:
2.9. Tblzatok
<table border="1"> <caption>Tblzat cme</caption> <tr> <th>1. fejlc</th> <th>2. fejlc</th> </tr> ...
91. oldal
Az eredmny:
Cellk sszevonsa
A colspan s rowspan tulajdonsgok segtsgvel cellkat lehet egyesteni:
<table border="1"> <tr> <th>Nv</th> <th colspan="2">Telefon</th> </tr> ...
Az eredmny:
Tippek
A thead, tbody s tfoot elemek a cljuk szerint nagyon hasznos elemek lennnek, de sajnos a bngszk igen vltoz mdon tmogatjk ket, ezrt a gyakorlatban nem is szoks alkalmazni. A tblzat cellk tovbbi tblzatokat is tartalmazhatnak, amivel sszetett szerkezetek alakthatk ki.
92. oldal
2. A tartalom s a kinzet
Szeglyek
A HTML border tulajdonsg helyett ltalban a kvetkez mdon szoktuk a szeglyt formzni:
table, th, td { border: 1px solid black; }
Ezen kvl szinte minden esetben alkalmazzuk a table tag border-collapse attribtumt, amivel a szokatlan kinzet (pl. 40. bra) nll cellaszeglyek helyett a szvegszerkesztkben megszokott kinzetet rhatjuk el.
table { border-collapse:collapse; }
Mretek
A tblzatok alaprtelmezs szerint csak azt a minimlis helyet foglaljk el, amely szksges a tartalom megjelentshez. A knnyebb olvashatsg rdekben a cellkon szoks bels szeglyt (padding) belltani, illetve egyb mdokon is befolysolni a tblzat mrett. Nhny szoksos megolds:
table { width:100%; } th { height:50px; } td {line-height: 24px; }
Cella igazts
A cellk tartalmt mind vzszintes, mind fggleges irnyban igazthatjuk. rdemes azonban egysges kinzetet tervezni, s nem a tarkasgra trekedni. Nzznk itt is nhny megoldst:
td { text-align:right; vertical-align:bottom; }
2.9. Tblzatok
93. oldal
Zebra tblk
Az alap formzsok lehetsgein tl tovbbi segtsget adhatunk a ltogatknak, hogy a tblzatot knnyebben tudjk olvasni. Ennek igen elterjedt pldja a zebra tblk alkalmazsa. Nzznk egy rvid pldt53.
<table> <tr class="paratlan"> td>1. sor, 1. cella</td> <td>1. sor, 2. cella</td> </tr> <tr class="paros"> td>2. sor, 1. cella</td> <td>2. sor, 2. cella</td> </tr> <tr class="paratlan"> td>3. sor, 1. cella</td> <td>3. sor, 2. cella</td> </tr> <tr class="paros"> td>4. sor, 1. cella</td> <td>4. sor, 2. cella</td> </tr> </table> table { border-collapse:collapse; border: 1px solid #aaa; } td { border: 1px solid #aaa; padding: 2px; } tr.paros td { background-color: #eee; } tr.paratlan td { background-color: #fff; }
Az eredmny:
94. oldal
2. A tartalom s a kinzet
2.10. rlapok
Az rlapokat arra hasznlhatjuk, hogy klnbz mdokon lehetsget adjunk a ltogatnak visszajelzsre, vagyis adatok megadsra.
Szveges mezk
A szveges mezk lehetv teszik, hogy betkbl, szmokbl, rsjelekbl ll karaktersorozatot lehessen begpelni.
<form> Vezetknv: <input type="text" name="vezeteknev"> <br> Keresztnv: <input type="text" name="keresztnev"> </form>
Az eredmny:
2.10. rlapok
95. oldal
Az rlap elemek soron belli (inline) elemek. Ha egyms al akarjuk tenni, akkor azt valamilyen mdon kln meg kell adnunk a HTML, vagy mg szebb, ha a CSS segtsgvel. rdemes megfigyelni, hogy maga a form elem vizulisan nem lthat, csak a benne elhelyezett elemek. Ha (ahogy ebben a pldban is) nem adjuk meg a mezk szlessgt, a legtbb bngsz alaprtelmezetten 20 karakter szlesen jelenti meg. Ez azonban nem korltozza a tnylegesen begpelhet szveg hosszt. Jelszavak begpelshez password tpus (type="password") beviteli mezt szoks ltrehozni. Ez viselkedsben csak annyiban tr el a text tpustl, hogy a begpelt szveg helyett * (egyes bngszkben vagy opercis rendszerek alatt ) karakterek jelennek meg, s vglapra nem lehet kimsolni a tartalmt.
Az elrejts csak a kpernyre vonatkozik, a hlzaton egyszer adatknt utazik a jelsz.
Rdigombok
A rdigombokat akkor hasznlhatjuk, ha a ltogatnak nhny vlaszthat elem kzl kell vlasztsi lehetsget adni. Az elemek kzl mindig csak az egyik lehet aktv. rdemes megfigyelni a kvetkez listban, hogy a name tulajdonsg azonossga rendeli a rdigombokat logikailag egy csoportt, vagyis egymst kizr vlasztsi lehetsgekk. Teht ebbl a szempontbl sem a vizulis elrendezs szmt.
<form> <input type="radio" name="nem" value="no">N</input> <br> <input type="radio" name="nem" value="ferfi">frfi</input> </form>
Az eredmny:
43. bra. Rdigombok Az brn ltszik, hogy alaprtelmezetten egyik elem sincs kivlasztva. Ha valamelyik vlasztsi lehetsget alaprtelmezettnek tekintjk, akkor ezzel knnythetjk is az rlap kitltst:
<input type="radio" name="nem" value="no" checked>N</input>
Jellngyzetek
A jellngyzetek arra szolglnak, hogy a felhasznl egy vagy tbb elemet is ki tudjon vlasztani a rendelkezsre ll lehetsgek kzl. Ms megkzeltsben gy is lehetne fogalmazni, hogy egy jellngyzet ki- vagy bekapcsolt llapotban lehet, fggetlenl ms beviteli elemektl.
96. oldal
<form> <input type="checkbox" name="bicikli"> Van biciklim <br> <input type="checkbox" name="auto"> Van autm </form>
2. A tartalom s a kinzet
Az eredmny:
44. bra. Jellngyzetek Itt is van lehetsgnk az alaprtelmezetten ki nem vlasztott llapot helyett bejellve megjelenteni a jellngyzetet:
<input type="checkbox" checked name="bicikli">
A label elem
rdemes megfigyelni, hogy rdigomb s jellngyzet esetn a kattinthat terlet a kr, illetve ngyzet alak terletre korltozdik. Az elemek mellett megjelen szvegek a bngsz szmra fggetlenek a jell elemektl, csupn a vizulis helyzet jelzi neknk az sszefggst. A label elem hasznlatval ez a fggetlensg megszntethet: a szveget a jellelemmel aktv kapcsolatba hozhatjuk. Ez azt jelenti, hogy lehet kattintani a szvegre is.
<form> <input <label <br> <input <label </form> type="radio" name="nem" value="no" id="no"> for="no">N</label> type="radio" name="nem" value="ferfi" id="ferfi"> for="ferfi">frfi</label>
Az elz verzihoz kpest fontos kiegszts, hogy a value mellett az id is megkapta az azonost szvegeket, mivel a label tag for tulajdonsga az id alapjn azonostja az elemeket.
2.10. rlapok
<form name="input" action="feldolgoz.php" method="get"> Felhasznli nv: <input type="text" name="nev"> <input type="submit" value="Klds"> </form>
97. oldal
Az eredmny:
45. bra. Nyomgomb Ha a felhasznl begpeli a nevet, majd kattint a Klds gombra, akkor a szveg tovbbtsra kerl a feldolgoz.php szmra. Nyomgombokat a button taggal is ltre lehet hozni.
Lenyl lista
Bizonyos esetekben rdigombok helyett clszer inkbb a lenyl listk alkalmazsa. (Elssorban terjedelmi, ttekinthetsgi okokra kell gondolni.) Kt tag hasznlatra lesz mindenkppen szksg: elszr is a select tag adja meg a lista kereteit, mg az option tagok a vlaszthat elemeket.
<form> <select name="autok"> <option value="audi">Audi</option> <option value="fiat">Fiat</option> <option value="skoda">Skoda</option> <option value="suzuki" selected>Suzuki</option> </select> </form>
A selected tulajdonsg lehetv teszi az alaprtelmezett elem kijellst. Ha ez nem szerepel a forrsban, akkor az els elem lesz a kivlasztott betltdskor. Lehetsg van olyan lista ltrehozsra is, ahol egyszerre akr tbb elem is kivlaszthat:
<select name="autok" multiple>
Vgl megemltjk a hosszabb, csoportostssal ttekinthetv tehet listk esetn hasznos optgroup tagot. Az albbi plda a ngy vlasztsi lehetsget kt vizulis csoportba sorolja.
98. oldal
<select> <optgroup label="Olasz autk"> <option value="fiat">Fiat</option> <option value="ferrari">Ferrari</option> </optgroup> <optgroup label="Nmet autk"> <option value="vw">VW</option> <option value="audi">Audi</option> </optgroup> </select>
2. A tartalom s a kinzet
Mezcsoportok
Hosszabb rlapok esetn hasznos lehetsg, hogy az egyes mezket vizulisan csoportosthatjuk a fieldset, s akr cmmel is ellthatjuk a legend taggal. Nzznk egy rvid pldt egyetlen csoporttal. (A gyakorlatban egyms utn tbb csoportot szoktunk ltrehozni.)
<form> <fieldset> <legend>Szemlyes</legend> Nv: <input type="text" size="30"><br> E-mail cm: <input type="text" size="30"><br> Szletsi v: <input type="text" size="10"> </fieldset> </form>
Az eredmny:
2.10. rlapok
99. oldal
amelyek a jelenlegi rlapok hasznlata esetn mutatkoznak. De nzzk meg, melyek azok a lehetsgek, amelyek knnythetik a munknkat. Kezdjk elszr az jfajta rlap elemekkel.
Szm mez
Gyakran van szksgnk arra, hogy szmadatot krjnk be a ltogattl. A kvetkez plda mutatja, hogy milyen lehetsgeink vannak.
<input type="number" min="10" max="20" step="2">
Csszka hasznlata
Akr szmadatok esetn, akr ms szituciban rdekes megolds lehet a csszka hasznlata.
<input type="range" min="0" max="10" step="2" value="6">
Arra azonban rdemes figyelni, hogy itt a csszka szmszer rtke nem jelenik meg kzvetlenl. JavaScript segtsgvel viszont sszekthetjk a csszka mkdst ms rlap elemekkel.
Dtum/id megadsa
Nagyon krlmnyes megoldsokat kellett alkalmaznunk a dtum s idpont megadsokhoz a korbbiakban. De erre is van egy nagyszer megoldsunk:
<input type="date" > <input type="time" >
Az eredmny:
100. oldal
2. A tartalom s a kinzet
49. bra. Date s time bemenet Ezen kvl hasznlhat a datetime, month s week tpus mez is.
Szn megadsa
A szn megadsra is j lehetsgnk van:
<input type="color">
Tovbbi lehetsgek
A kvetkez pldk jl mutatjk az ignyeket. A bngszk megoldsa mr nem ilyen egyrtelm.
<input type="tel"> <input type="email"> <input type="url">
Automatikus fkusz
Automatikusan megkapja a fkuszt a kvetkez elem:
<input type="text" autofocus >
Validls
A JavaScript hasznlata helyett tovbbi lehetsgeket is kaptunk. Ktelez kitlteni a kvetkez mezt:
<input type="text" required >
2.10. rlapok
<input type="text" pattern="[az]{3}[0-9]{3}" >
101. oldal
54 http://woork.blogspot.com/2008/06/clean-and-pure-css-form-design.html
102. oldal
2. A tartalom s a kinzet
<div id="stylized" class="myform"> <form id="form" name="form" method="post" action="index.html"> <h1>Sign-up form</h1> <p>This is the basic look of my form without table</p> <label>Name <span class="small">Add your name</span> </label> <input type="text" name="name" id="name"> <label>Email <span class="small">Add a valid address</span> </label> <input type="text" name="email" id="email"> <label>Password <span class="small">Min. size 6 chars</span> </label> <input type="text" name="password" id="password"> <button type="submit">Sign-up</button> <div class="spacer"></div> </form> </div>
A CSS kd:
body { font-family:"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; font-size:12px; } p, h1, form, button { border:0; margin:0; padding:0; } .spacer { clear:both; height:1px; } .myform { margin:0 auto; width:400px; padding:14px; } #stylized { border:solid 2px #b7ddf2; background:#ebf4fb; } #stylized h1 { font-size:14px; font-weight:bold; margin-bottom:8px; }
2.10. rlapok
#stylized p { font-size:11px; color:#666666; margin-bottom:20px; border-bottom:solid 1px #b7ddf2; padding-bottom:10px; } #stylized label { display:block; font-weight:bold; text-align:right; width:140px; float:left; } #stylized .small { color:#666666; display:block; font-size:11px; font-weight:normal; text-align:right; width:140px; } #stylized input { float:left; font-size:12px; padding:4px 2px; border:solid 1px #aacfe4; width:200px; margin:2px 0 20px 10px; } #stylized button{ clear:both; margin-left:150px; width:125px; height:31px; background:#666666 url(img/button.png) no-repeat; text-align:center; line-height:31px; color:#FFFFFF; font-size:11px; font-weight:bold; }
103. oldal
Termszetesen sok ms megolds is hasznos s megfelelen ltvnyos lehet. A tmban rdemes mg tutorialokat55 megismerni, s hasznos lehet a Wufoo Form Gallery56 megismerse is. Vgl a pForm57 automata generlsi lehetsgeit is rdemes kiprblni.
104. oldal
2. A tartalom s a kinzet
2.11. Fejrsz
A head elem olyan informcikat tartalmaz, amelyek a HTML dokumentum egszre vonatkoznak. A fejrsz a base, link, meta, title, style s script tagokat tartalmazhatja. A base elem az oldal relatv linkjeinek mkdsre lesz hatssal. Ha nincs a base elem href tulajdonsga megjellve, akkor a relatv hivatkozsok az aktulis HTML fjl knyvtrhoz kpest lesznek rtelmezve. A href megadsa esetn a megadott URL lesz az indulsi hely. A meta elem meta-informcit definil az oldalhoz. Nhny plda:
<meta name="keywords" content="HTML, CSS, XHTML, JavaScript">
Rvid sszefoglal az oldaltl. Ezeknek az informciknak korbban igen nagy jelentsgk volt a keresoptimalizls szempontjbl. A keresoldalak egy korbbi genercija (a Google eltti korszak) lnyegben a meta tagokra ptette a keressi szolgltatst. Ezt a fejlesztk egy id utn arra hasznltk, hogy az oldalak hamis kpet mutassanak magukrl, s ezzel jobb helyet rjenek el a tallati listkon. A Google nagy tlete volt, hogy nem erre a knnyen manipullhat informcira, hanem a bejv linkekre pt. gy ma a meta tagok jelentsge jval kisebb, mint ahogy azt sokan gondoljk.
<meta name="revised" content="Hege Refsnes, 6/10/99">
Lekerektett sarkok
-moz-border-radius: 5px; -webkit-border-radius: 5px;
105. oldal
Szegly kppel
border-image: url('image-border.png')29 29 29 29 round round; border: double orange 1em;
Szveg rnyk
text-shadow: 2px 2px 2px #000;
Doboz rnyk
box-shadow:10px 10px 20px #000000;
tltszsg
<img src="opacity.png" style="margin: 10px; opacity:0.25; width:179px; height:76px;"/> <img src="opacity.png" style="margin: 10px; opacity:0.50; width:179px; height:76px;"/> <img src="opacity.png" style="margin: 10px; opacity:0.75; width:179px; height:76px;"/>
Tbb httrkp
background: url(top.png) top left no-repeat, url(banner.png) 11px 11px no-repeat, url(bottom.png) bottom left no-repeat, url(middle.png) left repeat-y;
Tbb hasb
-moz-column-gap: 2em; -moz-column-count: 3;
A sokfle forrs kzl taln az Opera tutorialjait 58 s a Modern CSS3: Alapvet jellemzk59 cm cikket rdemes elolvasni.
58 http://dev.opera.com/articles/tags/css3/ 59 http://www.webragacs.hu/2010/05/modern-css3-1-resz-alapveto-jellemzok/
3
3. Szerver oldali mkds
Ennek a fejezetnek a clja, hogy a dinamikus weboldalak ellltshoz szksges alapismereteket bemutassa. A fejezet tanulmnyozshoz szksges lehet, hogy az 1.2. s 1.4. fejezeteket ismt tnzzk. Szerver oldali krnyezetekben igen nagy a vlasztk, de tbb ok miatt is a klasszikus Apache-PHP-MySQL alap webfejlesztssel fogunk ismerkedni e knyvben. Termszetesen ms krnyezetek hasznlata esetn is hasonl mdon kell megismernnk a krnyezetet, s hasonl lpseket kell megtennnk a weboldal fejlesztse sorn.
108. oldal
# # # # # # #
Jl ltszik, hogy Unixos szoksnak megfelelen a konfigurcis llomny is sok informcit tartalmaz, de a http://httpd.apache.org/docs/2.2/mod/directives.html weboldalt is megltogathatjuk tovbbi informcikrt. A pldbl azt is rdemes mg megfigyelni, hogy a # karakterrel kezdd sorok megjegyzseket tartalmaznak az Apache szempontjbl, vagyis ezekkel a sorokkal az Apache nem fog foglalkozni. Ezrt lthatjuk azt a ksbbiekben is, hogy egybknt korrekt belltsokat kikommentlva tallunk. Ezzel az Apache szmra azt mondjuk, hogy ne foglalkozzon az adott sorokkal. A kvetkezkben nhny vltoz jelentst nzzk meg.
ServerRoot
A ServerRoot meghatrozza, hogy mi az Apache szerver teleptsi tvonala. rdemes a pldn megfigyelni, hogy az elrsi utakat (Windows esetn is) / jelekkel kell lerni.
ServerRoot "C:/xampp/apache"
LoadModule
A LoadModule sorok betltik azokat az opcionlis Apache modulokat, amelyekre ppen szksgnk van az oldal mkdshez. Pl. A kvetkez sor a knyvtrstruktra direkt hasznlata helyett egy logikai tvonaltervezst is lehetv tesz a .htaccess llomnyok hasznlatval.
LoadModule rewrite_module modules/mod_rewrite.so
Ezt a megoldst szoks beszdes URL-nek is nevezni. rdemes Nullstring Beszdes URL-ek .htaccess, mod_rewrite azaz a rewrite engine ereje 1. cikkt60 is elolvasni.
DocumentRoot
A DocumentRoot-ba kell azokat az llomnyokat tennnk, amelyeket a webszerver ltal elrhetv akarunk tenni.
DocumentRoot "C:/xampp/htdocs"
60 http://nullstring.blog.hu/2008/01/23/beszedes_url_ek_htaccess_mod_rewrite_azaz_a_rewrite_engine_ ereje_1
109. oldal
Pl. XAMPP esetn az ebbe a knyvtrba helyezett proba.html llomnyt a http://localhost/proba.html tvonalon tudunk elrni a bngsznkbl.
Directory
A Directory rszben mr nem csak egyszer vltozmegadst lthatunk. Azt hatrozzuk meg, hogy a megadott knyvtr tartalmt hogyan szolglja ki a webszerver. Pl. XAMPP esetn az alapbellts:
<Directory "C:/xampp/htdocs"> Options Indexes FollowSymLinks Includes ExecCGI AllowOverride All Order allow,deny Allow from all </Directory>
Ezek a belltsok a teljes knyvtrstruktra (pl. a C:\xampp\htdocs s alknyvtrai) alaprtelmezett belltsai lesznek. az Indexes miatt kilistzza egy knyvtr llomnyait, ha az nem tartalmaz index.html vagy index.php llomnyt az AllowOverride All megengedi, hogy az alknyvtrakban fellrjuk az alapbelltsokat
IfModule
Az IfModule konfigurcis sorok csak akkor lesznek figyelembe vve, ha az adott modult az Apache betlttte. Pl.
<IfModule dir_module> ...</IfModule>
DirectoryIndex
A DirectoryIndex azt hatrozza meg, hogy egy knyvtr (pl. http://localhost/ a C:\xampp\htdocs knyvtr, mg a http://localhost/xampp a C:\xampp\htdocs\xampp knyvtr) lekrsekor mi trtnjen. A kvetkez plda esetn elszr az index.php majd az index.php4, majd a tbbi nev llomnyt prblja betlteni a webszerver.
DirectoryIndex index.php index.php4 index.php3 index.cgi index.pl index.html index.htm index.shtml index.phtml
Ha brmelyiket megtallja, akkor a keress abbamarad. De ha egyiket se tallja meg, akkor vagy kilistzza a knyvtr llomnyait (Indexes bellts esetn), vagy hibazenetet kapunk (403-as HTTP hiba: Forbidden). Tovbbi informcik olvashatk pl. SzabiLinux oldaln61.
61 http://szabilinux.hu/apache2/konfig.html
110. oldal
51. bra. A phpinfo() eredmnye (rszlet) Igen sok hasznos informcit tallhatunk, de most legrdekesebb a szmunkra az bra utols sora. Ebben ltszik, hogy hol tallhat a php.ini llomny, amelyet a PHP konfigurlshoz szerkesztennk kell. A php.ini nem az egyetlen, de a legfontosabb konfigurcis lehetsgnk. Nzzk meg nhny kezd sort:
111. oldal
;;;;;;;;;;; ; WARNING ; ;;;;;;;;;;; ; This is the default settings file for new PHP installations. ; By default, PHP installs itself with a configuration suitable for ; development purposes, and *NOT* for production purposes. ; For several security-oriented considerations that should be taken ; before going online with your site, please consult php.ini-recommended ; and http://php.net/manual/en/security.php.
Jl ltszik, hogy itt a ; jelzi a megjegyzseket, rszletes dokumentcit pedig a http://php.net/manual/en/security.php cmen tallhatunk. Az llomny nhny belltsa kvetkezik, itt is vltoz-szer szintaxissal.
short_open_tag
A short_open_tag meghatrozza, hogy a <?php kezd karaktersorozat helyett hasznlhat-e a <? is. Egy esetleges jvbeli kltzs miatt rdemes inkbb a mindenhol hasznlhat hosszabb szintaxist alkalmazni, teht nem pteni erre a belltsra.
short_open_tag = On
safe_mode
A safe_mode egy prblkozs a PHP futtatkrnyezet egyes biztonsgi problminak kikszblsre. Ha megoldhat, kapcsoljuk ki:
safe_mode = Off
disable_functions
A disable_functions sorral megadhatjuk, hogy melyik PHP fggvnyek ne legyenek elrhetek a fut PHP kd szmra. Trhelyszolgltatk elszeretettel alkalmazzk, biztonsgi okokra hivatkozva. Egyes esetekben tiltani szoktk pl. a show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open fggvnyeket.
max_execution_time
A max_execution_time belltsa meghatrozza, hogy meddig futhat a PHP kdunk. Ha ezt az idkeretet tllpjk, a futs meg lesz szaktva. Tipikus a 30-60 msodperc krli bellts:
max_execution_time = 60
112. oldal
memory_limit
A memory_limit belltsa meghatrozza, hogy mennyi memrit hasznlhat maximlisan a PHP rtelmez a kdunk futtatshoz. Ha ezt tllpjk, a futs meg lesz szaktva. Ti pikus a 32-256Mb krli bellts:
memory_limit = 32M
Az error_reporting bellts azt befolysolja, hogy milyen jelleg hibazeneteket fogunk a bngszben ltni a kdunk futsa kzben. Fejleszts kzben rdemes mindent bekapcsolni:
error_reporting = E_ALL & ~E_NOTICE
l krnyezetben viszont inkbb kapcsoljuk ki a publikus hibazeneteket, s inkbb a log fjlokat figyeljk.
post_max_size
s upload_max_filesize
A post_max_size az egyetlen krskor, POST metdussal kldtt maximlisan elfogadhat adatmennyisget rja le. Az upload_max_filesize egyetlen feltltend llomny maximlis mrett hatrozza meg. Az alapbelltsok:
post_max_size = 64M upload_max_filesize = 64M
A kt rtk kztt van ugyan kapcsolat, de azrt nem trivilis. Pl. egy tbb llomny feltltst lehetv tev rlap esetn lehet, hogy llomnyonknt csak 8Mb-ot engedlyeznk, de sszessgben egy 32MB-os korltot is szabunk:
post_max_size = 32M upload_max_filesize = 8M
extension_dir
s extension
session.save_path
s session.auto_start
A session.save_path belltsa a munkamenetek trolsra szolgl llomnyok helyt hatrozza meg. A session.auto_start a munkamenetek automatikus indtst tiltja le a kvetkez kdban:
113. oldal
Jl ltszik, hogy a phpMyAdmin az alaprtelmezetten ltrejv root nev, s jelsz nlkl hasznlhat felhasznlt hasznljuk.
Jogosultsgkezels
A MySQL jogosultsgkezelse rendkvl fontos szerepet tlt be. Adataink biztonsga nagy jelentsg brmilyen adatbzisrl s alkalmazsrl legyen is sz. A MySQL jogosultsgkezelse az automatikusan telepl, mysql nev adatbzis tartalmra pl. Ez alapjn minden kapcsolds sorn figyelembe veszi a kvetkezket: honnan kapcsoldunk
114. oldal
kik vagyunk mit tehetnk Az adatbzis tblinak a kvetkez szerepe van:
user: Ki s honnan kapcsoldhat. Definilja a globlis jogokat is. db: Melyik adatbzishoz ki frhet hozz. Definilja az adatbzis szint jogokat is. host: Melyik adatbzishoz honnan lehet csatlakozni. tables_priv s columns_priv: Tbla s mez szint jogosultsgokat definil. Ez alapjn a hitelests kt lpsben trtnik. 1. A MySQL megllaptja, hogy van-e jogunk csatlakozni a megadott nvvel, jelszval s helyrl a kvnt adatbzishoz. 2. Minden SQL parancs esetn megvizsglja, hogy van-e jogunk az adott parancsot lefuttatni.
Adatbzisok s felhasznlk
Trhelyszolgltatk esetben igen gyakori, hogy egyetlen adatbzisunk lehet, s hozz egyetlen felhasznlnk. Ebben az esetben teht az adatbzishoz az egy felhasznlval csatlakozunk, s a felhasznl is csak ehhez az egy adatbzishoz kapott jogosultsgokat. Ezt a szokst ms esetben is clszer hasznlni. Olyankor is, ha egybknt lenne lehetsgnk tbb adatbzishoz ugyanazt a MySQL felhasznli azonostt hasznlni.
Bevezetknt mg rdemes azt elmondani, hogy a PHP jelenlegi legfrissebb (5.3.x) verzija sem kezeli jl az UTF-8 krdst. Ha azonban kvetjk a kvetkez alapelveket, tbbnyire kzben tarthatjuk a problmt.
62 http://weblabor.hu/cikkek/karakterkodolasiproblemakkikuszobolese
115. oldal
Konfigurcis llomnyok
A httpd.conf-hoz adjuk hozz:
AddDefaultCharset UTF-8
116. oldal
52. bra. UTF-8 alaprtelmezett belltsa Komodo Edit esetn Ha egy megnyitott llomnyt, akarunk UTF-8 kdolssal menteni, akkor az Edit / Current File Settings / Properties / Encoding rtkt lltsuk UTF-8-ra, BOM (byte order mark) nlkl, s mentsk az llomnyt.
Egyes Windows-os programok a fjl elejre rt 0xEF,0xBB,0xBF bjtsorozattal jelzik, hogy UTF-8 kdols fjlrl van sz; ezt nha UTF-8 BOM kdolsnak hvjk. [] UTF-8-ban ennek a karakternek elmletileg nincs jelentse, gy hasznlhat a kdols jelzsre, azonban ez megtri az ASCII-kompatibilitst, gy nem javasolt. Az gy kdolt PHP fjlok pldul a weboldal elejn megjelen karaktersorozatot eredmnyeznek. 63
63 Forrs: http://hu.wikipedia.org/wiki/UTF-8#BOM
117. oldal
53. bra. UTF-8 belltsa az aktulis llomnyra, Komodo Edit esetn Ha azt akarjuk, hogy a bngsz UTF-8-knt dolgozza fel a vlaszt, a korbban mr ltott meta tagot hasznlhatjuk:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
Ennl mg jobb megolds, ha a forrskd legelejn, mg a doctype s a html tag eltt kikldjk a kvetkez header fggvnyt:
<?php header('Content-Type: text/html; charset=utf-8'); ?><!DOCTYPE html>
118. oldal
FTP feltlts
Arrl sem rdemes megfeledkeznnk, hogy rdemes az llomnyainknl garantlni, hogy az FTP feltlts sorn se vltozzon semmi a forrskdunkban. Ezrt az FTP alkalmazsunkat rdemes gy belltani, hogy az binris mdban tltse fel az llomnyokat. Total Commander esetn a Belltsok / ltalnos belltsok / Mkds / FTP / Alaprtelmezett tviteli md a Binris legyen.
54. bra. Binris tviteli md belltsa a Total Commanderben Ezekkel a belltsokkal az UTF-8 kdols tbbnyire elrhet.
Adatbzis-kapcsolat
Adatbzis-hasznlat esetn az adatbzis ltrehozsa s a PHP-MySQL kommunikci sorn is rdemes belltani az utf-8-at.
119. oldal
3.2.1. Szintaxis
Egy weboldal PHP forrst nem tudjuk a bngsznk segtsgvel megnzni. Ott mindig csak a PHP ltal ellltott HTML kimenet lthat.
A fejezet pldaprogramjai helytakarkossgi okokbl a legtbb esetben nem teljes vagy nem szabvnyos HTML oldalakat ksztenek.
A HTML oldalba gyazott PHP kd kezdett s vgt egyrtelmen jellni kell a PHP rtelmez szmra. Ennek tbbfle mdja kzl leginkbb a kvetkez ajnlhat:
<?php ... ?>
Szoks mg hasznlni egy rvidebb jellst is, de ez nem biztos, hogy minden konfigurci esetn mkdik. A 3.1.2. fejezetben olvashattunk a short-open-tag-rl.
<? ... ?>
A kvetkez Hello World plda jl mutatja, hogyan gyazzuk be a PHP kdot a HTML oldalba:
120. oldal
<html> <body> <?php echo "Hello World"; ?> </body> </html>
Majdnem minden PHP utastsnak ;-vel kell vgzdnie. Kivtel: a PHP zr tag eltt elhagyhat. Kt egyszer lehetsgnk van arra, hogy a HTML llomnyba kimenetet szrjunk be: echo s print. A kt fggvny kzl szabadon vlaszthatunk, de az olvashatsg kedvrt nem illik keverni a kettt egy kdon bell. Emellett egy ettl eltr megkzeltst is hasznlhatunk:
Sablonszer megkzelts
A sablonrendszerekrl szl 3.11. fejezet pldi elssorban a kvetkez pldhoz hasonlan, print s echo nlkl kezelik a kimenetet:
<acronym class="datum" title="<?= $datum['hosszu'] ?>"> <span class="honap"><?= $datum['honap'] ?></span> <span class="nap"><?= $datum['nap'] ?></span> </acronym>
A plda lnyege, hogy nem a PHP-be illesztjk a HTML-t kszt kdsorokat, hanem fordtva: a fix HTML szvegbe szrjuk be a PHP kifejezseket (elssorban vltozk beillesztshez szksges utastsokat). Ehhez az rtk kirsra szolgl szintaxis hasznlhat:
<?= kifejezs ?>
3.2.2. Megjegyzsek
A PHP kdban egysoros (sorvgi) s tbbsoros megjegyzseket is hasznlhatunk:
<html> <body> <?php // Egy soros megjegyzs /* Ez egy tbb soros megjegyzs blokk */ ?> </body> </html>
Nem szabad sszekeverni a HTML s a PHP megjegyzsek szerept. A HTML megjegyzs a kliens gpn is megjelenik, fogyasztja a svszlessget, ltalban nem javasolt. Ezzel
121. oldal
szemben a PHP megjegyzsek nem kerlnek el a klienshez, az ilyen megjegyzseket a PHP nem tovbbtja a kimenetre. Clja a forrskd ksbbi knnyebb megrtse. Egy plda a szerz korbbi honlapjrl:
<? /* Az elzetes megjelentsre, a hozzszlsok szmval */ ?> <div class="hir"> <? if ($lehethozza || $tartalom) { ?> <h2><a href="<?= $index ?>?<?= $blognev ?>/<?= $url ?>"> <?= $hirCim ?></a></h2> <? } else { ?> <h2><?= $hirCim ?></h2> <? }?>
3.2.3. Vltozk
A PHP nyelvben minden vltoz neve $ karakterrel kezddik. A vltozk alapveten szvegeket, szmokat s tmbket tartalmazhatnak. A kvetkez plda a $txt vltozt hasznlja a kirand szveg trolsra:
<html> <body> <?php $txt="Hello World"; echo $txt; ?> </body> </html>
Ha kt vagy tbb szveges kifejezst (sztringet) ssze akarunk fzni, akkor a . (pont) opertor hasznlhat:
<html> <body> <?php $txt1="Hello World"; $txt2="1234"; echo $txt1 . " " . $txt2; ?> </body> </html>
Vltoznevek
A vltoznevek az ABC betibl, szmokbl s az alhzs karakterbl llhatnak, de nem kezddhetnek szmmal. A nevek szkzt nem tartalmazhatnak, gy az sszetett vltoznevek esetn az alhzs karaktert ($my_string) , vagy a kzbls sz nagy kezdbetjt ($myString) alkalmazzuk.
122. oldal
Vltozk tpusai
A PHP nyelv a kvetkez tpusok hasznlatt teszi lehetv: logikai (boolean), rtke true (igaz) vagy false (hamis) lehet egsz szmok (integer), pl. 5, -23 lebegpontos szmok (double), pl. 3.14, 2.0 sztringek (string), pl. "alma" tmbk (array), amik kulcsok s rtkek rendezett sorozata objektumok (object), amik egy osztly pldnyai erforrsok, pl. egy adatbzis vagy llomny azonostja NULL, ami egy rtk nlkli vltoz A PHP nyelv gyengn tpusos, gy nincs szksg a vltoz tpusnak elzetes megadsra. A tpus legtbbszr az rtkads pillanatban lltdik be, az rtkads sorn hasznlt rtk tpustl fggen.
gettype
A gettype fggvny segtsgvel lekrdezhetjk egy vltoz tpust. A kvetkez pldnkban ezt egyszeren kirjuk:
$a = 5; $b = 6.2; print gettype($a); print gettype($b);
A futs eredmnye:
integer double
Implicit tpuskonverzi
Bizonyos mveletek vgzse kzben automatikus tpuskonverzi trtnhet. Pl. a kvetkez kdban az sszeads elvgzse rdekben az egsz vltoz rtke 3.0 vals rtkk konvertldik, hogy az sszeads kt azonos tpus kztt tudjon megtrtnni. gy a vgeredmny 5.4 vals rtk lesz.
$a = 3; $b = 2.4; print $a + $b;
rdemes itt kln kihangslyozni, hogy az $a vltoz rtke vagy tpusa ettl nem vltozik meg, a konverzi az rtknek egy ideiglenes msolatn trtnik.
123. oldal
Kln rdemes megemlteni egy specilis esetet. Ha sszeadsnl sztring operandust hasznlunk, akkor nem kapunk hibazenetet. Ehelyett szmm prblja konvertlni azokat, hogy az sszeadst el tudja vgezni rajtuk. gy a kvetkez kd kimenete integer tpus s 5 rtk lesz:
print '2 alma' + '3 krte';
Explicit tpuskonverzi
Ha egy kifejezs tpusa nem megfelel a szmunkra, direkt mdon is elrhatjuk a konverzit. A kvetkez pldban az sszeads eltt a $ vltoz rtke (egszen pontosan a msolata) egssz konvertldik, s az sszeads kt egsz szm kztt trtnik meg. gy az eredmny is 5 egsz szm lesz.
print $a + (integer)$b;
A kvetkez pldban explicit s implicit tpuskonverzi is trtnik. A plda kd 2 tizedesjegyre kerekti az $a vals szmot:
$a = 0.33333333; print (integer)($a*100) / 100.0;
Nzzk sorba a kirtkels lpseit: 1. $a*100: a 100 implicit vals szmm konvertldik 2. (integer) 33.333333: explicit egsz szmm konvertldik 3. 33 / 100.0: a 33 implicit vals szmm konvertldik A vgeredmny 0.33 vals rtk lesz. rdemes vgl megjegyezni, hogy az $a s $b vltozk itt sem vltoztak meg. A kvetkez megolds viszont a vltoz tpust is megvltoztatja.
settype
Idnknt szksg lehet arra, hogy egy vltoz tpust megvltoztassuk. Mivel ez sokszor automatikusan megtrtnik, ritkn van szksg a settype hasznlatra. De nzznk mgis egy pldt:
$a = 5.2; settype($a, 'integer');
Mivel a double tpus vltoz tpust egszre lltottuk, kerekts trtn, s a vltoz rtke 5 lesz.
Vltoz vltozk
rdemes mg egy rdekes pldn keresztl megnzni, hogy mit is jelent a vltozk kirtkelse.
124. oldal
$a = 'b'; $$a = 'alma';
Jl megfigyelhet, hogy ilyenkor az idzjeleknek nincs klns hatsa, az aposztrf lershoz viszont a \ specilis (n. escape) karakter hasznlata ktelez. A \ karakter az utna kvetkez karakterrel specilis jelentst hordoz, ezrt a C:\ kirsa rdekben is hasznlnunk kell. A kimenet:
Arnold egyszer azt mondta: "I'll be back" You deleted C:\*.*?
125. oldal
$ingatlan = 'hz'; echo "kertes $ingatlan kertssel"; // mkdik, szkz nem lehet vltoznvben echo "pros $ingatlanszm"; // nem mkdik, az 's' s tovbbi karakterek lehetnek vltoznvben echo "pros ${ingatlan}szm"; // mkdik, mert pontosan meg van adva a nv echo "pros {$ingatlan}szm"; // mkdik, mert pontosan meg van adva a nv
Ezzel a mdszerrel nem csak kiolvasni, hanem mdostani is tudjuk a sztring karaktereit:
$str{0} = 'A';
Ennek hatsra az $str szting 0. karaktert rjuk fell. Vgl rdemes itt ismt megemlteni, hogy UTF-8 karakterkdols hasznlata esetn az indexels nem fog megfelelen mkdni. Helyette a Multibyte String fggvnyeket66 vagy az iconv fggvnyeket67 hasznlhatjuk.
66 http://www.php.net/manual/en/ref.mbstring.php 67 http://www.php.net/manual/en/ref.iconv.php
126. oldal
rtkad opertorok
Az rtkad opertorok a bal oldali operandus rtkt vltoztatjk meg. Az els ( =) opertor j rtke nem fgg a korbbi rtktl, mg a tbbi opertor a korbbi rtkhez kpest szmolja ki az j rtket. Opertor
= += -= *= /= %= .=
Plda
$x=$y; $x+=$y; $x-=$y; $x*=$y; $x/=$y; $x%=$y; $x.=$y;
Jelents
$x=$y; $x=$x+$y; $x=$x-$y; $x=$x*$y; $x=$x/$y; $x=$x%$y; $x=$x.$y;
Aritmetikai opertorok
Az aritmetikai opertorok a matematikbl ismert feladatukat ltjk el. Tbbnyire egsz vagy vals tpus operandusokkal szoktuk ket hasznlni.
127. oldal
Mvelet Plda
$x=2; $x+2 $x=2; 5-$x $x=4; $x*5 15/5 5/2
Eredmn y
4 3 20 3.0 2.5 1 2 0 $x=6
++
--
$x=4
Ekkor $a s $b rtke is n, de mindkett csak az sszeads elvgzse utn. gy $c rtke 5 lesz. Ha mdostjuk a $c = $a++ + ++$b; alakra, akkor $b nvelse mg az sszeads elvgzse eltt megtrtnik, gy $c rtke 6 lesz. Vgeredmnyben teht az opertor helye a nvels/cskkents idbelisgt befolysolja.
128. oldal
sszehasonlt opertorok
Gyakran van szksgnk arra, hogy kt kifejezs viszonyt (relcijt) meg tudjuk hatrozni. Az sszehasonlt mveleteket eredmnye mindig logikai rtk (true vagy false). Leggyakrabban feltteles elgazsoknl, ciklusok feltteleknt tallkozhatunk velk. Opertor
== != > < >= <= ===
Mvelet egyenl nem egyenl nagyobb kisebb nagyobb-egyenl kisebb-egyenl tpus s rtk egyenl
Plda
5==8 5!=8 5>8 5<8 5>=8 5<=8 '5'===5
Eredmny
false true false true false true false
Az egyenl s nem egyenl opertorok brmilyen, akr klnbz tpus operandusokon is elvgezhetek. Ilyenkor implicit tpuskonverzi trtnik, ami nha meglep eredmnyt produkl. Ha az ilyen meglepetseket el szeretnnk kerlni, jl jhet a tpus s rtk egyenl opertor. Ez csak akkor ad igaz eredmnyt, ha eleve megegyez tpusokkal hasznljuk, s az rtk is megegyezik.
Logikai opertorok
A logikai opertorok bonyolultabb felttelek felptse sorn elengedhetetlenek lesznek. ltalban az operandusok eleve logikai tpusak. Ha mgsem, akkor konverzi fog trtnni. Logikai false rtkk konvertldik pl. 0, 0.0 szmok res sztring ('') res tmb res objektum Nzzk meg a logikai opertorokat:
129. oldal
Plda
$x=6 $y=3 ($x < 10 && $y > 1) ($x < 10 and $y > 1) $x=6 $y=3 ($x==5 || $y==5) ($x==5 or $y==5) $x=6 $y=3 !($x==$y)
Mvelet s
Eredmny
true true
|| or
vagy
false false
nem
true
Az opertorok precedencija
Az opertorok vgrehajtsi sorrendjt az eddig megismerteken kvl az erssgk s a vgrehajts irnya hatrozza meg. Nzzk meg a sorrendet a legersebbtl a leggyengbb irnyba: 1. ++, --, (tpuskonverzi) 2. /, *, % 3. +, 4. <, <=, >, >= 5. ==, !=, === 6. && 7. || 8. =, +=, -=, /=, *=, %=, .= 9. and 10. or Ha teht egy kifejezsben klnbz szint opertorokat alkalmazunk, akkor a fenti sorrendben fogja ket a PHP kirtkelni. Az azonos csoportba tartoz opertorok egyforma erssgnek tekinthetk, kzttk nem tesznk klnbsget. Ilyenkor ltalban balrl jobbra haladva haladunk a mveletvgzsben. A zrjelek segtsgvel a fenti sorrend manipullhat.
130. oldal
Rvidzr kirtkels
Bizonyos esetekben a logikai opertor msodik operandusa nem rtkeldik ki. Pldul a kvetkez esetben:
($a < 3) && ($b == 5)
Az && opertor csak akkor ad vissza true-t, ha mindkt operandus true. Teht, ha $a < 3 false, akkor && bal oldala false, s a kifejezs eredmnye ( false) a jobb oldali operandus kirtkelse nlkl szletik meg. Ilyen esetekben a PHP nem rtkeli ki a jobb oldali operandust. Ehhez hasonlan, ha a || opertor bal oldali operandusa true, felesleges a jobboldalt kirtkelni, gy az nem is fog megtrtnni.
3.2.6. Tmbk
A tmb egy vagy tbb rtket trolhat egyetlen vltoznvvel. Ha PHP-vel dolgozunk, akkor elbb vagy utbb valsznleg szeretnnk tbb hasonl vltozt ltrehozni. Tbb vltoz hasznlata helyett az adatokat egy tmb elemeiknt is trolhatjuk. A tmb minden elemnek egyedi azonostja (indexe, kulcsa) van, gy knnyen hozzfrhet. A tmbknek hrom klnbz tpusa van: Sorszmozott tmb Olyan tmb, amelynek egyedi numerikus (vagyis szm) azonostkulcsai vannak Asszociatv tmb Olyan tmb, amelynek egyedi szveg (vagyis sztring) azonostkulcsai vannak Tbbdimenzis tmb Olyan tmb, amely egy vagy tbb tmbt (is) tartalmaz
Hamarosan pontostani fogjuk: igazbl egyfle tmb van, de hromfle tipikus felhasznlsi eset szokott elfordulni.
Sorszmozott tmbk
A sorszmozott tmb minden elemhez egy numerikus azonostkulcsot trol. A sorszmozott tmb ltrehozsnak tbb mdja van. Nzznk kt pldt, amelyek ugyanazt a tmbt hozzk ltre. Az els pldban az azonostkulcsok (indexek) automatikusan kerlnek hozzrendelsre az elemekhez:
$names = array("Peter","Quagmire","Joe");
131. oldal
Tmbk feltltsekor az index megadsa sem ktelez. Ha elhagyjuk, akkor a legnagyobb hasznlt index utn folytatja a szmozst. Az elz pldt folytatva a 3-as index al kerl Jack:
$names[] = "Jack";
Asszociatv tmbk
Az asszociatv tmb minden azonostkulcshoz egy rtket rendelnk hozz. Ha egyedi rtkeket szeretnnk trolni, nem felttlenl a sorszmozott tmb a legjobb megolds erre. Az asszociatv tmb rtkeit kulcsknt hasznlhatjuk, s rtkeket rendelhetnk a kulcsokhoz.
Az asszociatv tmbkre elszr az rlapbl kapott adatok feldolgozsakor merlt fel igny (3.5. fejezet).
Az elz kd kimenete:
Peter is 32 years old.
Bizonyos rtelemben pontosabb lenne gy fogalmazni, hogy a PHP csak az asszociatv tmbket ismeri, s a kulcs lehet szm is.
132. oldal
Tbbdimenzis tmbk
Egy tbbdimenzis tmbben a f tmb minden eleme lehet maga is egy tmb. Az altmb minden eleme lehet (de nem ktelezen) tmb, s gy tovbb. Ebben a pldban olyan tbbdimenzis tmbt hozunk ltre, melynek azonostkulcsai automatikus hozzrendelssel rendelkeznek:
$families = array ( "Griffin"=>array ( "Peter", "Lois", "Megan" ), "Quagmire"=>array ( "Glenn" ), "Brown"=>array ( "Cleveland", "Loretta", "Junior" ) );
A pldbl jl ltszik, hogy az egyes altmbk elemszmnak se kell egyenlnek lenni. A 3.6.2. fejezetben rszletesebben bemutatsra kerl plda oldal alapja, hogy a kvetkez tmb alapjn generldik a fels men:
133. oldal
A kls tmb kulcsai az URL rszletei, a bels tmbk kulcsai pedig a szveges oldalt tartalmaz llomny nevt, s a menpontok cmt tartalmazzk.
3.3.1. Elgazsok
Az if, elseif s else kulcsszavak hasznlatosak a PHP-ben felttelhez kttt utastsok vgrehajtsra. Sok esetben merl fel egy-egy programozsi feladat kapcsn annak szksgessge, hogy klnfle lehetsgekhez ms-ms viselkedst rendeljnk. Ennek megoldsra hasznlhatjuk a feltteles kifejezseket.
134. oldal
if-else elseif
- Akkor hasznljuk, ha a felttel igaz volta esetn egy adott kdot, hamis volta esetn egy msik kdot szeretnnk futtatni. - Az if-else kifejezssel egytt hasznljuk, ha azt szeretnnk, hogy egy adott kdrszlet akkor fusson, ha tbb felttel kzl csak egy teljesl.
Az if-else szerkezet
Egy felttel teljeslse esetn futtat egy kdrszletet, amennyiben a felttel nem teljesl, akkor egy msikat. Szintaxis:
if (felttel) vgrehajtand kd, ha a felttel teljesl; else vgrehajtand kd, ha a felttel nem teljesl;
A kvetkez plda kimenete a Have a nice weekend! szveg lesz, ha pp pntek van, egybknt pedig a Have a nice day!:
$d=date("D"); if ($d=="Fri") echo "Have a nice weekend!"; else echo "Have a nice day!";
Ha egy utastsnl tbbet szeretnnk futtatni a felttel teljeslse/nem teljeslse esetn, az utastsokat kapcsos zrjelek kz kell rnunk:
$d=date("D"); if ($d=="Fri") { echo "Hello!<br>"; echo "Have a nice weekend!"; echo "See you on Monday!"; } ?>
Az elseif szerkezet
Ha tbb felttelbl egy teljeslse esetn szeretnnk ms-ms kdot futtatni, az elseif szerkezetet hasznljuk. Szintaxis:
if (felttel1) vgrehajtand kd, ha a felttel1 teljesl; elseif (feltte2l) vgrehajtand kd, ha a felttel2 teljesl; else vgrehajtand kd, ha egyik felttel sem teljesl;
A kzps elseif szakasz akr tbbszr is szerepelhet. Az albbi plda kimenete Have a nice weekend! ha ma pntek van, Have a nice Sunday! ha ma vasrnap van, egybknt pedig Have a nice day!
135. oldal
Feltteles opertor
Nha elfordul, hogy az if-else szerkezet helyett egyetlen opertort, a feltteles opertort hasznljuk. Ez csak akkor lehet alternatvja az if-else hasznlatnak, ha mindkt gon valamilyen rtket akarunk ellltani, s azt a tovbbiakban felhasznlni. Nzznk egy egyszer pldt. A kvetkez kd a $bar logikai vltoz rtkt szvegesen lltja el tesztelsi clokbl.
$bar = true; $str = "TEST ". ($bar ? 'true' : 'false') ." TEST";
A switch szerkezet
A switch utastst a PHP-ben akkor hasznljuk, hogyha ms-ms kdot szeretnnk vgrehajtani egy vltoz vagy kifejezs lehetsges rtkei alapjn. A switch hasznlatval bizonyos esetekben elkerlhetek a hossz if-elseif-else blokkok. A switch utasts ltalnos formja:
switch (kifejezs) { case cimke1: a vgrehajtand kd, ha a kifejezs = cimke1 break; case cimke2: a vgrehajtand kd, ha a kifejezs = cimke2 break; default: a vgrehajtand kd ha a kifejezs klnbzik cimke1 s cimke2-tl; }
Mkdse: egy egyszer kifejezs (leggyakrabban egy vltoz) egyszer kirtkeldik a kifejezs rtke sszehasonltsra kerl mindegyik case kifejezssel a blokkon bell ha egyezst tall, akkor az adott case-ben tallhat kd vgrehajtdik miutn ez megtrtnt, a break utasts lelltja az utastsok vgrehajtst a default utasts arra hasznlhat, hogy le tudjuk kezelni azokat a kifejezseket, rtkeket is, amelyek egy case utastsban sem voltak kezelve
136. oldal
Egy plda:
switch ($x) { case 1: echo "Number 1"; break; case 2: echo "Number 2"; break; case 3: echo "Number 3"; break; default: echo "No number between 1 and 3"; }
Figyelni kell arra, hogy minden egyes case gat zrjunk le egy break-kel, klnben a kvetkez case g is lefut. Ms nyelvektl eltren a case rtkei nem kell, hogy konstansok legyenek. Tetszleges kifejezs alkalmazhat.
Alternatv szintaxis
A PHP a kapcsos zrjelek helyett egy alternatv szintaxist is biztost. Elssorban akkor szoks hasznlni, ha keverni akarjuk a PHP s HTML kdot. A kvetkez plda kzps sora csak akkor fog a kimenetre kerlni, ha a felttel igaz.
<?php if ($a == 5): ?> A is equal to 5 <?php endif; ?>
137. oldal
3.3.2. Ciklusok
Mikor programozunk, nagyon gyakran fordul el, hogy egy adott programrszt (a ciklusmagot) tbbszr szeretnnk lefuttatni. Ezt elrhetjk ciklusok hasznlatval. PHP-ben a kvetkez ciklusok hasznlhatk: while amg a felttel igaz, lefuttatja a programrszt do-while elszr lefuttatja az adott programrszt, s addig ismtli, amg a felttel igaz for az adott programrszt meghatrozott szmban futtatja le foreach az adott programrszt a tmb minden elemre lefuttatja Az ismtelten lefuttatott programrszt ciklusmagnak nevezzk.
A while ciklus
A while utasts lefuttatja a ciklusmagot, amg az adott felttel igaz. Szintaxis:
while (felttel) ciklusmag
Az albbi plda egy olyan ciklust mutat be, amely addig fut, amg az $i vltoz kisebb vagy egyenl, mint 5. Az $i rtke a ciklusmag minden lefutsa vgn 1-el nvekszik:
$i=1; while($i<=5) { echo "The number is " . $i . "<br>"; $i++; }
A do-while ciklus
A do-while utasts legalbb egyszer lefuttatja az adott ciklusmagot, majd annyiszor ismtli azt, amg a felttel igaz. Szintaxis:
138. oldal
do { ciklusmag; } while (felttel);
Az albbi pldaprogram legalbb egyszer nveli az $i vltoz rtkt, majd addig nveli $i-t, amg annak rtke kisebb, mint 5.
$i=0; do { $i++; echo "The number is " . $i . "<br>"; } while ($i<5);
A for ciklus
A for utastst akkor hasznljuk, amikor elre tudjuk, hnyszor kell futtatni egy adott utastst vagy utasts listt. Szintaxis:
for (inicializls; felttel; nvels) { ciklusmag; }
A for utastsnak hrom eleme van. Az els ad rtket a vltozknak, a msodik tartalmazza a felttelt s a harmadikban van az inkrementl (nvel) utasts, ami a ciklust vezrli. Ha tbb mint egy vltoz is szerepel az rtkadsban vagy az inkrementl rszben, vesszvel vlasszuk el ket. A felttel igaznak vagy hamisnak bizonyul a futs sorn. Az albbi plda tszr rja a kpernyre a Hello World! szveget:
for ($i=1; $i<=5; $i++) { echo "Hello World!<br>"; }
rdemes tgondolni, hogy a fenti plda knnyedn trhat while cikluss is:
$i=1; while ( $i<=5) { echo "Hello World!<br>"; $i++; }
rdemes mg megemlteni, hogy a for ciklus nem csak ebben a specilis, ciklusvltozhoz ktd esetben hasznlhat. Brmilyen while ciklus is trhat for cikluss.
A foreach ciklus
A foreach utastst tmbelemekre alkalmazzuk. A $value minden ciklusban az adott tmbelem rtkt kapja meg, s a tmb mutat egygyel tovbblp gy a kvetkez ciklusban mr a kvetkez tmbelemre mutat. Szintaxis:
foreach ($array as $value) { ciklusmag }
139. oldal
A $value rtke alaprtelmezetten egy msolata a tmb elemnek. gy annak mdostsa nem fogja a tmb adott elemt megvltoztatni. A kvetkez plda azt a ciklust mutatja be, amely a kpernyre rja az adott tmb rtkeit.
$arr=array("one", "two", "three"); foreach ($arr as $value) echo "Value: " . $value . "<br>";
Bizonyos esetekben szksgnk lehet nemcsak a tmb elemeire, hanem a kulcsokra is. Ekkor a kvetkez szintaxis alkalmazhat:
foreach (tmb as kulcs => tmbelem) { ciklusmag }
Ebben az esetben a kulcs hasznlatval az eredeti tmbelem is elrhet, akr mdosthat is. A korbban bemutatott $oldalak nev ktdimenzis tmb (3.2.6. fejezet) alapjn a kvetkez kd generlja a ment. Az if utasts az aktv menpont esetn plusz class tulajdonsgot is generl.
<div id="topnav"> <ul> <? foreach ($oldalak as $url => $oldal) { ?> <li<?= (($oldal == $keres) ? ' class="aktiv"' : '') ?>> <a href="<?= ($url == '/') ? '.' : ('?oldal=' . $oldal['fjl']) ?>"><?= $oldal['szoveg'] ?></a> </li> <? } ?> </ul> </div>
A reset fggvny a tmbmutatt az elejre lltja, az each a kvetkezre lpteti. A list fggvny tbbszrs rtkadst tesz lehetv egy tmb alapjn.
140. oldal
A pldban nem szerepel, de rdekes lehetsgeket tartogat a key, current, next s prev fggvny is.
Referencia hasznlata
Ha a tmb aktulis elemt szeretnnk mdostani, akkor referencival is bejrhatjuk a tmbt:
$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; }
Kilps a ciklusbl
A break utastssal ki lehet lpni egy ciklusbl, a hagyomnyostl eltr mdon is. A ciklusmag tetszleges pontjn, ha rfut a vezrls a break utastsra, akkor egy vagy tbb ciklusbl is kilphetnk.
foreach($products as $product) { foreach($product['Data'] as $data) { ... break 2; ... } }
Termszetesen itt is van lehetsg tbbszrs ciklus esetn tbbszrs ciklusmagbl kiugrani:
141. oldal
Fggvnyek ltrehozsa
Egy fggvny tulajdonkppen egy kd blokk, amit akkor futtathatunk, amikor szksgnk van r. Minden fggvny ltrehozsa a function kulcsszval kezddik. A fggvny nevt lehetleg gy vlasszuk meg, hogy utaljon r, milyen feladatot vgez el. Egy egyszer fggvny, amely a szerz nevt rja ki, ha meghvjuk:
function nevKiiras() { echo "A nevem Nagy Gusztv."; }
Fggvnyek hasznlata
A fggvnyt a PHP kd tetszleges ksbbi pontjn meghvhatjuk:
function nevKiiras() { echo "A nevem Nagy Gusztv."; } nevKiiras();
Fggvnyek paramterezse
Els fggvnynk (nevKiiras) egy igen egyszer fggvny. Pusztn egy egyszer szveget r ki. Ha szeretnnk tbb funkcival elltni egy fggvnyt, paramtereket adhatunk hozz. A paramter olyan mint egy vltoz. A paramtereket a zrjelen bell adhatjuk meg.
142. oldal
A kd kimenete a kvetkez:
A nevem Nagy Gusztv.<br> A nevem Nagy Dniel.<br> A nevem Nagy bel.<br>
Ha a hvskor megadjuk a 2. ($foglalozas) paramtert (1), akkor az lesz az rtke. Ha nem adjuk meg (2 s 3) , akkor pedig az alaprtelmezett "tanul" rtket veszi fel. A kd kimenete a korbbival megegyezik.
Paramtertads referencival
Ha meghvunk egy fggvnyt, akkor a paramterknt tadott rtk msolatt hasznlhatjuk. Nzznk egy szm faktorilist kiszmol s kir fggvnyt:
143. oldal
Ha meghvskor 5-t adunk t neki, akkor a fggvnyen bell $ n elszr 5 lesz, majd a ciklusmagban folyamatosan cskken, amg el nem ri az 1-es rtket. Ekzben pedig $fakt rtke 1*5*4*3*2, azaz 120 lesz. Ha a faktorilisok sorozatt szeretnnk kirni, akr egy ciklusban is hvogathatjuk a fggvnynket:
for ($i = 1; $i<5; $i++) { echo $i . " faktorialisa: " . faktorKiir($i) . "<br>"; }
Termszetesen ez nem tl hatkony a megolds szempontjbl, de jl mkdik, s jl illusztrlja a paramtertads mechanizmust: A $i vltoznak mindig csak egy msolata lesz elrhet a fggvnyen bell, s ott az $n mdostsa nem lesz hatssal az $i rtkre. Nha azonban elnys lenne, ha mgse egy msolatot, hanem az eredeti vltozt rnnk el. Pldaknt nzznk egy (nem szokvnyos) abszolt rtk fggvnyt. A paramterknt kapott vltozt talaktja az abszolt rtkre:
function abszolut(&$szam) { if ($szam < 0) $szam = -$szam; } $a = 23; abszolut($a); $b = -12; abszolut($b); abszolut(-8); // hibs!
Ekkor $a rtke nem fog vltozni, de $b rtke igen. Vgl rdemes megjegyezni, hogy az utols sor fordtsi hibt fog okozni.
144. oldal
A korbbi faktorilis szmt fggvnynk helyett rdemes a kvetkez verzit hasznlnunk, mert nem mindig egybl a kimenetre sznjuk a szmts eredmnyt. Segtsgvel pl. kiszmthatjuk az ismtls nlkli kombincik szmt. A kvetkez kd kiszmtja, hogy 5 klnbz krtyalapbl hny flekppen tudunk 3-at kivlasztani, ha a kivlaszts sorrendje nem vltozik:
function faktor($n) { $fakt = 1; while ($n > 1) $fakt *= $n--; return $fakt; } echo faktor(5) / (faktor(3) * faktor(5 - 3));
rvnyessgi kr
Egy fggvnyen bell ltrehozott vltoz loklis a fggvnyre nzve. A vltoz teht a fggvnybl kilpve nem ltszik. De meglep mdon a fordtottja is igaz: egy fggvnyben nem ltszanak a fggvnyen kvl ltrehozott (globlis, vagy ms fggvnybeli loklis) vltozk sem. A globlis vltozkat mgis elrhetv tudunk tenni a global kulcssz hasznlatval.
$a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; }
A global sor nlkl a loklisan ltrejv $a s $b vltozval trtnne meg az rtkads, majd a fggvnybl kilpve ezek rtke el is veszne. Egy msik megolds a $GLOBALS vltoz hasznlata. Ez ugyanis a globlisan ltrehozott sszes vltozt tartalmazza, s brhonnan elrhet, a kvetkez pldnak megfelelen. A kdnak ugyanaz a hatsa, mint az elznek.
$a = 1; $b = 2; function Sum() { $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; }
A globlis elrsek rontjk a program ttekinthetsgt, ezrt nem rdemes a paramtertadst ezzel helyettesteni.
Statikus vltozk
A fggvnyen bell ltrejv loklis vltoz norml esetben nem rzi meg az rtkt. A static kulcssz hasznlatval azonban pont ezt tudjuk elrni.
145. oldal
A fggvny kimenete:
Ezt a fggvnyt 1 alkalommal hvtuk meg.<br> Ezt a fggvnyt 2 alkalommal hvtuk meg.<br> Ezt a fggvnyt 3 alkalommal hvtuk meg.<br>
3.4. Adatbzis-kapcsolat
A PHP fejlesztk leggyakrabban MySQL adatbzis-szervert alkalmaznak. Ezrt ebben a fejezetben a MySQL hasznlatnak alapjait fogjuk ttekinteni. A tma megismershez mindenkppen szksgesek az adatbzis-kezelsi alapismeretek68.
servername: Opcionlis. Meghatrozza azt a szervert, amihez kapcsoldni akarunk. Az alapbellts a kvetkez: localhost:3306 username: Opcionlis. Meghatrozza a MySQL felhasznli nevet, amivel bejelentkeznk. password: Opcionlis. Meghatrozza a MySQL felhasznl jelszavt. Az alapbellts: "" (res sztring).
68 A szerz a tmban nagyra becslt tanra, Dr. Katona Endre Adatbzisok c. eladsjegyzett ajnlja az olvask figyelmbe. Letlthet: http://www.inf.u-szeged.hu/~katona/adatb.htm
146. oldal
Tbb paramter is megadhat, de a fentiek a legfontosabbak.
A kvetkez pldban elmentjk a kapcsolatot egy vltozba ( $con) ksbbi hasznlatra. A die rsz akkor fog vgrehajtdni, ha a kapcsolds nem sikerl:
$con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerult kapcsolatot kiepiteni: ' . mysql_error()); } // ...
A kapcsolat bontsa
A kapcsolat bontsra kerl, ahogy a szkript futsa vget r. Ha ezeltt szeretnnk bontani a kapcsolatot, akkor a mysql_close fggvnyt hasznlva tehetjk meg.
mysql_close($con);
Hogy a PHP vgrehajtsa a fenti parancsot, hasznlnunk kell a mysql_query fggvnyt. Ez elkld egy lekrdezst vagy parancsot a MySQL szervernek.
A lekrdezs szt az SQL SELECT utastsa esetn, a parancs szt pedig minden ms utasts esetn szoks hasznlni.
A mysql_query fggvny msodik paramtere opcionlis. Akkor kell felttlenl hasznlnunk, ha egyszerre tbb adatbzis-kapcsolatot kell ignybe vennnk.
3.4. Adatbzis-kapcsolat
147. oldal
Tbla ltrehozsa
A CREATE TABLE parancs hasznlatval ltre tudunk hozni egy tblt a MySQL adatbzisban. Szintaxis:
CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name3 data_type, ... )
A mysql_query fggvnynek paramterknt kell tadni a CREATE TABLE parancssort. Az adatbzist ki kell vlasztani, mieltt a tblt ltrehozzuk. Az adatbzist a mysql_select_db fggvnnyel tudjuk kivlasztani. A kvetkez plda megmutatja, hogyan lehet egy person nev tblt ltrehozni hrom mezvel. A mezk nevei: FirstName, LastName s Age:
mysql_select_db("my_db", $con); $sql = "CREATE TABLE person ( FirstName varchar(15), LastName varchar(15), Age int )"; mysql_query($sql, $con); mysql_close($con);
MySQL adattpusok
A klnbz MySQL adattpusok legfontosabb jellemzivel folytatjuk:
Numerikus adattpusok
int(size), smallint(size), tinyint(size), mediumint(size), bigiynt(size)
Csak egsz szmokat tartalmaz. A maximlis szmjegyek szmt meg lehet hatrozni a size paramterrel:
decimal(size,d), double(size,d), float(size,d)
Tizedesvesszt tartalmaz szmok. A maximlis szmjegyek szmt meg lehet hatrozni a size paramterben. A tizedesvessztl jobbra lv szmjegyek maximlis szmt a d paramterben lehet megadni.
Szveges adattpusok
char(size)
Fix hosszsg sztringet tartalmaz (betk, szmok s specilis karakterek). A fix hosszsgot zrjelben lehet megadni.
148. oldal
varchar(size)
Vltoz hosszsg sztringet tartalmaz (betk, szmok s specilis karakterek). A maximlis hosszsgot zrjelben lehet megadni
tinytext
Vltoz sztringet tartalmaz egy megadott maximlis hosszsggal, ami 255 karakter.
text, blob
Vltoz sztringet tartalmaz egy megadott maximlis hosszsggal, ami 65535 karakter.
mediumtext, mediumblob
Vltoz sztringet tartalmaz egy megadott maximlis hosszsggal, ami 16777215 karakter.
longtext, longblob
Vltoz sztringet tartalmaz egy megadott maximlis hosszsggal, ami 4294967295 karakter.
sszetett tpusok
enum(value1, value2, ect)
ENUM az ENUMERATED lista rvid formja. 1-65535 rtket tud raktrozni listzva a ( ) zrjelben. Ha egy olyan rtket akarunk beszrni, ami nincs a listban, gy egy res rtk fog beszrdni.
set
A SET (halmaz) hasonl az ENUM-hoz. Azonban a SET 64 listzott ttelt tartalmazhat tbb vlasztsi lehetsggel.
Az elsdleges kulcs arra szolgl, hogy egyedileg azonostani lehessen a sorokat a tblban. Minden elsdleges kulcs rtknek egyedinek kell lennie a tbln bell. Tovbb az elsdleges kulcs mez nem lehet null, mert az adatbzis (ltalban) megkvn egy rtket, amely azonostja a rekordot.
3.4. Adatbzis-kapcsolat
149. oldal
Az adattblk azon mezit, amelyek alapjn gyakran kell a mezket visszakeresni, indexelni szoks. Az elsdleges kulcs mez mindig indexelve van. A kvetkez plda belltja a personID mezt elsdleges kulcsknt. Az elsdleges kulcs mez gyakran egy ID (azonost) szm s gyakran van hasznlva az AUTO_INCREMENT belltssal. Ez automatikusan nveli a mez rtkt, ha egy j rekord addik hozz az eddigiekhez. Hogy biztostva legyen, hogy az elsdleges kulcs mez nem res, ktelezen hozz kell adni a NOT NULL belltst a mezhz. Plda:
$sql = "CREATE TABLE person ( personID int NOT NULL AUTO_INCREMENT, PRIMARY KEY(personID), FirstName varchar(15), LastName varchar(15), Age int )"; mysql_query($sql,$con);
Az utbbi a formt akkor rdemes hasznlni, ha nem minden meznek akarunk rtket adni, vagy nem ugyanabban a sorrendben akarjuk az rtkeket felsorolni. Az itt rtket nem kap mezk automatikusan nvelt (auto increment) vagy alaprtelmezett (default) rtket is kaphatnak. Ha ilyen elrs nem trtnt a tbla ltrehozsakor, akkor NULL (definilatlan) rtket kap. Ahhoz, hogy a PHP vgrehajthassa a fenti parancsokat, a mysql_query fggvnyt kell meghvni. Az elz fejezetben egy Person nev tblt hoztunk ltre, hrom oszloppal: Firstname, Lastname s Age. Ugyanezt a tblt hasznljuk ebben a fejezetben is. A kvetkez plda kt j rekordot fz a Person tblhoz:
mysql_query("INSERT INTO person (FirstName, LastName, Age) VALUES ('Peter', 'Griffin', '35')"); mysql_query("INSERT INTO person (FirstName, LastName, Age) VALUES ('Glenn', 'Quagmire', '33')"); mysql_close($con);
150. oldal
Amikor egy felhasznl az Elkld gombra kattint a HTML rlapon, az adatok elkldsre kerlnek az insert.php fjlnak. Az insert.php fjl egy adatbzishoz kapcsoldik, a mysql_query fggvny vgrehajtja az INSERT INTO parancsot, s az j adat beszrsra kerl az adatbzis tblba. Az insert.php oldal kdja a kvetkez:
$con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerult kapcsolatot kiepiteni: ' . mysql_error()); } mysql_select_db("my_db", $con); $sql="INSERT INTO person (FirstName, LastName, Age) VALUES ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')"; if (!mysql_query($sql,$con)) { die('Hiba: ' . mysql_error()); } echo "1 rekord ltrejtt"; mysql_close($con)
Ez a plda mg nem foglalkozik a biztonsgi krdsekkel. Ellenrzs nlkl soha nem szabad az adatokat felhasznlnunk! A 3.5.3. fejezetben ezekkel a problmkkal is megismerkednk.
3.4.4. Lekrdezs
A SELECT parancs adatok kivlasztsra szolgl egy adatbzisbl. Alapvet (nem teljes) szintaxis:
SELECT column_name(s) FROM table_name WHERE conditions
3.4. Adatbzis-kapcsolat
151. oldal
Ahhoz, hogy a PHP vgrehajthassa a fenti parancsokat, a mysql_query fggvnyt kell meghvni. Az albbi plda kivlasztja az sszes adatot, amely a Person tblban van trolva (A * karakter kivlasztja az sszes adatot a tblban):
$con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerult kapcsolatot kiepiteni: ' . mysql_error()); } mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM person"); while($row = mysql_fetch_array($result)) { echo $row['FirstName'] . " " . $row['LastName']; echo "<br>"; } mysql_close($con);
A mysql_query fggvny ltal visszaadott erforrst a $result vltozban troljuk. Ezzel az erforrssal rhetek el a lekrdezs eredmnyeknt kapott rekordok. A kvetkez pldban a mysql_fetch_array fggvnyt hasznljuk, hogy az els sort megkapjuk tmbknt az adathalmazbl. Minden ksbbi meghvs a mysql_fetch_arrayra a kvetkez sorral tr vissza az adathalmazbl. Ahhoz, hogy kirjuk az sszes sort, a $row vltozt hasznljuk ($row['FirstName'] s $row['LastName']). A mysql_fetch_array fggvny false rtket ad, ha mr nincs tbb rekord. Ezrt is alkalmazhat ilyen egyszeren egy while ciklusban. A mysql_fetch_array fggvny a rekord mezit asszociatv indexekkel s sorszmokkal is elrhetv teszi. A pldnkban a $row['FirstName'] helyett $row[1]-et is rhattunk volna. Ez a megolds azonban kevsb javasolt. A fenti kd kimenete a kvetkez lesz:
Peter Griffin Glenn Quagmire
152. oldal
$con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerult kapcsolatot kiepiteni: ' . mysql_error());} mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM person"); echo "<table border='1'> <tr> <th>Vezeteknev</th> <th>Keresztnev</th> </tr>"; while($row = mysql_fetch_array($result)) { echo "<tr>"; echo " <td>" . $row['FirstName'] . "</td>"; echo " <td>" . $row['LastName'] . "</td>"; echo "</tr>"; } echo "</table>"; mysql_close($con);
Lers Egyenl Nem egyenl Nagyobb Kisebb Nagyobb, vagy egyenl Kisebb, vagy egyenl Tartomnyba ess Mintval val egyezs
3.4. Adatbzis-kapcsolat
153. oldal
Az SQL parancs PHP-ben val futtatshoz a mysql_query fggvnyt kell hasznlnunk. A kvetkez plda kivlasztja az sszes sort a Person tblbl, ahol FirstName=Peter:
$con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Nem sikerult kapcsolatot kiepiteni: ' . mysql_error()); } mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM person WHERE FirstName='Peter'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName'] . " " . $row['LastName']; echo "<br>"; }
Eredmny:
Peter Griffin
Eredmny:
Glenn Quagmire 33 Peter Griffin 35
154. oldal
SELECT column_name(s) FROM table_name ORDER BY column_name DESC
Az elbbi utastssorozat lefordtsra a mysql_query fggvnyt kell hasznlnunk. A kvetkez plda mdost pr adatot a Person tblban:
mysql_query("UPDATE Person SET Age = '36' WHERE FirstName = 'Peter' AND LastName = 'Griffin'"); mysql_close($con);
A feltlts utn a Person tbla kinzete ilyen lesz: FirstName Peter Glenn LastName Griffin Quagmire Age 36 33
3.4. Adatbzis-kapcsolat
155. oldal
A fenti plda PHP szkriptbl val vgrehajtsra a mysql_query fggvnyt hasznlhatjuk. Az albbi kdrszlet trl minden olyan sort a tblbl, ahol a LastName mez rtke Griffin.
mysql_query("DELETE FROM Person WHERE LastName='Griffin'"); mysql_close($con);
LastName Quagmire 33
Age
zradk
A where zradkban gyakran hasznlt logikai opertor mg az in, ritkbban az all, any, exists (ezek fleg begyazott select-nl) az is null s a not is.
156. oldal
55. bra. Adatbzis absztrakcis rteg Erre is ltezik tbbfle megolds, de taln a legelterjedtebb a PDO (PHP Data Objects).
PDO
Nhny pldn keresztl nzzk meg az alapvetbb PDO74 szolgltatsokat.
A megrtshez szksges lehet a PHP objektumorientlt lehetsgeinek (3.8. fejezet) ismeretre.
Kapcsolds adatbzishoz:
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
Rekordszint bejrs:
foreach($db->query('select * from products') as $row) { // ... }
74 http://www.php.net/manual/en/intro.pdo.php
3.4. Adatbzis-kapcsolat
Rekordok mdostsa:
$db->exec("update products set name = 'Sample' where id = 3");
157. oldal
Preparlt lekrdezsek
Preparlt lekrdezs vza:
$statement = $db->prepare('select * from products'); $statement->execute(); $row = $statement->fetch();
A kvetkez pldk az SQL befecskendezses tmads (SQL injection75) elleni vdelem lehetsgeit mutatjk be. Alap technika a preparlt lekrdezsek hasznlata. Preparlt lekrdezs :
$statement = $db->prepare( 'select * from products where id = ? and category = ?'); $statement->execute( array($_GET['id'], $_GET['category'])); while($statement->fetch() as $row) { // ... }
Preparlt beszrs:
$statement = $db->prepare( 'insert into products (name) values(:name)'); $statement->execute( array('name' => $_POST['name'])); $newProductId = $db->lastInsertId();
Preparlt mdosts:
$statement = $db->prepare( 'update products set name=:name where id=:id'); $statement->execute( array('name' => $_POST['name'], 'id' => 123));
A PDO hasznlatval kapcsolatban tovbbi pldkat fogunk megnzni a 3.12. fejezet pldiban.
158. oldal
Minden HTML oldalon tallhat rlapelem automatikusan elrhet a PHP szkriptek szmra.
Plda:
<form action="welcome.php" method="get"> Nv: <input type="text" name="name"> letkor: <input type="text" name="age"> <input type="submit"> </form>
A welcome.php fjl arra hasznlja a $_GET vltozt, hogy elrje az rlap adatait. Az rlap mezk nevei automatikusan a $_GET tmb azonosti lesznek:
<html> <body> dvzllek, <?php echo $_GET["name"]; ?>!<br> Te <?php echo $_GET["age"]; ?> ves vagy. </body> </html>
159. oldal
Hasonl okokbl szoks rlapba rejtett (hidden) mezt elhelyezni. A kitlttt adatokkal egytt ezek az adatok is el fognak jutni a $_GET tmbbe.
URL-kdols
Az URL egy erforrsok megcmzsre alkalmas eszkz kttt karakterkszlettel. Bizonyos karakterek (pl. kezetes betk, egyes rsjelek) kzvetlenl nem szerepelhetnek az URLben, de kdolt formban mr igen. A kdolt karakterek egy % jellel s a kt szmjeggyel lert hexadecimlis rtkkkel rhatk le. Pldul a szkz kdolva %20. rlapok adatainak GET metdussal val elkldse esetn az rlap adatok az URL-ben kerlnek tovbbtsra. Ilyen esetben is fontos szerepet kap a kdols, hiszen egy begpelt rlapmezben brmilyen karakter elfordulhat.
A $_REQUEST vltoz
A PHP $_REQUEST tartalmazza a $_GET, $_POST s $_COOKIE vltozk elemeit. Arra hasznljuk, hogy megkapja a GET s POST metdussal trtnt adatklds eredmnyt. Plda:
dvzllek, <?php echo $_REQUEST["name"]; ?>!<br> Te <?php echo $_REQUEST["age"]; ?> ves vagy.
Biztonsgi okokbl a $_REQUEST hasznlata ltalban kerlend. Meg kell ugyanis gyzdnnk arrl, hogy a fontos adatok tnyleg onnan rkeztek-e, ahonnan mi vrjuk, s nem valahonnan mshonnan.
Amikor a felhasznl a submit gombra kattint, az URL nem fog semmilyen rlap adatot tartalmazni, s a valahogy gy fog kinzni:
160. oldal
http://azenoldalam/welcome.php
gy a welcome.php fjl most mr hasznlhatja a $_POST vltozt, hogy az rlap adatokat elrhesse. Az rlap mezk nevei automatikusan a $_POST tmb azonost kulcsai lesznek:
<html> <body> dvzllek, <?php echo $_POST["name"]; ?>!<br> Te <?php echo $_POST["age"]; ?> ves vagy. </body> </html>
3.5.3. Adatfeldolgozs
A felhasznl ltal bevitt adatok rvnyessgt minden esetben vizsglni kell. A kliens oldali vizsglat (4.9.1. fejezet) a ltogat szmra gyorsabb, s cskkenti a szerver terheltsgt, de nmagban sosem elegend, hiszen egy rosszindulat felhasznl azt knnyedn ki tudja jtszani. Ezrt az adatok szerver oldali vizsglata is szksges, klnsen, ha az rlapnak egy adatbzishoz kell hozzfrnie.
Mit is kaptunk?
Az egyes meztpusok esetn taln nem mindig trivilis, hogy minek is kellene lennie az egyes szitucikban. Ezrt egy egyszer tesztelsi lehetsg a print_r fggvny hasznlata:
<pre> <?php print_r($_GET); ?> </pre>
Tbbes adatok
A select tpus rlap elem s multiple tulajdonsg hasznlata esetn nem csak egy egyszer rtket kellene visszakapunk, hanem egy tmbt. Ilyen esetben az rlapot gy rdemes felptennk:
161. oldal
rlapok kdolsa
Ha UTF-8 karakterkdolssal kldjk ki az oldalainkat, akkor clszer az rlapok esetn is megadni ezt az informcit:
<form action="..." method="post" accept-charset="UTF-8">
Adatok rvnyestse
A felhasznltl rkez adatokban soha nem bzhatunk meg. Emiatt tbbfle ellenrzst kell vgeznnk a teljes biztonsg rdekben. Nzznk meg egy egyszer rlapot:
<form action="myform.php" method="post"> <p>Your Name: <input type="text" name="yourname"><br> E-mail: <input type="text" name="email"></p> <p>Do you like this website? <input type="radio" name="likeit" value="Yes" checked="checked"> Yes <input type="radio" name="likeit" value="No"> No <input type="radio" name="likeit" value="Not sure"> Not sure</p> <p>Your comments:<br> <textarea name="comments" rows="10" cols="40"></textarea></p> <p><input type="submit" value="Send it!"></p> </form>
Ha az rlap adatokat egyszeren eltroljuk s/vagy ksbb felhasznljuk, meglepetseket tapasztalhatunk. Nzzk meg a myform.php egyszer verzijt:
162. oldal
<html> <body> Your name is: <?php echo $_POST['yourname']; ?><br> Your e-mail: <?php echo $_POST['email']; ?><br> <br> Do you like this website? <?php echo $_POST['likeit']; ?><br> <br> Comments:<br> <?php echo $_POST['comments']; ?> </body> </html>
Ha ezt kirjuk a fenti myform.php kddal, az sszes ltogatt elkldjk a fenti webcmre. Ez megengedhetetlen. A kvetkez kd a htmlspecialchars fggvnyt hasznlja a tmadsok kivdsre:
<?php $yourname = htmlspecialchars($_POST['yourname']); $email = htmlspecialchars($_POST['email']); $likeit = htmlspecialchars($_POST['likeit']); $comments = htmlspecialchars($_POST['comments']); ?> <html> <body> Your name is: <?php echo $yourname; ?><br> Your e-mail: <?php echo $email; ?><br> <br> Do you like this website? <?php echo $likeit; ?><br> <br> Comments:<br> <?php echo $comments; ?> </body> </html>
Ezen kvl tovbbi fggvnyek is szba jhetnek az adatok megtiszttsra. Ezek egysges hasznlatra nzznk egy pldt:
163. oldal
A kvetkez felhasznls esetn az els s negyedik mez kitltse ktelez, a kzpsk nem:
$yourname $email $likeit $comments = = = = check_input($_POST['yourname'], "Enter your name"); check_input($_POST['email']); check_input($_POST['likeit']); check_input($_POST['comments'], "Write your comments");
Persze a hibazenetek lekezelsre (die fggvny) ez csak egy els megolds, tovbb kell fejlesztennk.
Regulris kifejezsek
A szintaxis-ellenrzs rgi bevlt mdszere a regulris kifejezsek hasznlata. Itt most nhny pldt fogunk megnzni. A hangsly nem a regulris kifejezsek mkdsn, hanem azok PHP felhasznlsn lesz. Az e-mail cm ellenrzsre egy lehetsges megolds:
$email = htmlspecialchars($_POST['email']); if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { die("E-mail address not valid"); }
URL ellenrzse:
164. oldal
Szmjegyek:
if (preg_match("/\D/",$age)) { die("Please enter numbers only!"); }
Elszr is meglep, hogy nem az rlappal kezdjk a forrskdot. Itt a httrben mr krvonalazdik az a ksbb egyre fontosabb vl logika, ami szerint a lehet legjobban vlasszuk szt a program logikjt a megjelentsi rszektl. A kd elejn el kell dntennk, hogy most elszr akarja ltni a ltogat az oldalt, s res rlappal kell vrnunk, vagy pedig az rlap mr kitltve rkezett vissza a ltogattl. Az els esetben nem fog semmilyen POST adat rkezni. A msodik esetben viszont igen: a Submit Form gomb lenyomsakor mr a POST adatok is elkldsre kerltek. Emiatt az isset fggvny alkalmas a kt eset megklnbztetsre.
165. oldal
A form action paramtert szoks a fenti mdon kitlteni. A $_SERVER['PHP_SELF'] ugyanannak az oldalnak a cme, amely a fenti PHP kdot tartalmazza. Itt is szmtanunk kell azonban egy betrsi lehetsgre. Ha a ltogat a bngszje cm sorba berja a kvetkez cmet, a $_SERVER['PHP_SELF'] vltoz egy gyesen elhelyezett tmadkdot tartalmaz.
http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert('xss') %3C/script%3E%3Cfoo%22
166. oldal
Jl ltszik, hogy a futs vgre az $errorMessage vagy res marad, s ekkor nem volt problma, vagy nem marad res, s felsorolsknt tartalmazza a hibazeneteket, s mr csak ki kell rnunk egy ul elembe. Mg szebb megolds lenne, ha kzvetlenl a mez mellett jelenne meg a hibazenet. (A 3.10.1. fejezetben ltni fogunk erre is pldt.) Ha az rlap feldolgozsa sorn azt lttuk, hogy nem tkletes, s jbl a ltogat fel kell tovbbtani, akkor vissza kell kldennk a korbban kitlttt adatokat. Erre egy egyszer plda:
<input type="text" name="Coal" <?php if (isset($_POST['Coal'])) { ?> value="<?php echo $_POST['Coal']; ?>" <?php } ?> />
Ha a ltogat mr kitlttte a Coal mezt, az isset($_POST['Coal']) igaz lesz, s kirjuk a value rtkeknt. rdemes azt is tgondolni, hogy az if-nek inkbb olvashatsgi jelentsge van, nlkle is megfelel lenne a kimenet: ha a felttel teljeslne, akkor nincs vltozs, ha a felttel nem teljesl, akkor a value res rtkkel jelenik meg.
167. oldal
A form enctype attribtuma hatrozza meg, hogy melyik tartalom tpust hasznljuk, amikor az rlapot elfogadjuk. A multipart/form-data akkor hasznlatos, ha az rlap binris adatot vr, mint pl. egy fjl tartalma feltltskor. Az input elem file tpusa hatrozza meg, hogy a fggvny bemenete fjlknt legyen feldolgozva. Pldul bngszben val megjelentskor lesz egy Tallzs gomb a bemenet mez mellett.
Feltlts engedlyezse felhasznlk szmra nagy kockzattal jr. Kizrlag megbzhat felhasznlk szmra tegyk lehetv fjlok feltltst, s feltlts utn is ellenrizzk a fjlt.
A $_FILES globlis PHP tmb hasznlatval fjlokat tlthetnk fel egy kliens gprl a tvoli szerverre. Az els index az rlap mez neve, a msodik lehet name, type, size, tmp_name vagy error, a kvetkezkppen: $_FILES["file"]["name"]: a feltlttt fjl neve $_FILES["file"]["type"]: a feltlttt fjl tpusa $_FILES["file"]["size"]: a feltlttt fjl mrete byte-okban $_FILES["file"]["tmp_name"]: a szerveren trolt fjl msolatnak tmeneti neve $_FILES["file"]["error"]: a fjl feltltse sorn kapott hibakd Ez a fjlfeltlts egy nagyon egyszer mdja. Biztonsgi okokbl korltozsokat kell bevezetni a felhasznlknl a feltltsekre vonatkozan.
A feltlts korltozsa
Ebben a szkriptben a fjlfeltltst korltokhoz ktjk. A felhasznl kizrlag .gif vagy .jpeg fjlokat tlthet fel, s a fjlmretnek 20 Kb alatt kell maradnia:
168. oldal
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br>"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br>"; echo "Type: " . $_FILES["file"]["type"] . "<br>"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br>"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } } else { echo "Invalid file"; }
A fenti szkript leellenrzi, ltezik-e mr a fjl, ha pedig nem, bemsolja azt upload nev mappba.
169. oldal
3.5.5. Levlklds
A PHP lehetv teszi, hogy kzvetlenl szkriptbl kldjnk e-maileket. Nhny ok, amirt e-mailt szoktunk kldeni egy weboldalrl: regisztrci, hrlevl feliratkozs stb. esetn megerst levl hrlevl a feliratkozott ltogatknak rtests valamilyen esemny bekvetkezsrl A PHP mail fggvnyt arra hasznljk, hogy segtsgvel szkripten bell e-maileket kldjenek. Szintaxis:
mail(to, subject, message, headers, parameters)
to: Ktelezen megadand. Az e-mail cmzettjt/cmzetteit hatrozza meg. subject: Ktelezen megadand. Az email tmja. Ez a paramter nem tartalmazhat j sor (LF, \n) karaktereket. Message: Ktelezen megadand. Az elkldend zenetet hatrozza meg. Minden j sort LF (\n) karakterrel kell elvlasztani. Egy sor terjedelme nem haladhatja meg a 70 karaktert. headers: Opcionlis. Tovbbi fejlceket adhatunk meg, mint pldul From, Cc s Bcc. A tovbbi fejlceket CRLF (\r\n) karakterrel kell elvlasztani. parameters: Opcionlis. Tovbbi paramtereket adhatunk meg a sendmail programnak A mail fggvny hasznlathoz a PHP-nek szksge van egy felteleptett s mkd levelezrendszerre, vagy SMTP kapcsolatra. A hasznland programot a php.ini fjl konfigurcis belltsai hatrozzk meg (3.1.2. fejezet).
Egyszer megolds
A legegyszerbb levlkldsi md PHP-ben a szveges levl kldse. Az albbi pldban elszr deklarljuk a vltozkat ( $to, $subject, $message, $from, $headers), majd a mail fggvnyben felhasznljuk ezeket a vltozkat e-mailkldsre:
170. oldal
$to = "valaki@levele.com"; $subject = "Teszt levl"; $message = "Szia! Ez egy egyszer levl."; $from = "valakimas@levele.com"; $headers = "From: $from"; mail($to,$subject,$message,$headers); echo "A levl elment.";
Elszr megvizsgljuk, hogy az email beviteli mez ki van-e tltve. Ha nincs (pldul ha ez az els ltogats az oldalon), akkor megjelentjk a HTML rlapot. Ha ki van tltve, elkldjk az rlapbl az emailt. Ha az rlap kitltse utn nyomjk meg az elkld gombot, a lap jratltdik, megnzi, hogy az email beviteli mez ki van-e tltve, majd elkldi az e-mailt.
Biztonsgos levlklds
Az elz fejezetben bemutatott mail fggvnynek van egy gyenge pontja: lehetsget ad befecskendezses tmads (injection) megvalstsra. A problma a fent bemutatott kddal, hogy illetktelen felhasznlok be tudnak szrni adatokat a levl fejlcbe a beviteli rlapon keresztl. Mi trtnik, ha a felhasznl a kvetkez szveget rja be az email beviteli mezbe az rlapon?
171. oldal
A mail fggvny a szokott mdon a fenti szveget helyezi el a levl fejlcben, s gy a fejlc tbblet Cc:, Bcc:, s To: mezket tartalmaz. Amikor a felhasznl az elkld gombra kattint, a fenti sszes cmre elkldi a levelet. gy a tmad olyan helyrl kldtt e-mailt, amely eddig nem volt letiltva spam gyan miatt. Emiatt mindenkppen clszer regulris kifejezsekkel ellenrizni, hogy az egyes mezk megfelelnek-e a kvnalmaknak.
3.6. llomnykezels
Mint minden programozsi krnyezetben, PHP-ben is igen gyakori, hogy egyszerre tbb llomnnyal dolgozunk. Egyrszt a forrskdot szoks kln llomnyokba szervezni, msrszt igen gyakran dolgozunk binris vagy szveges adatllomnyokkal is.
Az include fggvny
Tegyk fel, hogy az oldalainkra ugyanazt a ment akarjuk beszrni:
<html> <body> <a href="default.php">Cmlap</a> | <a href="about.php">Magamrl</a> | <a href="contact.php">Kapcsolat</a> ...
Ha mindhrom oldalra (default.php, about.php, contact.php) ugyanezt a ment akarjuk alkalmazni, akkor hagyomnyos megoldssal mindhrom oldalra kzzel be kell illesztennk. Ez azonban tbb okbl sem szerencss. Ehelyett tegyk a fenti kdot egy kln menu.php fjlba, majd minden tovbbi oldalrl csak illesszk be. Pldul a default.php:
<?php include("menu.php"); ?> <h1>dvzlm honlapomon!</h1> <p>Tovbbi szveg...</p> </body> </html>
172. oldal
Termszetesen ha megnzzk a bngszben az llomnyt, akkor ott a beillesztett tartalmat fogjuk ltni:
<html> <body> <a href="default.php">Cmlap</a> | <a href="about.php">Magamrl</a> | <a href="contact.php">Kapcsolat</a> <h1>dvzlm honlapomon!</h1> <p>Tovbbi szveg...</p> </body> </html>
A require fggvny
Ez a fggvny nagyon hasonlt az elzre: mindssze a hibakezelsben van kztk eltrs. Az include warning-ot, vagyis figyelmeztetst ad, ha a beszrt llomnyban szintaktikai hiba van, de a hvs utni kd tovbb fut, mg a require error-t, vagyis hibt ad, s a hv kd futst is megszaktja. Tegyk fel, hogy a wrongFile.php hibs kdot tartalmaz.
<html> <body> <?php include("wrongFile.php"); echo "Hello World!"; ?> </body> </html>
Az include miatt a futs nem szakad meg a hibnl, a hibazenetek utn az echo is lefut:
Warning: include(wrongFile.php) [function.include]: failed to open stream: No such file or directory in C:\home\website\test.php on line 5 Warning: include() [function.include]: Failed opening 'wrongFile.php' for inclusion (include_path='.;C:\php5\pear') in C:\home\website\test.php on line 5 Hello World!
3.6. llomnykezels
173. oldal
A cljainknak megfelelen kell eldntennk, hogy melyik megoldsra van szksgnk. Pl. ha az llomnyban a ksbbiekben szksges fggvny- vagy osztlydefincik tallhatak, akkor a require hasznlata clszer.
Egyedi beilleszts
Van, amikor szndkosan illesztnk be egy llomnyt tbbszr (pl. egy ciklus belsejben), de van, amikor a tbbszrs beilleszts kros lenne (pl. fggvny- vagy osztlydefinci esetn), vagyis el kell azt kerlni. A tbbszrs beilleszts elkerlse vgett alkalmazhatjuk az include_once s require_once fggvnyeket, amelyek hatsra az esetleges tbbszrs beilleszts nem fog megtrtnni.
Statikus megolds
A statikus megolds lehet pl. a kvetkez:
<?php // index.php switch ( @$_GET['action'] ) { case 'edit': include ('actions/edit.php'); break; case 'post': include ('actions/post.php'); break; case 'delete': include ('actions/delete.php'); break; case 'default': include ('actions/view.php'); break; } ?>
Dinamikus megolds
A dinamikus megolds nem ignyli a lehetsgek (az elz pldban akcik) felsorolst, hanem valamely ms forrsbl (pl. fjlrendszer, adatbzis, konfigurcis adatok) derti ki az rvnyes krsek krt.
174. oldal
Nzznk meg egy egyszer vltozatot, ami konfigurcis fjlban, tmbben trolja az egyes oldalak adatait. (A plda knnyen tovbbfejleszthet abba az irnyba, hogy tmb helyett adatbzisbl olvassuk ki az oldalaink adatait.) A plda 3 egyedi s tbb hasonl forrsfjlbl pl fel. Az 56. bra a forrsllomnyok include struktrjt, s a beillesztsek sorrendjt (1-3) mutatja.
A config.inc.php
Ebben a fjlban olyan konfigurcis adatokat helyeznk el, amelyek minden oldallekrs esetn szksgesek lesznek. A fejlc a title s az oldal fcme szmra is tartalmaz informcit:
$fejlc = array( 'cm' => 'Nagy Gusztv', 'mott' => 'Szakmai s szemlyes oldal' );
Az $oldalak tmb a fmenben szerepl menpontokat s a hozzjuk tartoz oldalak adatait tartalmazza. Els eleme a kezdoldalra utal.
$oldalak = array( '/' => array('fjl' => 'kezdo', 'szoveg' => 'Kezdlap'), 'magamrol' => array('fjl' => 'magamrol', 'szoveg' => 'Magamrl'), 'szakmai_oneletrajz' => array('fjl' => 'szakmai_oneletrajz', 'szoveg' => 'Szakmai nletrajz'), 'galeriak' => array('fjl' => 'galeriak', 'szoveg' => 'Galrik'), 'kapcsolat' => array('fjl' => 'kapcsolat', 'szoveg' => 'Kapcsolat'), );
3.6. llomnykezels
$hiba_oldal = array ('fjl' => '404', 'szoveg' => 'A keresett oldal nem tallhat');
175. oldal
Termszetesen ha tovbbi, a fmenn kvli oldalak is lesznek a honlapunkon, akkor jabb tmb segtsgvel azon is definilhatk lennnek. (Persze ekkor az index.php is sszetettebb kell legyen.)
Az index.php
Az index.php feladata a honlap feldolgozsi folyamatnak indtsa, vezrlse. Elszr is a konfigurcis adatokat tltjk be:
include('config.inc.php'); // 1.
A $keres vltozba lltjuk el, hogy melyik oldal lekrse is trtnt. Elszr az oldal GET paramter hinyra kszlnk fel, majd az $oldal tmb alapjn rvnyestjk a krst. A current tmbfggvny az $oldalak aktulis elemt adja vissza. Mivel a tmbt nem jrtuk be, az aktulis elem a tmb legels eleme, vagyis a cmlap.
$keres = current($oldalak); if (isset($_GET['oldal'])) { if (isset($oldalak[$_GET['oldal']])) { $keres = $oldalak[$_GET['oldal']]; } else { $keres = $hiba_oldal; header("HTTP/1.0 404 Not Found"); } }
Ltszik, hogy hibs krsre is fel kell kszlnnk. Vgl az index.tpl.php sablon fjl fejezi be a feladatot:
include('index.tpl.php'); // 2.
Az index.tpl.php
Az index.tpl.php fjl a honlap oldalrl oldalra vltozatlan sablonjt, valamint a vltoz rszek logikjt valstja meg. A kvetkez head rsz pldja jl mutatja a kt rsz egyttest:
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title> <?= $fejlc['cm'] . ( (isset($fejlc['mott'])) ? ('|' . $fejlc['mott']) : '' ) ?> </title> <link rel="stylesheet" href="style.css" type="text/css"> </head>
176. oldal
A minden oldalon egyformn megjelen HTML tagok kztt szerepl PHP rsz a config.inc.php-bl szrmaz adatokat helyettesti be. Persze egyszer behelyettests mellett a PHP valamivel sszetettebb feladatot is megoldhat. Pldul a kvetkez ciklus s feltteles utastsokkal pont az ignyeknek megfelel eredmnyt produklhatunk:
<div id="header"> <h1> <?= $fejlc['cm'] ?> </h1>
A fels ment az $oldalak tmb alapjn generljuk. Ha az aktulis tmbelem ( $oldal) egyenl a krsben ($keres) szerepl oldallal, akkor a kimenetbe az aktiv class tulajdonsgot is belegenerljuk:
<div id="topnav"> <ul> <? foreach ($oldalak as $url => $oldal) { ?> <li<?= (($oldal == $keres) ? ' class="aktiv"' : '') ?>> <a href="<?= ($url == '/') ? '.' : ('?oldal=' . $oldal['fjl']) ?>"> <?= $oldal['szoveg'] ?></a> </li> <? } ?> </ul> </div>
Az egyes oldalak
Az egyes oldalak vltoz trzse jelen pldnkban az oldal knyvtrban tallhat. Az index.tpl.php kvetkez rsze illeszti be az oldalba:
<div id="body"> <? include("oldal/{$keres['fjl']}.tpl.php"); ?> </div>
Pldnk vgn rdemes tgondolni e verzi sablon elv megkzeltst. Termszetesen rdemes a plda hinyossgait is ttekinteni: az adatok nem adatbzisbl, hanem fjlrendszerbl szrmaznak, s csak egyszer foldal s fmen struktrt valst meg.
3.6. llomnykezels
177. oldal
rdemes a tmban Chris Corbyn objektumorientlt megoldst (3.10.2. fejezet) is tanulmnyozni, amely egy egyszer vendgknyv alkalmazs vzlatt mutatja be.
llomnyok vizsglata
A file_exists fggvny segtsgvel lekrdezhetjk, hogy egy llomny ltezik-e:
$filename = '/path/to/foo.txt'; if (file_exists($filename)) { echo "The file $filename exists"; } else { echo "The file $filename does not exist"; }
A kvetkez fggvnyek is hasonl mdon informci lekrdezsre hasznlhatak: is_dir: az llomny knyvtr-e is_file: az llomny llomny-e (vagyis nem knyvtr) is_readable: az llomny olvashat-e is_writable: az llomny rhat-e
llomnyok trlse
Az unlink segtsgvel egy llomnyt trlhetnk a fjlrendszerbl.
Itt rdemes kicsit elidznnk azon, hogy a Unix filozfija szerint egy llomnynak tbb egyenrtk neve (s ezzel egytt elrsi tvonala) lehet egy fjlrendszeren bell. Ha egy tbb nvvel rendelkez llomny egyik nevt trljk, akkor a tbbi nevn mg elrhet marad. Emiatt nem biztos, hogy fizikai trls lesz a fggvny hasznlatnak kvetkezmnye.
$file = "test.txt"; if (!unlink($file)) echo ("Error deleting $file"); else echo ("Deleted $file");
Knyvtrkezels
Knyvtrat ltrehozni az mkdir, trlni az rmdir fggvnnyel tudunk:
mkdir("testing");
178. oldal
A knyvtr nevnek megadsn kvl egyb paramtereket is hasznlhatunk a jogosultsgok megadsra s rekurzv ltrehozsra:
mkdir("/path/to/my/dir", 0700);
Knyvtrak bejrsa
Ha szksgnk van arra, hogy egy knyvtrban tallhat sszes llomnyrl tudomst szerezznk, az opendir, readdir s closedir fggvnyekre lesz szksgnk.
$dir = opendir("images"); while (($file = readdir($dir)) !== false) echo "filename: " . $file . "<br>"; closedir($dir);
Sikeres megnyits esetn a $dir erforrs vltozt adja vissza az opendir fggvny. Ezutn a readdir fggvnyt addig hvogatjuk, amg sztringet, s nem false rtket ad viszsza. Vgl a closedir szabadtja fel a foglalt erforrsokat.
A fontosabb megnyitsi mdok: Md r w a Lers Csak olvass. A fjl elejn kezddik. Csak rs. Megnyitja s trli a fjl tartalmt; vagy egy j fjlt kszt ha a fjl nem ltezik. Hozzfzs. Megnyitja a fjlt s a vgre kezd rni; vagy egy j fjlt kszt ha a fjl nem ltezik.
3.6. llomnykezels
179. oldal
Az albbi plda egy zenetet ad vissza, ha az fopen nem tudja megnyitni a megadott fjlt:
<html> <body> <?php $file=fopen("welcome.txt","r") or exit("Unable to open file!"); ?> </html> </body>
A kd az or rvidzr kirtkelse (3.2.5. fejezet) miatt csak az fopen false visszaadott rtke esetn futtatja az exit fggvnyt.
A fjl bezrsa
Az fclose fggvnyt fjlok bezrsra hasznljuk. Illik ms erforrsokhoz hasonlan a fjlokat a lehet legkorbban elengedni.
<?php $file = fopen("test.txt","r"); //... fclose($file); ?>
Fjlvg ellenrzs
Az feof fggvny ellenrzi a fjlvg (EOF) elrst. Az feof fggvny hasznos ismeretlen hosszsg llomnyon val munknl.
if (feof($file)) echo "End of file";
180. oldal
Binris fjlkezels
PHP-ben viszonylag ritka a kzvetlen binris fjlkezels, legtbbszr szveges llomnyokkal dolgozunk. Amikor mgis szksg van r, akkor pl. a GD Library-t77 hasznljuk kpek ltrehozsra, manipullsra. (Pl. blyegkp kszts, kpek vzjelezse, stb.) Ms feladatokra hasonl magasabb szint megoldsok lteznek. Pldaknt nzznk meg egy egyszer kpkonvertl GD kdot:
$png_image = imagecreatefrompng( "input.png" ); imagejpeg( $png_image, "output.jpg" ); imagedestroy( $png_image );
3.7. Felhasznlkezels
Amita dinamikus weboldalakat fejlesztnk, nagy jelentsge lett annak, hogy a ltogatk szemlyt be tudjuk azonostani. Nem mindegy, hogy egy kls ltogat, vagy a weboldal tulajdonosa, adminisztrtora, vagy szerkesztje ltogatja az oldalt. Ebben a fejezetben megnznk nhny alapvet technikt a tmval kapcsolatban.
77 http://php.net/manual/en/book.image.php
3.7. Felhasznlkezels
181. oldal
A legtbb bngsz egyszer szveges fjlban vagy fjlokban trolja a stik tartalmt, hogy azok a bngsz kikapcsolsa s jraindtsa utn is elrhetek maradjanak. Ezeket stifjloknak nevezik.
Nzznk egy kommunikcis pldt. A bngsz HTTP krst kld a szerver fel:
GET /index.html HTTP/1.1 Host: www.oldalam.com
A szerver vlasza:
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT <!DOCTYPE html ...
Az albbi pldban ltrehozunk egy user nev stit s az Alex Porter rtket rendeljk hozz, tovbb az rvnyessgi idt egy rban hatrozzuk meg.
<?php setcookie("user", "Alex Porter", time()+3600); ?> <html> <body> </body> </html>
A sti rtke automatikusan kdolsra kerl kldskor, s automatikusan dekdoldik kirtkelskor. Kdols nlkli kldshez a setrawcookie fggvny hasznlhat.
182. oldal
A sti kiolvassa
A sti rtke a $_COOKIE tmbben kerl trolsra. Az albbi pldban a user nev sti rtkt, majd az egsz tmb tartalmt rjuk ki a kpernyre.
<?php echo $_COOKIE["user"]; print_r($_COOKIE); ?>
Sti trlse
A sti trlse gyakorlatilag azt jelenti, hogy a stit lejrtnak lltjuk be. Plda trlsre (az rvnyessg lejrtnak belltsa egy rval ezelttire):
<?php setcookie("user", "", time()-3600); ?>
3.7.2. Munkamenet-kezels
A munkamenet-kezelst (session) arra hasznljuk, hogy informcit troljon a felhasznl belltsairl, vagy annak megvltozsrl. Amikor egy asztali (desktop) alkalmazssal dolgozunk, megnyitjuk, vltoztatunk valamit, majd bezrjuk. A szmtgp tudja, hogy ki vgzi a mveletet. Tudja, amikor elindtjuk az alkalmazst, s amikor bezrjuk. De az interneten ez nem gy van. A webszerver nem tudja, hogy kik vagyunk s mit csinlunk, mert a HTTP protokoll nem tartja meg a krsek kzt az llapott. gy is mondjuk, hogy a HTTP protokoll llapotmentes. A munkamenet-kezels megoldja ezt a problmt. Engedlyezi a felhasznlkra vonatkoz informcik trolst a szerveren (felhasznl nv, vsrlsi ttelek, stb.). A session informcik ideiglenesek, s trldnek, miutn a felhasznl elhagyta az oldalt. Ha lland trolsra van szksg, akkor az adatokat adatbzisba kell elmenteni.
3.7. Felhasznlkezels
183. oldal
Munkamenet indtsa
Mieltt informcikat trolnnk, el kell indtani a munkamenetet. A session_start fggvnynek a doctype s a html tag eltt kell szerepelnie:
<?php session_start(); ?> <html> <body> </body> </html>
Az elbbi kd regisztrlja a session-t a szerveren, engedlyezi a felhasznli informcik mentst, s az UID-t tovbbtja a felhasznl szmra.
Adatments munkamenetbe
A session vltozk trolsa s visszaolvassa a $_SESSION vltozval lehetsges:
<?php session_start(); $_SESSION['views']=1; ?> <html> <body> <?php echo "Pageviews=". $_SESSION['views']; ?> </body> </html>
Kimenet:
Pageviews=1
Az elz pldban ksztettnk egy egyszer oldal ltogatottsg szmllt: megszmoljuk, hogy ugyanaz a felhasznl ugyanazon az oldalon hnyszor jrt. Az isset fggvny ellenrzi, hogy a views munkamenet-vltoz kapott-e mr rtket. Ha igen, akkor nveljk eggyel. Ha a views nem ltezik, akkor ltrehozzuk, s belltjuk 1-re:
184. oldal
session_start(); if(isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1; else $_SESSION['views']=1; echo "Views=". $_SESSION['views'];
A session trlse
A session adatok trlse az unset vagy a session_destroy fggvnyekkel trtnik. Az unset fggvnyt egy session vltoz trlsre hasznljuk. Ekkor a munkamenet egyb adatai megmaradnak.
unset($_SESSION['views']);
185. oldal
legalapvetbb jellemzje az egysgbezrs, amely a kd s adat sokkal szorosabb egysgt fejezi ki. Az egysgbezrs az objektumok s osztlyok szintjn is megvalsul.
Objektumok s osztlyok
Egy objektumorientlt program tulajdonkppen objektumokbl ll ssze. Az objektum llapott adattagokkal, viselkedst pedig metdusokkal (tagfggvnyekkel) tudjuk lerni. Az objektumok egymssal kommuniklni elssorban a metdusaikon keresztl tudnak. Az osztly az egyes objektumok elvi tervrajzt, mkdst definilja. Az elnevezs onnan. szrmazik, hogy az egyes objektumok hasonlsgait a tervezs sorn felismerhetjk. Ezt szoktuk osztlyozsnak is hvni. A programkdban teht elszr ltre hozzuk az osztlyok forrskdjt, majd az osztly pldnyai ltrehozva, az objektumokat hlzatknt hasznlhatjuk a feladat megoldsa rdekben. Az objektumok ltrehozst pldnyostsnak hvjuk. A pldny ltrejttekor automatikusan meghvd fggvny neve konstruktor. Az objektum lettartamnak vgn szksges takartst elvgz fggvnyt destruktornak hvjuk.
rklds
Az objektumok, s maguk az osztlyok is kapcsolatban lehetnek egymssal. Az rklds azt fejezi ki, hogy a leszrmazott megfelel az snek, de tovbb finomtja (specializlja) az shez kpest a lehetsgeit. Pldaknt nzzk egy pr gymlcst:
az alma gymlcs a narancs gymlcs a bann gymlcs
Ebben az esetben a 3 fajta gymlcs rendelkezik minden tulajdonsggal s viselkedsi lehetsggel, ami minden ms gymlcsre jellemz, de vannak csak r jellemz tulajdonsgai is. Vagyis a gymlcs osztly leszrmazottai specilisabbak, mint az seik. Nzznk egy msik egyszer pldt. Egy rlap lehetsges mezit szeretnnk modellezni. Egy egyszer (pszeudo) nyelven ezt gy is lerhatnnk:
186. oldal
class formElement { Attributes: id name class } class input extends formElement { Attributes: value type } class textarea extends formElement { Attributes: cols rows }
Tbbalaksg
A tbbalaksg (vagy polimorfizmus) azt jelenti, hogy az egyes osztlyok pldnyai msknt viselkedhetnek egy adott helyzetben. Pldaknt a kvetkez kd ms-ms HTML kimenetet gyrt az egyes rlap elemek esetn:
187. oldal
A fenti objektumok tagjaihoz (akr adattag, akr tagfggvny) csak a nevk lersval nem tudunk hozzfrni. Minden esetben minstett nevet kell alkalmaznunk:
188. oldal
// Tulajdonsgok $myObject->attribute1 = 'Sonic'; $myObject->attribute2 = 'Knuckles'; // Metdusok: $returned = $myObject->method1(); $myObject->method2();
A fenti, PHP 4-es verzijnak megfelel plda mg nem tartalmaz lthatsgi informcikat, vagyis minden publikusan lthat az osztlyon kvlrl is.
A $this vltoz
Ha nem kvl, hanem az osztly trzsn bell szeretnnk a tagokra utalni, akkor ms nyelvekhez kpest meglep mdon szintn ktelez a minstett hivatkozs alkalmazsa. Ilyenkor a $this vltoz segtsgvel rhetjk el a tagokat.
class myClass { var $attribute1; function method1() { // attribute1 rtkt adja vissza return $this->attribute1; }
A konstruktor
A konstruktor egy olyan specilis metdus, amely automatikusan meghvdik az objektum pldnyostsa sorn, s bellthatja az objektum indul llapott. A kvetkez osztly az adatbzissal val kapcsolatot kezeli. A konstruktor megkapja a csatlakozshoz szksges informcikat.
class database { var $str_schema; var $str_host; var $str_user; var $str_password; // Konstruktor: function database($str_schema, $str_host, $str_user, $str_password) { // Adattagok belltsa a paramterek alapjn $this->str_schema = (string) $str_schema; // J szoks a tpusknyszerts alkalmazsa $this->str_host = (string) $str_host; $this->str_user = (string) $str_user; $this->str_password = (string) $str_password; } }
A fenti plda szintn a PHP 4-es logikjt kveti. Az 5-s verziban a konstruktor neve ms lesz.
189. oldal
A destruktor
PHP-ben viszonylag ritkn hasznljuk a destruktort, amely az objektum felszabadtsa eltt hvdik meg. PHP 5-ben gy hasznlhatjuk:
function __destruct() { // A mysql kapcsolat bezrsa if ($this->res_connection) { mysql_close($this->res_connection); } }
3.8.3. rklds
Az rklds a kd jrahasznostsnak egy gyakori mdja. Az albbi formElement osztly adattagjait s tagfggvnyt rkli a leszrmazott dateInput osztly.
class formElement { var $str_id; var $str_name; var $str_class; function isRequired() { // rvnyest kd } } class dateInput extends formElement { var $str_value; // Specilisabb rvnyests function isValidDate() { // rvnyest kd } }
gy a myDate objektum tagjai kztt elrhetk mind a sajt, mind az stl rklt tagok.
$myDate = new dateInput(); $myDate->str_id = 'mydate'; $myDate->str_name = 'mydate'; $myDate->str_value = '2006/06/09'; $myDate->isRequired(); $myDate->isValidDate();
190. oldal
A konstruktorok futsa
rklds esetn a leszrmazott konstruktorbl meg kell hvnunk a szl valamelyik konstruktort. PHP 4-es esetn:
class fruit { // Konstruktor: function fruit() { } } class apple extends fruit { function apple() { // A szl osztly konstruktornak hvsa $this->fruit(); } }
3.8.4. Asszocici
Az egyes objektumok kztt gyakori a tartalmazsi vagy hasonl kapcsolat. Pl. a fal tglkbl ll:
class brick { var $sample_attribute; } class wall { var $brick1; var $brick2; var $brick3; var $brick4; // Konstruktor: function wall() { $this->brick1 = new brick(); $this->brick2 = new brick(); $this->brick3 = new brick(); $this->brick4 = new brick(); } }
A tartalmazsi kapcsolat onnan is ltszik, hogy a fal objektum ltrejttekor automatikusan ltrejnnek a tartalmazott tglk is. Akr egybl hasznlhatjuk is ket:
191. oldal
Nzznk egy msik pldt. Az aut objektumhoz szksges a vezet, nlkle nem jhet ltre:
class person { // ... } class car { var $driver; // Konstruktor: function car(&$driver) { $this->driver = (object) $driver; } } // A person pldnyostsa $me = new person(); // car ltrehozsa a vezet megadsval $myCar = new car($me);
rdemes megfigyelni a konstruktor referencia szerinti paramtertadst. gy a car konstruktor nem egy msolatot kap a vezetbl, hanem a referencijt (lnevt).
3.8.5. Lthatsg
A PHP 5-s objektummodellje abban is jdonsgot hozott, hogy hromfle lthatsgot vezetett be a tagokra nzve: public: kvlrl korltlanul elrhet (ez a PHP 4-es hozzllsa is, a var sz is ezt jelenti) private: csak a sajt osztlyon bell lthat, mg a leszrmazottakban sem protected: a sajt s a leszrmazott osztlybl lthat Adattagokat alapveten privt, esetleg vgett, mg konstruktorokat, metdusokat ltalban publikus lthatsggal hozunk ltre. Nzznk egy egyszer pldt:
192. oldal
class myClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new myClass(); echo $obj->public; // Mkdik echo $obj->protected; // Hiba! echo $obj->private; // Hiba! // Public, Protected s Private kirsa: $obj->printHello(); class myClass2 extends myClass { protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new myClass2(); echo $obj->public; // Mkdik echo $obj2->private; // Definilatlan echo $obj2->protected; // Hiba! // Public, Protected2, s nem Private $obj2->printHello();
A tovbbiakban mr lesz lehetsgnk arra is, hogy a ma egyre elterjedtebb objektumorientlt megkzeltst alkalmazzuk a gyakorlatban is.
3.9. Hibakezels
Amikor webalkalmazsokat ksztnk, a hibakezelssel nagyon fontos trdni. Ha az alkalmazsunk nem vgez korrekt ellenrzseket, az oldal hibsan fog mkdni, s biztonsgi rseket tartalmazhat. Ez a fejezet a PHP-ben leggyakrabban alkalmazott hibakezel mdszereket mutatja be: egyszer die kifejezs hibakezel fggvnyek kivtelkezels
3.9. Hibakezels
$file=fopen("welcome.txt","r");
193. oldal
Ha a fjl nem ltezik, akkor egy ehhez hasonl hibazenetnek kell megjelennie:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 2
Ennek elkerlsre tesztelnnk kell, hogy a fjl valban ltezik-e, mieltt megprblnnk hozzfrni:
if (!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); }
A fenti mdon megakadlyozhat vele, hogy olyan informcikat szivrogtassunk ki, amelyek rosszindulat tmadsokhoz adhatnak tmpontot. A szkript lelltsa nem mindig a megfelel t. Vessnk egy pillantst kt alternatv hibakezel megoldsa. Az els fggvny alap, a msodik objektumorientlt megkzeltst alkalmaz.
A paramterek jelentse: error_level: Ktelez. Megadja, hogy milyen hibkat akarunk lekezelni. Egy szmrtknek kell lennie a 12. tblzatnak megfelelen.
194. oldal
error_message: Ktelez. A hibazenetet tartalmazza.
error_file: Opcionlis. A fjlnevet tartalmazza, ahol a hiba felmerlt. error_line: Opcionlis. A sor szmt tartalmazza, ahol a hiba felmerlt. error_context: Opcionlis. Egy tmbt tartalmaz, amiben benne van minden vltoz s annak rtke, melyek hasznlatban voltak, amikor a hiba felmerlt.
Lers Nem vgzetes futsidej hibk. A szkript vgrehajtsa nem lesz megszaktva. Futsidej figyelmeztets. A szkript tallt valamit, ami lehetsges hibaforrs, de az rtests akkor is elfordulhat, ha a szkript hibamentesen fut. Vgzetes felhasznl ltal generlt hiba. Ez olyan, mint egy E_ERROR, melyet a programoz llt be a trigger_error fggvnyt hasznlva. Nem vgzetes felhasznl ltal generlt figyelmeztets. Ez olyan, mint egy E_WARNING, melyet a programoz llt be a trigger_error fggvnyt hasznlva. Felhasznl ltal generlt rtests. Ez olyan, mint egy E_NOTICE, melyet a programoz llt be a trigger_error fggvnyt hasznlva. Elkaphat vgzetes hiba. Ez olyan, mint egy E_ERROR, de ez elkaphat egy felhasznl ltal definilt hibakezelvel. Minden hiba s figyelmeztets, kivve a E_STRICT szintet.
E_NOTICE
256
E_USER_ERROR
512
E_USER_WARNING
1024
E_USER_NOTICE
4096
E_RECOVERABLE_ERROR
8191
E_ALL
3.9. Hibakezels
Hozzunk ltre egy fggvnyt a hibk kezelsre:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "Ending Script"; die(); }
195. oldal
A fenti kdrszlet egy egyszer hibakezel fggvny. Amikor megkapja a vezrlst, megkapja a hiba szintjt s egy hiba zenetet. Ezutn a kimenetre kldi a hibaszintet s zenetet, s a szkript futsa befejezdik. Termszetesen ez csak egy vzlatos megolds. Ilyen esetben clszer lehet egy log fjlba rni a hibakezelshez szksges informcikat. Most teht, miutn rtunk egy hibakezel fggvnyt, el kell dntennk, milyen esetekben legyen meghvva.
A hibakezel belltsa
Az alaprtelmezett hibakezel a PHP-ban egy beptett fggvny. Most azonban a beptett megolds helyett a fenti fggvnyt fogjuk hasznlni. Lehetsges gy megvltoztatni a hibakezelt, hogy csak bizonyos hibkra vonatkozzon, s a szkript klnbz hibkat klnbzkppen tudjon kezelni. Mi most ebben a pldban a sajt hibakezelt fogjuk hasznlni az sszes hiba esetn:
set_error_handler("customError");
Mivel azt akarjuk, hogy a hibakezel fggvnynk minden hibt kezeljen, a set_error_handler csak egy paramtert kvnt, a msodik csak opcionlis, s a hiba szintjt hatrozza meg. Teszteljk a hibakezelt, olyan vltozt megprblva kiratni, ami nem ltezik:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } set_error_handler("customError"); echo($test);
Hiba elidzse
Egy szkriptben, melyben a felhasznlk adatokat vihetnek be, hasznos lehet a hibk elidzse, amikor egy nem megfelel bevitel addik. A PHP-ban ezt a trigger_error-ral lehetsges. Ebben a pldban hiba trtnik, ha a test vltoz nagyobb, mint 1:
196. oldal
$test=2; if ($test>1) { trigger_error("Value must be 1 or below"); }
Egy hibt meg lehet hvni brhol a szkripten bell, s egy msodik paramter hozzadsval meg lehet hatrozni, hogy milyen hiba szintet akarunk elidzni. Ebben a pldban egy E_USER_WARNING zenet jelenik meg, ha a test vltoz nagyobb, mint 1. Egy ilyen esetben a szoksos hibakezelnket hasznljuk, s befejezzk a szkript futtatst:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "Ending Script"; die(); } set_error_handler("customError",E_USER_WARNING); $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); }
Most, hogy megtanultunk sajt hibakezelt kszteni, s hogy hogyan lehet meghvni ket, vessnk egy pillantst a hiba naplzsra.
Hiba naplzsa
A php.ini error_log konfigurcijban belltott mdon lehetsg van a hiba naplzsnak finomhangolsra. Hibazenetek a sajt email cmre kldse egy j mdszer arra, hogy rtesljnk a klnbz hibkrl.
3.9. Hibakezels
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "Webmaster has been notified"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } set_error_handler("customError",E_USER_WARNING); $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); }
197. oldal
Ezt nem tancsos hasznlni minden hiba esetn. A rendszeres hibkat inkbb a szerveren naplzzuk, a PHP alaprtelmezett naplzsi rendszert hasznlva.
3.9.3. Kivtelkezels
A kivtelkezels objektumorientlt nyelvek esetn gyakran hasznlt hibakezelsi megolds. A fejezet megrtshez szksges a 3.8. fejezet ismerete.
Mi is a kivtel?
A PHP 5-tel egy j objektumorientlt lehetsg is adott a hibk kezelsre. A kivtelkezels hasznlatakor az megvltoztatja az utastsok vgrehajtsnak norml menett, ha egy meghatrozott hiba bekvetkezik. Ezt a felttelt kivtelnek nevezzk. ltalban a kvetkez trtnik kivtel kivltdsnl: A jelenlegi llapot mentsre kerl. A kd vgrehajtsa taddik egy elre meghatrozott kivtelkezel kdra.
A kivteleket csak a hibk felmerlsekor kell lekezelni, s nem lehet arra hasznlni, hogy a kd egy msik he lyre ugorjunk velk.
A kivtelek hasznlata
Amikor kivtel keletkezik, az azt kvet kd nem hajtdik vgre, s a PHP megprblja megtallni a hozz tartoz kivtelkezel catch blokkot.
198. oldal
Ha egy kivtelt egyetlen kezel sem kap el, egy hiba fog keletkezni, egy "Uncaught Exception" (Lekezeletlen kivtel) zenettel. Dobjunk (throw) egy kivtelt anlkl, hogy elkapnnk:
function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } checkNum(2);
3.9. Hibakezels
A fenti kd a kvetkez hibt fogja okozni:
Message: Value must be 1 or below
199. oldal
A fenti kd dob egy kivtelt, s el is kapja azt: 1. A checkNum fggvny azt nzi, hogy a szm nagyobb-e 1-nl. Ha nagyobb, akkor kivtelt dob. 2. A checkNum fggvnyt meghvjuk a try blokkban. 3. A checkNum fggvny kivtelt dob. 4. A catch blokk lekezeli a kivtelt, s elrhetv teszi a kivtel informciit. 5. A hibazenet megjelenik az $e->getMessage() meghvsa alapjn. A legalapvetbb szably: Ha kivtelt dobunk, azt el is kell kapnunk. Tovbbi bevezetsknt rdemes elolvasni a szerz Java programozs80 cm knyvnek 18. fejezett is.
Mi a tervezsi minta?
Ha egy feladat jra elkerl a fejleszts folyamn, akkor valsznleg a megolds hasonl lesz a korbbihoz. A tervezsi mintk olyan objektumkzpont megoldsokat jelentenek, amelyek mr bizonytottak a gyakorlatban. Ezek felhasznlsa rugalmasabban mdosthat s knnyebben, jobban jrahasznosthat alkalmazsokat kszthetnk.
Mivel jelen knyv nem vllalkozhat az objektum-orientlt programozs s tervezs komolyabb lehetsgeit bemutatni, elssorban az alapelvek s nhny egyszerbb megolds kvetkezik. A fejezet megrtshez szksges a 3.8. fejezet ismeretre.
A 3.6.2. fejezetben mr megismerkedtnk a Front Controller minta alapjaival. E fejezetben nhny tovbbi tervezsi mintt fogunk megvizsglni.
80 http://nagygusztav.hu/java-programozas 81 http://www.phppatterns.com 82 http://devzone.zend.com/node/view/id/3
200. oldal
3.10.1. Stratgia
A Strategy egy objektumba zrt algoritmus. Az egysgbezrs miatt az algoritmus jl elklnthet a kd ms rszeitl, az rklds miatt pedig a stratgia knnyen lecserlhet egy msikra.
Validtor plda
A fejezet pldja83 segtsgvel az rlap ltal kldtt adatok rvnyessgnek ellenrzst (validlst) fogjuk elvgezni. Nzznk egy hagyomnyos, nem tl praktikus megkzeltst:
if ( isset ($_POST['submit']) ) { if ( $_POST['user'] < '6' ) { echo ('Username is too short'); } else if ( $_POST['pass'] != $conf ) { echo ('Passwords do not match'); } else if ( $_POST['fullmoon'] == true ) { // ... } }
Ltszik, hogy a kd kiss zavaros, nehezen ttekinthet s mdosthat. Ezen kvl a hibazeneteket is azonnal megjelenti. (Ezt clszerbb lenne az rlap elem kzelben megtenni.) Nzzk meg egy jobb megoldst. A Validator (logikailag84) egy absztrakt osztly, a lnyegi munka a leszrmazottakban fog trtnni.
class Validator { var $errorMsg; function Validator () { $this->errorMsg=array(); $this->validate(); } function validate() { } function setError ($msg) { $this->errorMsg[]=$msg; } function isValid () { if ( isset ($this->errorMsg) ) { return false; } else { return true; } } function getError () { return array_pop($this->errorMsg); } }
83 A plda a http://www.phppatterns.com/docs/design/strategy_pattern oldalrl szrmazik. 84 A plda rsakor elterjedt 4-es PHP verzi mg nem ismeri az absztrakt osztly fogalmt.
201. oldal
Jl ltszik, hogy az ellenrzs sorn a hibk felismerse a hibazenetek megfogalmazst is jelenti. A hibk az $errorMsg tmbben gylnek. A kvetkez osztly a felhasznlnv rvnyessgt ellenrzi:
class ValidateUser extends Validator { var $user; function ValidateUser ($user) { $this->user=$user; Validator::Validator(); } function validate() { if (!preg_match('/^[a-zA-Z0-9_]+$/',$this->user )) { $this->setError( 'Username contains invalid characters'); } if (strlen($this->user) < 6 ) { $this->setError('Username is too short'); } if (strlen($this->user) > 20 ) { $this->setError('Username is too long'); } } }
rdemes megfigyelni, hogy ez a kd pt a PHP azon specialitsra, ami szerint az sosztly konstruktort nem hvja meg automatikusan a leszrmazott konstruktora. (Ebben az esetben az osztly logikja nem is mkdne.) A jelsz s az e-mail cm ellenrzse hasonl logikra pl:
class ValidatePassword extends Validator { var $pass; var $conf; function ValidatePassword ($pass,$conf) { $this->pass=$pass; $this->conf=$conf; Validator::Validator(); } function validate() { if ($this->pass!=$this->conf) { $this->setError('Passwords do not match'); } if (!preg_match('/^[a-zA-Z0-9_]+$/',$this->pass )) { $this->setError( 'Password contains invalid characters'); } if (strlen($this->pass) < 6 ) { $this->setError('Password is too short'); } if (strlen($this->pass) > 20 ) { $this->setError('Password is too long'); } } }
202. oldal
class ValidateEmail extends Validator { var $email; function ValidateEmail ($email){ $this->email=$email; Validator::Validator(); } function validate() { $pattern= "/^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+ (\.[a-zA-Z0-9_-]+)+/"; if(!preg_match($pattern,$this->email)){ $this->setError('Invalid email address'); } if (strlen($this->email)>100){ $this->setError('Address is too long'); } } }
203. oldal
index.php
Objektumorientlt megkzeltsben a Front controller ltalban egy osztly szokott lenni. Ez az osztly vgzi a teljes vezrlst. Az index.php tulajdonkppen csak ennek elksztsre szolgl, hosszabb kdot nem szokott tartalmazni:
<?php define("PAGE_DIR", dirname(__FILE__) . "/pages"); require_once "FrontController.php"; FrontController::createInstance()->dispatch();
FrontController.php
A FrontController osztly pldnyostsa nem a szoksos mdon, az osztlyon kvl, hanem egy gyrt metdussal (createInstance) valsul meg.
<?php class FrontController { public static function createInstance() { if (!defined("PAGE_DIR")) { exit("Critical error: Cannot proceed without PAGE_DIR."); } $instance = new self(); return $instance; }
A dispatch fggvny adja az osztly tnyleges logikjt. Elszr is jl ltszik, hogy a get paramterek kztt page s action rtkekre szmt. Az alaprtelmezett page rtk home lesz, az alaprtelmezett action pedig index.
public function dispatch() { $page = !empty($_GET["page"]) ? $_GET["page"] : "home"; $action = !empty($_GET["action"]) ? $_GET["action"] : "index";
sszelltja a $page paramter alapjn a betltend osztly nevt. A kezdbett nagybetsti az objektumorientlt konvenciknak megfelelen.
$class = ucfirst($page) . "Actions";
Szintn a paramterek alapjn ll ssze a meghvand metdus neve. Ha ltezik, meghvjuk (pl. $controller->doIndex()), s ezzel az osztly befejezte mkdst.
204. oldal
} }
pages/guestbook/GuestbookActions.php
Pldaknt nzzk a vendgknyv funkcionalitst megvalst kd vzlatt.
<?php class GuestbookActions { public function doIndex() { // index (listzs) megvalsts } public function doCreatePost() { // bejegyzs ltrehozsa megvalsts } }
3.10.3. MVC
A fejezet elejn meg kell jegyeznnk, hogy a 3. fejezet htralev rsze jelentsen komplexebb a knyv egyb rszeinl. Ha az Olvas szmra nehezen vagy nem rthet, akkor rdemes egy tolvass utn az alaposabb megismerst elhalasztani, s ksbb visszatrni r.
Az MVC86 (model view controller, modell nzet - vezrl) egy jl hasznlhat, kiprblt mdszer arra, hogy hogyan vlasszuk szt a felhasznli felletet s az alkalmazs logikt. Az elsdleges cl az, hogy a felhasznli fellet megjelentsrt felels kdot teljesen elklntsk. Ezltal annak mdostsa, kiegsztse nem vonja maga utn az alkalmazs logikt megtestest kd mdostst, vagy megismtlst. A mdszer lnyege az, hogy a hagyomnyos eljrs alap programok adatbevitel-adatfeldolgozs-eredmny megjelentse feladatokat lekpezzk a grafikus felhasznli fellettel rendelkez programokban: adatbevitel controller adatfeldologzs model eredmny megjelentse view
205. oldal
A vezrl dolgozza fel a felhasznli adatbevitelt. Fggvnyhvsokk kpezi le azokat. Ezek fogjk elidzni az adatok mdostst, trlst, vagy a nzetek megvltozst. Pldul ha a felhasznl kivlasztja a men egyik elemt, akkor egy vezrl fogja meghatrozni, hogy ennek hatsra mi is trtnjen. A modell reprezentlja az alkalmazs logikt, feladata az adatok kezelsvel kapcsolatos feladatok elvgzse. Ez az egysg felels pl. egy szmla fa tartalmnak s vgsszegnek kiszmolsrt. A modell tudja, hogy melyik vev fogja kifizetni a szmlt, s ha szksges, azt is, hogy ppen szletsnapja van-e ennek a vevnek. A nzet feladata a felhasznli fellet megjelentse. Ez az rlapokat, tblzatokat, linkeket, gombokat, szvegeket jelent. Ezek az elemek megjelenhetnek egy szabvnyos HTML oldalon, de akr egy RSS csatornn is. Vegyk egy konkrt gyakorlati PHP fejleszti pldt. Feladatunk egy felmrs eredmnyeinek megjelentse tblzatban. Hagyomnyos mdszerrel a PHP forrsunk tartalmaz egy SQL lekrdezst, majd az adatokat egy ciklussal kirja egy tblzatba. Ha az gyfelnk ugyanezen adatokat egy grafikonon is ltni szeretn, akkor ltrehozunk egy msik fjlt, ami szintn tartalmazni fogja az SQL krst, s az adatok megjelentst. Az MVC tervezsi minta ezzel szemben tartalmazni fog egy modellt, ami felels az adatbzis kezelsrt, s kt nzetet, ami felels az adatok megjelentsrt. Azt, hogy melyik nzetet kell megjelenteni, a vezrl dnti el a felhasznl krse alapjn. Ha tovbbi nzetekre van szksgnk (pl. krdiagramm vagy esetleg egy szveges magyarzatokkal elltott kimutatsra), akkor csak a megfelel nzetfjlokat kell elkszteni, amelyek a modellbl szrmaz adatokat hasznljk fel.
206. oldal
Fjlstruktra
Az MVC megoldsoknl nagy jelentsge van az alkalmazs knyvtr s llomnystruktrjnak. Nzzk elszr a megoldsunk knyvtrszerkezett. Gykrknyvtrknt a my_mvc knyvtrat fogjuk hasznlni. gy a bngsznkben a http://localhost/my_mvc/ tvonalon tudjuk elrni. ./my_mvc ./my_mvc/application ./my_mvc/application/controller ./my_mvc/application/model ./my_mvc/application/view
.htaccess
tirnytjuk az sszes krst az index.php-nek:
87 http://www.henriquebarroso.com/how-to-create-a-simple-mvc-framework-in-php/
207. oldal
index.php
Az index.php ltja el az alapvet vezrlsi feladatokat. A .htaccess miatt minden krs ide fog rkezni, s ez alapjn tlti be a tovbbi llomnyokat, s hozza ltre az MVC meg felel objektumait. Definiljuk az oldal url-jt s a szerveren belli alap tvonalt:
define("BASE_PATH", "http://localhost"); $path = "/my_mvc";
Az $url hrom szelete fontos szerepet tlt be az URL MVC szerinti kezelshez. Az els a pldnyostand osztly neve, a msodik az objektum fggvnye, a harmadik pedig az tadott tovbbi paramter.
$array_uri['controller'] = $array_tmp_uri[0]; $array_uri['method'] = $array_tmp_uri[1]; $array_uri['var'] = $array_tmp_uri[2];
application/base.php
Az Application osztly a vezrlk sosztlya. rdekes mdon nem csak a leszrmazottaibl fogunk pldnyt ltrehozni, hanem belle is. A megfelel leszrmazott pldnyostst is valstja meg. Ezt a megoldst a Builder (pt) tervezsi mintra hasonlt.
208. oldal
A $class vltoz szintn a paramterbl szrmazik. A plda kd blog lesz, de tovbbfejleszthet tovbbi vezrlkel. Elszr is betlti a vezrl osztlyt.
function loadController($class) { $file = "application/controller/".$this->uri['controller'].".php"; if(!file_exists($file)) die(); require_once($file); $controller = new $class();
Ekkorra mr van vezrl pldnyunk is. Ha a 2. paramter is korrekt, meghvjuk a neki megfelel metdust. Klnben az alaprtelmezetten index mkds lesz. Itt az add s az index mkdsek lesznek elrhetek, ahogy a Blog osztly kdjban hamarosan ltni fogjuk.
if(method_exists($controller, $this->uri['method'])) { $controller->{$this->uri['method']}($this->uri['var']); } else { $controller->index(); } }
A nzet a paramter alapjn tltdik be. De eltte a 2. paramter wddx eltaggal nll vltozkk lesz bontva, hogy a betlttt sablon llomny ez alapjn vgezhesse a behelyettestst.
function loadView($view,$vars="") { if(is_array($vars) && count($vars) > 0) extract($vars, EXTR_PREFIX_SAME, "wddx"); require_once('view/'.$view.'.php'); }
A modell betltse s pldnyostsa is a paramtertl fggen trtnik. Pldnkban model_blog paramterrel fogjuk meghvni.
function loadModel($model) { require_once('model/'.$model.'.php'); $this->$model = new $model; }
209. oldal
Az index az alkalmazsunk blog vagy blog/index tvonalon lesz elrhet. A modell a teljes listzst szimullja. (Az adatbzissal val kommunikci mr nem lesz rsze a pldnak.)
function index() { $articles = $this->model_blog->select(); $data['articles'] = $articles; $this->loadView('view_blog',$data); }
Az add egy j blog bekldst valstja meg. Ez is csak a megolds vzt fogja tartalmazni: az rlapot igen, de az adatok elmentst mr nem tartalmazza.
function add($title="") { $data['title'] = $title; $this->loadView('view_blog_add',$data); }
application/model/model_blog.php
A modell ahogy emltettk igen vzlatos:
class model_blog extends Application { function __construct() { // ide az adatbzis kapcsolat, stb. jhet } function select() { // ide adatbzisbl trtn lekrsek kerlhetnnek return array("title 1","title 2","title3"); } }
application/view/view_blog.php
A sablon llomny blogok (jelenleg csak cmek) listzshoz:
210. oldal
<html> <head> <title>My Blog</title> </head> <body> <h1>My Blog</h1> <?foreach($articles as $article):?> <h3><?=$article?></h3> <?endforeach?> </body> </html>
application/view/view_blog_add.php
A sablon llomny j blog beszrshoz:
<html> <head> <title>My Blog</title> </head> <body> <h1>My Blog</h1> <h3>Title:</h3> <input type="text" value="<?=$title?>"> </body> </html>
Ahogy lthatjuk, egy vzlatos, de ugyanakkor az MVC logikjt jl bemutat pldt ismerhettnk meg. rdemes azonban azt is elmondani, hogy a PHP rugalmassga s a fejlesztk fantzija miatt ugyanezen alapelveket jelentsen eltr ms megkzeltsekben is megvalsthatak.
3.11. Sablonrendszerek
A webfejlesztsben sokszor az MVC-nl egyszerbb mdszert alkalmazunk, vagy a nzet felptst is a sablonozsra bzhatjuk. Ennek lnyege, hogy az alkalmazs logikt s a megjelentsi kdot a lehet legtisztbban vlasszuk el egymstl. gy brmelyik komponens vltozsa esetn a msik komponenshez csak kis rszben, vagy egyltaln nem kell hozznylni. Az alkalmazs-logika s a megjelentsi kd sztvlasztsnak tovbbi elnye, hogy az alkalmazs logikjt megvalst kdon dolgoz fejleszt, s az oldal megjelensvel foglalkoz dizjner akr prhuzamosan, egyms zavarsa nlkl is vgezheti a dolgt. Radsul egyms munkjt is elg alapfokon ismerni az egyttmkdshez.
3.11. Sablonrendszerek
211. oldal
3.11.1. Smarty
A Smarty88 az elmlt vekben mltn vlt az els szm (s sok fejleszt szmra az egyetlen) sablon-motorr. A mai vltozata mr tbb mint egy sablonmotor, taln pontosabb lenne sablon-keretrendszernek nevezni.
Jellemzk
Bevezetsl a Smarty nhny fontos jellemzjt fogjuk megvizsglni.
Gyorstrazott
A Smarty lehetsget nyjt az oldalaink lefordtott llapotnak eltrolsra kt klnbz szinten is. Termszetesen ez a lehetsg finoman konfigurlhat, nem csak globlisan, hanem egyes oldalakra nzve is ki-be kapcsolhat.
Konfigurcis llomnyok
Egy vagy tbb oldalon is felhasznlhatk a kln llomnyokban trolt konfigurcis informcik. Radsul a konfigurcis belltsokat a dizjner nllan is menedzselni tudja, nincs szksg a programoz beavatkozsra.
Biztonsgos
A sablonok nem tartalmaznak PHP kdot. Ezzel cskkentjk ugyan a dizjner lehetsgeinek krt, de ez a legtbb esetben inkbb elnys, mint htrnyos. Radsul van arra is lehetsg, hogy ellenrztt mdon kiterjesszk a Smarty lehetsgeit, teht a problma thidalhat.
Vltoz mdosts
A hasznlt vltozk rtkt knnyedn mdosthatjuk a felhasznlsuk eltt. Pldul nagybetss konvertls, csonkts, szkzk szrse stb.
Sablon fggvnyek
A sablon fggvnyek segtsgvel sszetettebb lehetsgeket is kap a dizjner az egyszer megjelents helyett.
88 http://www.smarty.net/
A programoz teljesen kontroll alatt tudja tartani a kimenetet. Ezt el- vagy utszrk segtsgvel teheti meg. Pl. a 4.7.4. fejezetben bemutatott e-mail cm elrejts csak akkor mkdkpes, ha a @ karakter nem jelenik meg a kimenetben. Egy utszrvel meg lehet oldani, hogy az esetleg a szvegben lev @ karaktereket automatikusan a korbbiakban lertaknak megfelelen elkdolja.
Kiegsztsek
Az alaprendszerhez sokfle kiegszt tlthet le a webrl, s alkalmazhat, vagy akr magunk is fejleszthetnk kiegsztt.
Munkafolyamat Smartyval
A dizjner s a programoz sablonrendszer hasznlatval nagyjbl a kvetkez mdon dolgozhatnak a kvetelmnyspecifikci elksztse utn: A dizjner minden egyes oldaltpushoz kszt egy tisztn HTML mintt. A programoz PHP-ben megvalstja az alkalmazs logikt. Kettjk kommunikcijbl elll a dizjn s az alkalmazs logika csatolfellete (interfsze), ami a vltozk formjban megjelen adatok s a dizjn-elemek kapcsolatt fejezi ki. Ez utn a kisebb (vagyis az interfszt nem befolysol) vltozsok keretn bell a programoz s a dizjner ismt egymstl fggetlenl vgezheti a feladatt.
Smarty alapok
A Smarty f clja az alkalmazs logika s a prezentcis logika sztvlasztsa. Nzznk pldaknt egy cikkeket publikl honlapot. Az egyes cikkeket megjelent oldalak szerkezete hasonl lesz. Lesz az oldalnak fejlce, lblce, cme, rja, megjelensi dtuma, tartalma stb. rdemes megfigyelni, hogy az elz plda logikailag fogalmazta meg az oldalt alkot elemeket. Nem beszlt table s p elemekrl, se a megjelents vizulis, eszttikai rszrl. Rr majd a dizjner azzal foglalkozni, hogy ez HTML (vagy akr RSS, WAP) kd szintjn hogyan fog megvalsulni. A Smarty a sablon fjl alapjn egy PHP llomnyt fog ellltani. Mivel ez kltsges mvelet, gyorstrazza az eredmnyt, hogy a ksbbi krsek gyorsabban kiszolglhatk legyenek.
3.11. Sablonrendszerek
213. oldal
Telepts
A Smarty magja
Ha letltjk a Smarty legfrissebb vltozatt a letltsi oldalrl 89, akkor egy tmrtett llomnyt tallunk. Ennek libs alknyvtra tartalmazza a rendszer magjt. Ennek a knyvtrnak a rendszernkbe msolsa jelenti a telepts els lpst. A knyvtr tartalmt soha ne mdostsuk! A Smarty libs knyvtrban tallhat llomnyait az alkalmazsunkbl el kell tudni rnnk. ppen ezrt vagy egy globlisan elrhet helyre, vagy pl. a portl gykrmappjba clszer helyeznnk. Fontos szerepet tlt mg be a SMARTY_DIR vltoz is. Szoks szerint ez a vltoz tartalmazza a Smarty telepts helyt. Nzzk meg a lehet legegyszerbb pldt:
require_once('Smarty.class.php'); $smarty = new Smarty();
A Smarty hasznlatrl csak akkor beszlhetnk, ha ltrehozunk egy pldnyt a Smarty osztlybl.
Tovbbi knyvtrak
A Smarty szmra tovbbi ngy knyvtrra lesz mg szksg: templates/ templates_c/ configs/ cache/ Ezek a knyvtrak tipikusan a weboldalunk gykrmappjba kerlnek. A templates s configs knyvtrak llomnyait tipikusan a dizjner hozza ltre: sablonok s konfigurcis llomnyok kerlnek beljk. A webszervert futtat felhasznlnak rsi joggal kell rendelkezni a templates_c s cache knyvtrakra, ugyanis ezekben trolja a sablon llomnyokbl fordtott PHP llomnyokat, valamint a gyorstrazott HTML oldalainkat.
A Smarty belsleg ktszint tmeneti trolst tartalmaz. Az els szintet az jelenti, hogy amikor elszr tekin tnk meg egy sablont, a Smarty tiszta PHP kdra fordtja azt, s menti az eredmnyt. Ez a trolsi lps meg akadlyozza, hogy a sablonkdokat az els krelem utn is minden alkalommal fel kelljen dolgozni. A msodik szint, hogy a Smarty az ppen megjelentett (jellemzen HTML) tartalom tmeneti trolst is megvalstja.
89 http://www.smarty.net/download
214. oldal
Hello Vilg!
Eljutottunk az els teljes, mkd alkalmazsunkhoz. Nzzk elszr a sablon llomnyt (templates/index.tpl):
<html> <head> <title>Info</title> </head> <body> <pre> User Information: Name: {$name} Address: {$address} </pre> </body> </html>
A pldn mr ltszik is a sablonelv fejleszts legalapvetbb eleme: a sablon oldal {$name} s {$address} vltozjt szeretnnk kicserlni az aktulis nvre s cmre. Erre a smarty objektum assign metdusnl lthatunk kt hozzrendelst: az objektum tulajdonkppen gyjti az ilyen tpus hozzrendelseket. A sablon llomny feldolgozsa s a sablonvltozk beillesztgetse trtnik meg a display metdus segtsgvel. A kimenet a kvetkez lesz:
<html> <head> <title>Info</title> </head> <body> <pre> User Information: Name: Nagy Gusztv Address: F u. 15. </pre> </body> </html>
3.11. Sablonrendszerek
215. oldal
bl teljesen kivonjuk a logikt, vagy azt jelenti, hogy a kimenet ellltshoz valjban nem tartozik logika. A megjelentsi kdnak az alkalmazsba helyezse pedig nem jobb, mint az alkalmazslogika beptse a megjelentsi kdba. A sablonrendszerek hasznlatnak ppen az a clja, hogy mindkt emltett helyzetet elkerljk. Mindazonltal a sablonokban logikt elhelyezni sok veszlyt rejt. Minl tbb szolgltats rhet el a sablonokban, annl nagyobb a ksrts, hogy maga az oldal tartalmazzon nagy mennyisg kdot. Amg ez a megjelentsre korltozdik, tartjuk magunkat az MVC minthoz. Az MVC nem arrl szl, hogy a nzetbl eltvoltunk minden logikt a cl az, hogy az terletre jellemz mkdsi kdot vegyk ki belle. A megjelentsi s mkdsi kd kztt azonban nem minden esetben knny klnbsget tenni. Szmos fejleszt szmra nem csupn az a cl, hogy elvlasszk a megjelentst az alkalmazstl, hanem az, hogy a megjelentsi kd is minl kisebb legyen. A Smarty ezt a problmt nem oldja meg.
216. oldal
A kimenet pufferelse
A kvetkez plda megrtshez szksgnk lesz a kimenet pufferels mkdsnek megrtsre. Ahogy azt mr tbbszr emltettk, a HTTP header kikldse utn automatikusan elkldsre kerlnek a kliens oldalra a sznt (kimeneti) karakterek. Bizonyos esetekben praktikus lehet ezt a folyamatot manipullni. A kimenet ilyenkor egy tmeneti pufferben gylik, ahonnan a pufferels befejezsvel tnyleg elkldjk a kimenetet a kliens oldalra, esetleg eldobjuk, ha nincs r szksgnk. A tlzott hasznlata nem igazn j programozi magatartst alakt ki, de tudatos alkalmazsa hasznos s megengedhet.
Sablon osztly
Az elz minimlis pldnl valamivel tbbet nyjt a kvetkez sablon osztly. Ez az osztly massassi91 megoldsa alapjn egy kiss testre szabott megolds.
class Sablon { var $dir = 'sablon/';
3.11. Sablonrendszerek
function cserel() { extract($this -> cserek); $cimsor; ob_start(); include($this -> dir . $this -> fajl . '.tpl.php'); $tartalom = ob_get_contents(); ob_end_clean(); return $tartalom; }
217. oldal
A tnyleges sablon mveletet, a cserk megvalstst vgzi. rdemes megfigyelni, menynyire egyszerv teszi a kdot a kimenet pufferelse (ob_* fggvnyek).
function torol() { $this -> cserek = array(); } }
Vgl a trl fggvny lehetv teszi, hogy jabb sablon objektum pldnyostsa nlkl is jra hasznlhassuk a sablonllomnyunkat, pl. tbb azonos sablon alapjn gyrtott blokk generlsra.
Blogbejegyzs
Nzznk egy konkrt pldt a nagygusztav.hu oldal 2006-os verzijbl. A kvetkez sablon llomny (ujBejegyzesekBlokk.tpl.php) egy blogbejegyzs elzetest fog kszteni a kezdoldalra.
<? /* Csak az elzetes megjelentsre, hozzszlsok szmval */ ?> <div class="hir"> <? if ($lehethozza || $tartalom) { ?> <h2><a href="<?= $index ?>?<?= $blognev ?>/<?= $url ?>"><?= $hirCim ?></a></h2> <? } else { ?> <h2><?= $hirCim ?></h2> <? }?> <? if ($datum) {?> <acronym class="datum" title="<?= $datum['hosszu'] ?>"> <span class="honap"><?= $datum['honap'] ?></span> <span class="nap"><?= $datum['nap'] ?></span> </acronym> <? } ?> <?= $hirSzoveg ?> <? if ($lehethozza || $tartalom) { ?> <p class="hozzaszolasszam"> <? if ($tartalom) { ?> <a href="<?= $index ?>?<?= $blognev ?>/<?= $url ?>"> Teljes bejegyzs»</a> <? }?>
218. oldal
<? if ($lehethozza) { ?> Eddig <? if ($hozzaszolasSzam == 0) { ?> nincs <? } else {?> <?= $hozzaszolasSzam ?> <? } ?> <a href="<?= $index ?>?<?= $blognev ?>/<?= $url ?>#hozza">hozzszls</a>. <? }?> </p> <? } ?> </div>
Ezzel el is jutottunk egy jl hasznlhat sablonkezels alapjaihoz. Vgl Medovarszki Mihly: PHP, mint sablonmotor egyszeren cm cikkt92 is ajnljuk a tma kapcsn.
219. oldal
s a Drupal 6 alapismeretek95 cm knyvt.) De sok esetben az is j megolds, ha egy ltalnos cl s nagy tuds (ezzel egytt nagyobb erforrs-igny) rendszer helyett egy pehelysly, az adott feladatra tervezett CMS-t hasznlunk. Jelen fejezet clja, hogy egy rvid betekintst nyjtson a tartalomkezel rendszerek fejlesztsbe. Erre a clra Matt Doyle: Build a CMS in an Afternoon with PHP and MySQL cm nagyszer cikkt96 vesszk alapul. A forrskd letlthet Matt honlapjrl is. A fejezet sorn nhny alapvet tovbbfejlesztsi lehetsgre is ki fogunk trni.
3.12.1. Clok
Kezdjk a clok megfogalmazsval. A mini tartalomkezel rendszernknek a kvetkezket kell tudnia. A publikus fellet (front end): Kezdoldal az 5 legfrissebb cikkel Listz oldal az sszes cikkel Egy cikk megtekintsre szolgl oldal Az adminisztrcis fellet (back end): Adminisztrtor belps, kilps Cikkek listja j cikkek listja Ltez cikk szerkesztse j cikk ltrehozsa Az egyes cikkeknek legyen cmk, sszefoglaljuk, trzsk s bekldsi dtumuk. Vgl nhny tovbbfejlesztsi lehetsg: Hozzszlsok lehetsge Ltogatk regisztrcija Tbb szerz kezelse
95 http://nagygusztav.hu/drupal-6-alapismeretek 96 http://www.elated.com/articles/cms-in-an-afternoon-php-mysql/
220. oldal
58. bra. Adatbzis ltrehozsa Jelen verziban egyetlen articles adattblt hasznlunk, melyben a cikkeket fogjuk trolni. Ennek ltrehozsra hasznlhatjuk a kvetkez SQL parancsot:
CREATE TABLE articles ( id smallint unsigned NOT NULL PRIMARY KEY auto_increment, publicationDate date NOT NULL, title varchar(255) NOT NULL, summary text NOT NULL, content mediumtext NOT NULL );
Nzzk sorba a mezk jelentst: Az id mezt minden olyan tblnl ltre szoks hozni elsdleges kulcsknt, amelyik alapvet adattrolsra szolglt. (Pl. a tbb-tbb kapcsolatot megvalst tblknl nem szoks.) A jelen verzinkban az id-nek mg nincs akkora jelentsge, de ha pl. a hozzszlsok lehetsgt is be akarjuk pteni, akkor a hozzszlsok trolsra szolgl comments tblban egy articles_id nev mezt vezethetnk be kls kulcsknt.
221. oldal
A publicationDate csak a kzzttel dtumt tartalmazza. Ha pontos idpontot is szeretnnk trolni, a datetime tpust rdemes hasznlnunk. A title mez a cikk cmt fogja trolni. Ezt a listz oldalakon, de az egyes cikkek oldalain is fel fogjuk hasznlni. A summary mez a front-end listz oldalakon fog a cm alatt megjelenni. A content mez a bejegyzs szvegt tartalmazza. Tbb lehetsgnk is van, hogy a tblnkat ltrehozzuk.
SQL futtats
A localhost/phpmyadmin cmen kivlasztjuk az adatbzisunkat, majd az SQL fln futtatjuk az SQL parancsot (59. bra)
Varzsl hasznlata
A localhost/phpmyadmin cmen kivlasztjuk az adatbzisunkat, majd a Szerkezet fln az j tbla nevt s a Mezk szmt megadva elindtjuk a varzslt (60. bra). Mivel itt igen sok lehetsg van, csak megfelel hozzrts esetn vlasszuk ezt a mdot.
222. oldal
60. bra. Adattbla ltrehozsa varzsval Az 61. bra a mezk belltsait mutatja. (Az bra csak a belltand oszlopokat tartalmazza.)
PHP futtats
A 3.4.2. forrskdjnak megfelelen futtathatjuk is az SQL parancsot.
3.12.3. Konfigurci
Webalkalmazsok ksztsnl ltalban ltre szoktunk hozni egy konfigurcis llomnyt, ahol a futtatsi krnyezet alap informciit helyeznk el a programunk szmra. Ha esetleg kltztetni kell az alkalmazst, elegend ehhez az llomnyhoz hozznylni.
223. oldal
A kvetkez define utastsok konstansokat hoznak ltre, hogy a forrskdok tovbbi rszben mr ne kelljen vltoztatni egy esetleges szerver kltztets esetn. Elszr az adatbzishoz kapcsolds rszletei kvetkeznek. Felhasznlnv s jelsz az XAMPP alaprtelmezse szerint:
define( "DB_DSN", "mysql:host=localhost;dbname=cms" ); define( "DB_USERNAME", "root" ); define( "DB_PASSWORD", "" );
Abban az esetben, ha tbb felhasznlt is szeretnnk megklnbztetni, akkor majd egy users nev tblt rdemes hasznlni a felhasznlk adatainak trolsra.
Biztonsgi szempontbl nem kzvetlenl a jelszt, hanem valamilyen kdolt vltozatt szoks trolni. Ma a legelterjedtebb megolds az md5 fggvny hasznlata, esetleg tovbbi komplexitsnvel, egyedi tletek beptsvel. Ezekre szp pldkat lthatunk az md5 fggvny dokumentcijban97. Amikor a belpskor bekrjk a jelszt, ugyanazt a kdolst vgezzk el a kapott jelszval, s vgl ezt hason ltjuk a trolt kdolt alakkal. Egyezs esetn a jelsz helyessgt biztosnak vehetjk.
Vgl az Article osztly defincijt futtatjuk. Erre minden esetben szksg lesz a jelenlegi verziban:
require( CLASS_PATH . "/Article.php" );
224. oldal
Adattagok
A classes/Article.php kdja:
<?php class Article
Magyarzatra egyedl az $id szorul. Ennek rtke arra utal, hogy az objektumnak megfelel rekord az adatbzisban mr ltezik-e. Akkor lesz null-tl eltr, ha a rekord ltezik.
A konstruktor
A konstruktor vagy az adatbzisbl, vagy a felhasznltl szrmaz adatokat alapul vve hoz ltre egy objektumot. Az adatokat a $data tmbben kapja, s megfelel ellenrzst vgez rajtuk.
public function __construct( $data=array() ) { if ( isset( $data['id'] ) ) $this->id = (int) $data['id']; if ( isset( $data['publicationDate'] ) ) $this->publicationDate = (int) $data['publicationDate']; if ( isset( $data['title'] ) ) $this->title = preg_replace ("/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['title'] ); if ( isset( $data['summary'] ) ) $this->summary = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['summary'] ); if ( isset( $data['content'] ) ) $this->content = $data['content']; }
Ha a dtum beviteli mez ki lett tltve, akkor a szvegbl dtumot prblunk ellltani:
225. oldal
if ( isset($params['publicationDate']) ) { $publicationDate = explode ( '-', $params['publicationDate'] ); if ( count($publicationDate) == 3 ) { list ( $y, $m, $d ) = $publicationDate; $this->publicationDate = mktime ( 0, 0, 0, $m, $d, $y ); } }
A PDO (PHP Data Objects 98) segtsgvel adatbzis tpustl fggetlenl tudjuk a kommunikcit megvalstani. A $conn objektum a PDO osztly egy pldnya lesz.
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
Az SQL parancs sszelltsnl igen fontos, hogy a vltoz rszek ne nyers adatknt, hanem ellenrztten kerljenek az adatbzisba. Itt egsz szmknt a preparlt lekrdezs hasznlata szp megolds:
$sql = "SELECT *, UNIX_TIMESTAMP(publicationDate) AS publicationDate FROM articles WHERE id = :id"; $st = $conn->prepare( $sql ); $st->bindValue( ":id", $id, PDO::PARAM_INT );
A preparlt lekrdezs ksz a futtatsra (execute). Lekrjk az els tallatot a fetch fggvnnyel. (Itt az SQL lekrdezsnek csak egy rekord kimenete lehet.)
$st->execute(); $row = $st->fetch(); $conn = null;
Cikkek listzsa
A getList fggvny lekri a cikkek listjt az adatbzisbl. A kt paramtere opcionlis. Az els a cikkek darabszmt korltozza, a msodik a rendezettsgre van hatssal.
public static function getList( $numRows=1000000, $order="publicationDate DESC" ) { $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
98 http://php.net/manual/en/book.pdo.php
226. oldal
Az SQL lekrdezs sszelltsnl a mysql_escape_string fggvnyt hasznljuk az SQL injection tmadsok elkerlse rdekben.
$sql = "SELECT SQL_CALC_FOUND_ROWS *, UNIX_TIMESTAMP(publicationDate) AS publicationDate FROM articles ORDER BY " . mysql_escape_string($order) . " LIMIT :numRows"; $st = $conn->prepare( $sql ); $st->bindValue( ":numRows", $numRows, PDO::PARAM_INT ); $st->execute();
Vgl lekrdezzk a tallt sorok szmt, lezrjuk az adatbzis-kapcsolatot, s egy tmbknt visszaadjuk az objektumokat s a tallatok szmt.
$sql = "SELECT FOUND_ROWS() AS totalRows"; $totalRows = $conn->query( $sql )->fetch(); $conn = null; return ( array ( "results" => $list, "totalRows" => $totalRows[0] ) ); }
Ha az objektum mr rendelkezik $id-vel, akkor nem szabad beszrni, mert az $id-t csak adatbzisbl kaphatta, s akkor nem szabad jbl beszrni.
if ( !is_null( $this->id ) ) trigger_error ( "Article::insert(): Attempt to insert an Article object that already has its ID property set (to $this->id).", E_USER_ERROR );
227. oldal
Cikk mdostsa
Az update fggvny segtsgvel az objektum llapotban trtnt vltozsokat az adatbzisba is visszavezethetjk. Ha az id mg nincs kitltve, akkor nincs a cikk az adatbzisban, nincs mit fellrni:
public function update() { if ( is_null( $this->id ) ) trigger_error ( "Article::update(): Attempt to update an Article" . " object that does not have its ID property set.", E_USER_ERROR );
Cikk trlse
A delete fggvny trli a cikket az adatbzisbl az id alapjn.
public function delete() { if ( is_null( $this->id ) ) trigger_error ( "Article::delete(): Attempt to delete an Article" . " object that does not have its ID property set.", E_USER_ERROR ); $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); $st = $conn->prepare ( "DELETE FROM articles WHERE id = :id LIMIT 1" ); $st->bindValue( ":id", $this->id, PDO::PARAM_INT ); $st->execute(); $conn = null; }
} ?>
228. oldal
3.12.5. Front-end
Nzzk meg, hogyan tallkozik a ltogat a weboldal publikus rszvel. A kvetkez index.php llomny pt az Article osztlyra, s a kimenetet sablonok segtsgvel lltja el. Elszr is a Front Controller mintt (3.6.2. fejezet) valstja meg:
<?php require( "config.php" ); $action = isset( $_GET['action'] ) ? $_GET['action'] : ""; switch ( $action ) { case 'archive': archive(); break; case 'viewArticle': viewArticle(); break; default: homepage(); }
Archvum
URL: index.php?action=archive Az archive fggvny betlti az sszes cikk bevezet adatait az Article::getList fggvnnyel, majd az archive.php sablont hvja be (62. bra).
function archive() { $results = array(); $data = Article::getList(); $results['articles'] = $data['results']; $results['totalRows'] = $data['totalRows']; $results['pageTitle'] = "Article Archive | Widget News"; require( TEMPLATE_PATH . "/archive.php" ); }
229. oldal
Cikk megjelentse
URL plda: index.php?action=viewArticle&articleId=7 A viewArticle fggvny egy cikk megjelentst (63. bra) oldja meg, ha megfelel GET paramtert kapott. Klnben a cmlapot jelenti meg.
function viewArticle() { if ( !isset($_GET["articleId"]) || !$_GET["articleId"] ) { homepage(); return; } $results = array(); $results['article'] = Article::getById( (int)$_GET["articleId"] ); $results['pageTitle'] = $results['article']->title . " | Widget News"; require( TEMPLATE_PATH . "/viewArticle.php" ); }
230. oldal
A cmlap
URL: index.php A homepage fggvny a cmlap szmra kri le legfrissebb nhny cikk adatait, s jelenti meg a homepage.php sablon segtsgvel (64. bra).
function homepage() { $results = array(); $data = Article::getList( HOMEPAGE_NUM_ARTICLES ); $results['articles'] = $data['results']; $results['totalRows'] = $data['totalRows']; $results['pageTitle'] = "Widget News"; require( TEMPLATE_PATH . "/homepage.php" ); }
231. oldal
3.12.6. Back-end
Az adminisztrtori fellet hasonlan mkdik a publikus fellethez. Az admin.php vgzi a vezrlst. Fontos eltrs a felhasznl kezelse, a kilps, belps, stb. A felhasznl belpett llapott a username munkamenet vltoz jelzi.
<?php require( "config.php" ); session_start(); $action = isset( $_GET['action'] ) ? $_GET['action'] : ""; $username = isset( $_SESSION['username'] ) ? $_SESSION['username'] : "";
Ha a felhasznl nincs mg belpve, s nem a kilps vagy belps folyamatban van, akkor tirnytjuk a belptetsre, a login rlapra.
if ( $action != "login" && $action != "logout" && !$username ) { login(); exit; }
232. oldal
switch ( $action ) { case 'login': login(); break; case 'logout': logout(); break; case 'newArticle': newArticle(); break; case 'editArticle': editArticle(); break; case 'deleteArticle': deleteArticle(); break; default: listArticles(); }
Belptets
URL: admin.php?action=login A login fggvny vgzi az rlap megjelentst (65. bra) s feldolgozst is.
function login() { $results = array(); $results['pageTitle'] = "Admin Login | Widget News";
65. bra. Login rlap Ha a ltogat mr visszakldte az rlapot, akkor ellenrizzk a nevet s jelszt. Ha korrekt adatokat kapott, a munkamenetbe bejegyzi a felhasznlnevet, s tkldi az adminisztrcis oldalra.
if ( isset( $_POST['login'] ) ) { if ( $_POST['username'] == ADMIN_USERNAME && $_POST['password'] == ADMIN_PASSWORD ) { $_SESSION['username'] = ADMIN_USERNAME; header( "Location: admin.php" ); }
233. oldal
Kilptets
URL: admin.php?action=logout A kilps linkre kattintva a logout fggvny trli a felhasznl nevt a munkamenetbl, gy a tovbbiakban nem tekintjk belpett felhasznlnak.
function logout() { unset( $_SESSION['username'] ); header( "Location: admin.php" ); }
j cikk bekldse
URL: admin.php?action=newArticle A newArticle fggvny vezrli a folyamat minden lpst. legelszr a legutols else g fog lefutni, s ltrehozni az res rlapot (66. bra). rdemes megfigyelni, hogy az editArticle.php sablont hasznlja az j cikk bevitelhez is.
234. oldal
66. bra. Cikk bekldse A $results['formAction'] rtke az rlap action paramtereknt lesz felhasznlva. Ebbl tudja majd ksbb, hogy nem szerkeszteni, hanem bekldeni szeretnnk egy j cikket.
function newArticle() { $results = array(); $results['pageTitle'] = "New Article"; $results['formAction'] = "newArticle";
235. oldal
Cikk szerkesztse
URL plda: admin.php?action=editArticle&articleId=1 Az editArticle fggvny a megadott kd cikket engedi szerkeszteni a 66. bra rlapjn. termszetesen ekkor a cm ms, s az rlap mezk eleve kitltttek.
function editArticle() { $results = array(); $results['pageTitle'] = "Edit Article"; $results['formAction'] = "editArticle";
Ha mr visszakldte a ltogat az rlapot mentsi szndkkal, elszr betltjk az adatbzisbl a jelenlegi llapotot. Sikertelensg esetn hiba oldalra kldjk az adminisztrtort. Egybknt mentnk.
if ( isset( $_POST['saveChanges'] ) ) { if ( !$article = Article::getById( (int)$_POST['articleId'] ) ) { header( "Location: admin.php?error=articleNotFound" ); return; } $article->storeFormValues( $_POST ); $article->update(); header( "Location: admin.php?status=changesSaved" ); }
Cikk trlse
URL: admin.php?action=deleteArticle&articleId=1 A deleteArticle fggvny trli a megkapott azonostval rendelkez cikket. Ellenrzsknt itt is betlti a cikkel az adatbzisbl.
236. oldal
function deleteArticle() { if ( !$article = Article::getById( (int)$_GET['articleId'] ) ) { header( "Location: admin.php?error=articleNotFound" ); return; } $article->delete(); header( "Location: admin.php?status=articleDeleted" ); }
Cikkek listzsa
URL: admin.php A listArticles fggvny a listzs mellett adminisztrcis zeneteket s llapotinformcikat is megjelent.
function listArticles() { $results = array(); $data = Article::getList(); $results['articles'] = $data['results']; $results['totalRows'] = $data['totalRows']; $results['pageTitle'] = "All Articles";
3.12.7. A kinzet
A mini CMS-nk szp megoldsai kzl nem hinyozhat a jl kitallt sablonkezels sem. Terjedelmi okokbl a sablon llomnyok teljes kdjt nem tudjuk itt idzni. Azok rtelmezst is az olvasra bzzuk. Az eddigi forrskdok ismeretben a sablonok feldolgozsa knnyen ttekinthet.
237. oldal
3.13. Keretrendszerek
A tartalomkezel rendszerek mellett igen hasznos megismernnk egy vagy tbb keretrendszer (framework) hasznlatt is. Elszr is nzzk, mi a klnbsg a tartalomkezel rendszerek s a keretrendszerek kztt. Tartalomkezel rendszer vgfelhasznlnak kszl Keretrendszer programoznak kszl
programozsi ismeret nlkl is hasznlhat ers programozsi ismeretek szksgesek gyors megolds, azonnal hasznlhat alap feladatokra van kitallva igen komoly programozi munka szksges hozz brmilyen feladatra alkalmas lehet
3.13.1. Yii
Terjedelmi okokbl itt csak azt tudjuk ajnlani, hogy a ma egyik legkorszerbbnek szmt, s Mhsz Imre100 nagyszer munkssgnak ksznheten magyar szakirodalommal is rendelkez Yii framework101 tanulmnyozsval kezdje a tmt e sorok olvasja.
Mi is a Yii?102
A Yii egy nagyteljestmny, komponens alap PHP keretrendszer nagyszabs webalkalmazsok fejlesztshez. Maximlis jrahasznosthatsgot tesz lehetv a webprogramozs tern, s a fejlesztsi folyamatot is jelentsen meggyorstja.
99 Letlthet a http://nagygusztav.hu/drupal-6-alapismeretek cmrl. 100 http://mehesz.net/ 101 http://www.yiiframework.com/ 102 http://yiihun.blogspot.com/2011/01/mi-is-yii.html alapjn
238. oldal
A Yii egy ltalnos webprogramozsi keretrendszer, ami voltakppen felhasznlhat brmilyen webalkalmazs fejlesztshez. Mivel knnysly (light-weighted) s kifinomult gyorsttrazsi megoldsokat nyjt, kifejezetten alkalmas nagy forgalm alkalmazsok, gy mint portlok, frumok, tartalomkezelk (CMS), e-kereskedelmi rendszerek, stb. fejlesztsre. Mint a legtbb PHP keretrendszer, a Yii egy MVC kertrendszer. A Yii fellmlja a tbbi a keretrendszert a kvetkezkben: hatkony, kpessgekben gazdag, s vilgosan dokumentlt. A Yii a kezdetektl fogva komoly webalkalmazsok fejlesztsre lett tervezve. Nem egy projekt mellktermke vagy netn harmadik fltl szrmaz kdok sszefrcelt vltozata, hanem a szerzk webalkalmazsok fejlesztsben s vizsglatban szerzett tekintlyes tapasztalatnak eredmnye s a legnpszerbb webprogramozsi keretrendszerek s alkalmazsok tkrzdse.
4
4. Kliens oldali mkds
A JavaScript egy olyan kliens oldali szkriptnyelv, amely mra lehetv tette az n. RIA (Rich Internet Application), vagyis a hagyomnyos asztali (desktop) alkalmazsokhoz hasonlan hatkony s knyelmes alkalmazsok fejlesztst.
Pldaknt rdemes pl. a Google nhny szolgltatsval megismerkedni. A Gmail, a Google naptr vagy a Google dokumentumok funkcionalitsa a JavaScript nlkl elkpzelhetetlen lenne.
Termszetesen nem minden weboldal kell, hogy RIA legyen. De a weboldalak millii hasznljk rlapok helyes kitltsnek ellenrzshez, stik kezelshez, a felhasznli lmny nvelshez.
4.1. Alapok
Mi a JavaScript? Szkriptnyelv (teht rtelmezett, a bngsz rtelmezi) Interaktivitst (mkdst) ad a weboldalhoz HTML forrskdba pthet, vagy attl elszeparlhat a kd Esemnyek kezelsre alkalmazhat A neve ellenre nincs szoros kapcsolatban a Java nyelvvel C++ s Java szintaxisra alapoz A szabvny lerst az ECMAScript specifikci tartalmazza
240. oldal
<html> <body> <script type="text/javascript"> document.write("Hello Vilg!") </script> </body> </html>
Az oldalt bngszben megjelentve a Hello Vilg! szveg jelenik meg a kpernyn. Ha megnzzk a bngszben az oldalunk forrst, akkor lthat, hogy ott az eredeti, a webszerverrl letlttt verzi ltszik, s nem a JavaScript ltal mdostott. Jl ltszik a pldn, hogy JavaScriptben elhagyhatjuk a sorokat lezr pontosvesszket. A document.write mdszert a mai korszer megkzeltsben nem illik alkalmazni. Nagyon egyszer kdok kivtelvel nem szoks a JavaScript kdot a body tagba tenni. sszetettebb mkdst inkbb nll fggvnyek formjban szoktunk elhelyezni a head tagba, vagy mg inkbb kls JavaScript llomnyba. Nzzk meg ezek mdjait:
<head> <script type="text/javascript"> function message() { alert("This alert box was called with the onload event") } </script> </head> <body onload="message()"> ... </body>
A pldn ltszik, hogy a body tag betltdsekor (onload esemny) fog lefutni a message nev fggvny, ami egy figyelmeztet dialgusablakot dob fel. Ha a message fggvny kdjt egy message.js llomnyban helyeztk volna, akkor a head rszbe a kvetkez kd lenne szksges:
<script type="text/javascript" src="message.js"></script>
A noscript tag
Ha a bngsz valamilyen ok miatt nem tudja vgrehajtani a script elem tartalmt (pl. a JavaScript ki van kapcsolva), akkor a noscript elem tartalma fog megjelenni.
<script type="text/javascript"> document.write("A bngsz tmogatja a JavaScriptet.") </script> <noscript> A JavaScript nem tmogatott. </noscript>
4.1. Alapok
241. oldal
67. bra. Firefox hibakonzol mkdse Ezen kvl a Firebug kiegszt Konzol fle mg tbb szolgltatst nyjt. Termszetesen ms bngszk esetn is elrhetek hasonl megoldsok.
Ablak esemnyek
Egyedl a body elem esetn hasznlhatk. onload: akkor fut le a szkript, ha az oldal betltdtt onunload: akkor fut le a szkript, ha a felhasznl az oldalt bezrja, vagy ms oldalra lp tovbb
242. oldal
onchange: akkor fut le a szkript, ha az elem tartalma megvltozott onsubmit: akkor fut le a szkript, ha az rlap elkldst kri a felhasznl onreset: akkor fut le a szkript, ha az rlap kezdllapotba ll onselect: akkor fut le a szkript, ha az elemet kivlasztja a felhasznl onfocus: akkor fut le a szkript, ha az elem megkapja a fkuszt onblur: akkor fut le a szkript, ha az elem elveszti a fkuszt
Billentyzet esemnyek
onkeydown: akkor fut le a szkript, ha egy billentyt lenyomott a felhasznl onkeyup: akkor fut le a szkript, ha egy billentyt felengedett a felhasznl onkeypress: akkor fut le a szkript, ha egy billentyt lenyomott s felengedett a felhasznl (Folyamatos nyomva tarts esetn nem csak egy, hanem tbb esemny is bekvetkezhet, az opercis rendszer belltsainak fggvnyben.)
Egr esemnyek
onclick: akkor fut le a szkript, ha egrkattints trtnt ondblclick: akkor fut le a szkript, ha dupla egrkattints trtnt onmousedown: akkor fut le a szkript, ha az egrgombot lenyomta a felhasznl onmousemove: akkor fut le a szkript, ha a felhasznl az adott elem felett mozgatja a kurzort onmouseover: akkor fut le a szkript, ha a felhasznl az adott elemre mozgatja a kurzort onmouseout: akkor fut le a szkript, ha a felhasznl az adott elemrl elmozgatja a kurzort onmouseup: akkor fut le a szkript, ha az egrgombot felengedi a felhasznl
4.1.4. Dialgusablakok
Idnknt szksgnk lehet egy honlapon arra, hogy a felhasznl figyelmt rirnytsuk valamilyen fontos informcira, vagy valamilyen reakcit vrjunk egy dialgusablak segtsgvel. Ezek a dialgusablakok tpusuktl fggen ms-ms fggvnnyel rhetk el. Nzzk meg a fontosabb lehetsgeket pldkon keresztl.
4.1. Alapok
243. oldal
zenetablak
Az zenetablak csupn egy egyszer informcit kzl, ezrt az alert fggvnynek is csak egy paramtert kell megadnunk. A felhasznl mindssze tudomsul veheti a kzlt zenetet.
<head> <script type="text/javascript"> function disp_alert() { alert("Figyelmeztet ablak!") } </script> </head> <body> <form> <input type="button" onclick="disp_alert()" value="Gomb"> </form> </body>
Az eredmny:
Krds
Bizonyos esetekben hasznos, ha a felhasznltl kln dialgusablakbl krnk vlaszt egy eldntend krdsre. Bizonyos esetekben ez praktikusabb, mint egy oldalon elhelyezett rlap. rdemes azonban arra is figyelni, hogy csak tnyleg indokolt esetben alkalmazzunk zenetablakokat! A confirm fggvny visszatrsi rtke jelzi, hogy a felhasznl melyik gombot vlasztotta.
244. oldal
<head> <script type="text/javascript"> function disp_confirm() { if (confirm("Krds")) { document.write("OK") } else { document.write("Mgse") } } </script> </head> <body> <form> <input type="button" onclick="disp_confirm()" value="Gomb"> </form> </body>
Az eredmny:
Egyszer adatbevitel
A prompt fggvnnyel egy egysoros szveg bevitelt krhetjk a felhasznltl. A fggvny els paramtere az zenet szvege, a msodik pedig az alaprtelmezett vlasz (nem ktelez megadni). Itt is a fggvny visszatrsi rtkn keresztl juthatunk a felhasznl vlaszhoz. (Ha a felhasznl a Mgse gombot vlasztotta, null a visszaadott rtk.)
<head> <script type="text/javascript"> function disp_prompt() { var name=prompt( "Add meg a neved","Nvtelen") if (name!=null && name!=""){ document.write( "Szia " + name + "!") } } </script> </head>
4.1. Alapok
<body> <form> <input type="button" onclick="disp_prompt()" value="Gomb"> </form> </body>
245. oldal
Az eredmny:
71. bra. Dialgusablakok dinamikus ltrehozsa A Tpus segtsgvel a 3 -fle dialgus-tpus kzl vlaszthatunk, az zenet szvege kerl a dialgusablakba, a Vlasz mez pedig a fggvny visszatrsi rtkt jelenti majd meg. Nzzk az rlap kdjt:
246. oldal
<h1>Dialgusablak</h1> <form name="urlap" method="get" action="#"> <fieldset> <legend>Tpus</legend> <label><input checked="checked" type="radio" name="tipus" value="alert">Figyelmeztets</label> <label><input type="radio" name="tipus" value="confirm">Krds</label> <label><input type="radio" name="tipus" value="prompt"> Adatbevitel</label> </fieldset> <fieldset> <legend>Szveg</legend> <label>zenet szvege: <input type="text" name="szoveg" value=""></label> <label>Vlasz: <input type="text" name="valasz" value="Vlasz"></label> </fieldset> <input onclick="uzenet();" type="button" name="gomb" value="Dialgus ablak" ></input> </form>
Annak vizsglsra, hogy melyik rdigomb is a kivlasztott, a rdigomb checked tulajdonsgnak figyelst kell megoldanunk. rdemes megfigyelni, hogy milyen logika szerint rjk el az egyes rlapelemeket:
document.urlap.tipus[0].checked
4.2. Vltozk
247. oldal
4.2. Vltozk
A vltozk olyan trolk, amelyekbe adatokat helyezhetnk. A vltoz rtkt meg tudjuk vltoztatni a szkript futsa sorn. A vltozra a nevvel tudunk hivatkozni, s az rtkt brmikor lekrdezni vagy mdostani. A vltoz nevek (mint ahogy az egsz JavaScript nyelv) kis-nagybet rzkenyek, s betvel vagy alhzs karakterrel kezddnek. A tovbbi karakterek kztt szm is lehet. ltalban treksznk a rvid, de kifejez nevek hasznlatra, pl. carname.
Ebben az esetben a vltozknak mg nincs rtke, vagyis a specilis undefined rtket veszi fel. A deklarcit kezdrtkadssal (inicializlssal) egytt is rhatjuk:
var x=5; var carname="Volvo";
Konstansok
Tbb ms nyelvhez hasonlan a JavaScriptben is a const kulcsszval van lehetsgnk arra, hogy egy vltoz rtke csak egyszer bellthat legyen.
conts PI = 3.14;
248. oldal
4.2.2. Tpusok
Egyszer pldk esetn nem tl sokat kell foglalkoznunk a tpusok krdsvel, hiszen a JavaScript ms szkriptnyelvekhez hasonlan dinamikus tpusrendszer, vagyis a vltoz aktulis rtke hatrozza meg a tpust, ami brmikor megvltoztathat, pl. egy ms tpus kifejezs rtkadsval. A vltozk tpusa lehet objektum, primitv rtk (undefined, null, boolean, string, number) vagy metdus (fggvny objektum). Nzznk nhny pldt: a 43 vagy 3.14 szm (Number) tpus a true s a false logikai (Boolean) tpus a "Hello" sztring (String) tpus a null s az undefined specilis esetekben szerepet kap rtkek A sztringek tulajdonkppen objektumok, pl. lekrdezhetjk a sztring hosszt:
var s = "alma" var h = s.length
Az opertor a kvetkez sztringek valamelyikt adja vissza: number, string, boolean, object, function, undefined.
4.2.3. Literlok
Konkrt rtkeket a kvetkez mdon tudunk JavaScriptben lerni.
Szmok
Egsz szmokat tbbnyire 10-es szmrendszerben adunk meg. Pl.
4.2. Vltozk
var a = 0 var b = 123 var c = -5000
249. oldal
Tmb
Tmb literlok a kvetkez mdon hozhatak ltre: var szamok = [2, 3, 3, , 5] A pldbl ltszik, hogy a tmb elemei kihagyhatk, ezen rtkk undefined lesz.
Szrting
Szringeket idzjelekkel vagy aposztrfokkal tudunk ltrehozni. Hasznlhatak a szoksos specilis karakterek is.
var s1 = 'alma' var s2 = "korte" var s3 = "c:\\temp"
Objektum
Objektum literlok kulcs-rtk prok felsorolsval adhatak meg:
var myRotator = { path: 'images/', speed: 4500, images: ["smile.gif", "grim.gif", "frown.gif", "bomb.gif"] }
Ez gy a C nyelv struktrinak felel meg, komplexebb pldkat ksbb, a 4.6. fejezetben fogunk megnzni.
250. oldal
Az + opertor (sszead opertor) sszeadja a kt operandus rtkt. A kvetkez kd kiszmolja a 7-es rtket, s eltrolja az x vltozban:
y=5; z=2; x=y+z;
4.3.1. Opertorok
Nzzk meg a fontosabb opertorokat. Ez nagyrszt csak ismtls lesz a PHP opertorok ismeretben.
Aritmetikai opertorok
Az aritmetikai opertorok matematikai mveleteket hajtanak vgre. opertor + nv sszeads plda
x=2 y=2 x+y x=5 y=2 x-y x=5 y=4 x*y 15/5 5/2 5%2 10%8 10%2 x=5 x++ x=5 x--
eredmny
4
kivons
szorzs
20
/ %
3 2.5 1 2 0 x=6
++ --
x=4
251. oldal
rtkad opertorok
Az rtkad opertorok a bal oldali operandus rtkt vltoztatjk meg a jobb oldali kifejezs rtkre (els sor), vagy mdostja a jobb oldali rtkkel (tovbbi sorok). Ha x=10 s y=5, akkor: opertor
= += -= *= /= %=
plda
x=y x+=y x-=y x*=y x/=y x%=y
eredmny
x=5 x=15 x=5 x=50 x=2 x=0
sszehasonlt opertorok
Az sszehasonlt opertorok logikai kifejezst lltanak el. opertor
== ===
plda
5==8 X=5; y="5"; x==y x===y 5!=8 5>8 5<8 5>=8 5<=8
eredmny
false
nem egyenl nagyobb, mint kisebb, mint nagyobb, vagy egyenl, mint kisebb, vagy egyenl, mint
252. oldal
Logikai opertorok
A logikai opertorok logikai rtkekbl jabb logikai rtket lltanak el. opertor
&&
nv s
plda
x=6 y=3 (x < 10 && y > 1) (x==5 || y==5) !(x==y)
eredmny
|| !
vagy nem
Sztring opertor
Sztringek sszefzsre a + opertor egyszeren alkalmazhat:
txt1="Ez egy nagyon " txt2="szp nap!" txt3=txt1+txt2
Az eredmny: 10.
x="5"+"5"; document.write(x);
Az eredmny: 55 (sztring tpus). Hogy mg rdekesebb legyen, a kivons esetn a PHP-nl megszokott konverzi trtnik:
253. oldal
Feltteles opertor
A hromoperandus feltteles opertor egyszer esetekben egy if-else utastst is kivlthat. Szintaxis:
vltoznv = (felttel) ? kifejezshaigaz : kifejezshahamis
A felttel teljeslse esetn vltoznv rtke kifejezshaigaz rtke lesz, klnben pedig kifejezshahamis rtke. A kvetkez plda a J reggelt jabb verzija:
var d=new Date() var time=d.getHours() var message = "J " + ((time<9)?"reggelt":"napot") + "!" document.write(message)
4.4.1. Elgazsok
Kd rsa kzben nagyon gyakran alkalmazunk elgazsokat, hogy klnbz esetek kztt klnbsgeket tudjunk tenni. A JavaScript a C-hez s Javhoz hasonlan tbbfle elgazst ismer.
if
utasts
Akkor hasznljuk, ha egy adott felttel beteljeslse esetn szeretnnk valamit vgrehajtani. Szintaxis:
if (felttel) { utasts }
254. oldal
var d=new Date() var time=d.getHours() if (time<9) { document.write("<strong>J reggelt!</ strong >") }
if-else
utasts
Akkor van szksgnk erre az utastsra, ha a felttelnk teljeslse mellett a nem teljesls esetn is kell valamilyen feladatot elltni. Szintaxis:
if (felttel) { utasts ha igaz } else { utasts ha hamis }
switch
utasts
Ez az utasts akkor alkalmazhat nagyszeren, ha egy adott kifejezs klnbz rtkei esetn ms-ms feladatot kell a kdnak vgrehajtani. Szintaxis:
switch(n) { case 1: utasts 1 break case 2: utasts 2 break default: utasts }
Elszr az n kifejezs kirtkelse trtnik meg, majd a lehetsges case esetek kztt prbl a bngsz megegyezt tallni. Ha esetleg nincs, akkor a default cmke fog aktivldni. A break pedig azrt szksges, hogy a programunk ne tudjon a msik esetre rcsorogni.
255. oldal
4.4.2. Ciklusok
A ciklusok lehetv teszik, hogy egy kdot tbbszr vgrehajtsunk.
for
ciklus
A for ciklust akkor szoks alkalmazni, ha a ciklus elkezdse eltt lehet tudni, hnyszor kell majd a ciklusnak lefutnia. Jellemz szintaxis:
for (vltoz=kezdrtk; vltoz <= vgrtk; vltoz++) { ciklusmag }
Fontos szerepet tlt be a vltoz, amelyet ciklusvltoznak is szoks hvni. A ciklusmag lefutsnak szma a ciklusvltoz kezd s vgrtktl, valamint a vltoz nvelsi mdjtl fgg. A kvetkez plda egy szmkitall jtk alapja lehet.
for (i = 1; i <= 10; i++) { document.write("<input type=button value=" + i + " onclick=\"alert("+ i +")\"> ") }
Az eredmny:
256. oldal
s do-while ciklusok
Ezeket a ciklusokat akkor szoks alkalmazni, ha nem tudjuk elre, hnyszor kell a ciklusmagnak lefutnia. Sokszor ciklusvltozra nincs is szksg, a ciklus futsi felttele valamilyen ms mdon ll ssze. A while ciklus magja addig fut, amg a felttel igaz. (Akr vgtelen ciklus is lehet logikailag. A gyakorlatban a bngsz egy id utn lelltja a tl sokig fut szkriptet.)
while (felttel) { cikusmag }
A do-while ciklus logikja csak abban ms, hogy mindenkppen lefut egyszer a ciklusmag, s csak ez utn rtkeldik ki a felttel:
do { cikusmag } while (felttel);
Vezrlstads
Nem kevs fejtrst okozott a programozs trtnetben a strukturlatlan nyelvek goto utastsa. Ezrt a strukturlt nyelvek szk keretek kztt teszik csak lehetv a vezrlstad utastsok hasznlatt. A C alap nyelvekben a break s continue utastsok hasznlhatk a ciklus teljes, vagy csak az aktulis ciklusmag futs megszaktsra. (A break a switch-case szerkezetben mr bemutatta kiugrsi feladatt.) A kvetkez plda a korbbihoz hasonlan gombokat hoz ltre, de a 3-al oszthat szmokat kihagyja:
for (i = 1; i <= 10; i++) { if (i%3 == 0) continue; document.write("<input type=button value=" + i + " onclick=\"alert("+ i +")\"> ") }
Az eredmny:
257. oldal
ciklus
A for ciklust gyakran hasznljuk arra, hogy valamilyen trol elem, pldul tmb minden elemvel csinljunk valamit. Ilyen esetekben a szintaxist egyszersteni tudja a for-in ciklus. Szintaxis:
for (vltoz in objektum) { ciklusmag }
A ciklusmag annyiszor fog lefutni, amennyi az objektum elemeinek szma. St a ciklusmagban a vltoz kifejezssel kzvetlenl hivatkozhatunk az ppen bejrt elemre. A kvetkez plda egy tmb elemeit rja ki egyms al:
var mycars = new Array() var x mycars[0] = "Saab" mycars[1] = "Volvo" mycars[2] = "BMW" for (x in mycars) { document.write(mycars[x] + "<br>") }
4.5. Fggvnyek
A fggvnyek103 az jra felhasznlhat kd egyszer eszkzei. Egy egyszer megrt fggvnyt a kd klnbz helyein tetszlegesen sokszor meghvhatjuk. (Egy jl megrt fggvnyt akr egymstl jelentsen eltr weboldalakon is hasznlhatunk.) Msrszt a fggvnyek teszik lehetv, hogy a HTML kdtl minl jobban elvlasszuk a viselkedsi rteget megvalst JavaScriptet. (Hasonlan, mint ahogy a megjelentst meghatroz CSS-t is elklntjk.) A fggvnyek hasznlatnak egyik legegyszerbb esete, amikor valamilyen esemny bekvetkeztekor egy esemnykezel fggvnynek adjuk t a vezrlst. A korbbi pldk is jl mutatjk ezt a megkzeltst. rdemes azonban kitrni arra is, hogy a Javascript nyelv meglep jdonsgokat tartalmaz az objektum-orientlt nyelvek ismeri szmra is. Ez a jelents eltrs taln itt, a fggvnyek tmjtl kezdve mutathat ki leginkbb. A Javascript fggvnyeit hozzrendelhet103 A fejezet ksztsnl hasznlt, s tovbbi informcikrt ajnlott Galiba Pter: JavaScript fggvnyek cm nagyszer cikke. http://weblabor.hu/cikkek/javascript-fuggvenyek
258. oldal
jk vltozkhoz s objektum tulajdonsgokhoz, tadhatjuk ket paramterknt ms fggvnyeknek, valamint egy fggvny illetve metdus is trhet vissza fggvnnyel.
Fggvnydeklarci
A fggvnyek ltrehozsra leginkbb ismert megolds a fggvnydeklarci. A deklarci szintaxisa:
function fggvnynv(par1,par2,...,parX) { fggvnytrzs }
A function kulcssz a PHP nyelvhez hasonlan nem elhagyhat. A kerek zrjelek kztt a fggvnyek paramtereit adhatjuk meg. (Termszetesen paramter nlkli fggvnyeket is kszthetnk, de a zrjeleket ekkor is alkalmaznunk kell.) A fggvnydeklarci a globlis szinten, de akr egy msik fggvny trzsben is szerepelhet. Ez utbbira egy plda:
function kulso () { function belso () { // fggvny trzs } }
Fggvnykifejezs
A fggvnyek ltrehozsnak msik lehetsgvel is gyakran tallkozhatunk. Brhol hasznlhatjuk, ahol vltoz szerepelhet. Radsul gyakran nem is adunk neki fggvnynevet, mert nincs r szksg. A kvetkez nv nlkli fggvny akkor fog lefutni, ha az oldal teljes egszben betltdik:
window.onload=function(){ ..// kd ... }
Visszatrsi rtk
Egyes fggvnyek visszatrsi rtket is elllthatnak. A visszatrsi rtk a return utastssal adhat meg. A kd a return hatsra a fggvnybl kilpve a vezrlst is visszaadja az t hv kdnak. A kvetkez egyszer fggvny a kt paramtere szorzatt adja vissza:
function prod(a,b) { return a*b }
4.5. Fggvnyek
var product=prod(2,3)
259. oldal
4.6. Objektumok
A JavaScript objektumorientlt nyelv. Mieltt azonban a rszletekbe mennnk, rdemes megjegyezni, hogy a C++, Java, PHP stb. nyelvekkel szemben itt valdi objektumorientltsgrl beszlhetnk, mg az elbb emltett nyelveket taln pontosabb lenne osztly-orientlt nyelveknek nevezni. A JavaScript nyelvet szoks mg objektum szemlletnek is nevezni.
4.6.1. Alapok
A bngsz JavaScript kd futtatsakor j nhny objektumot bocsjt a rendelkezsnkre, amiken keresztl a weboldal egyes jellemzit, rszeit rhetjk el, vagy akr manipullhatjuk is. Kezd JavaScript programozknt teht nem sokban fog klnbzni a dolgunk ms nyelvi krnyezetekhez kpet, komoly feladatok megoldshoz mr igen mly JavaScriptes OOP ismeretekre lesz szksgnk. Az objektum klnbz adatok gyjtemnye. Tulajdonsgokkal s metdusokkal rendelkezik.
Tulajdonsgok
A kvetkez plda bemutatja, hogy hogyan lehet egy objektum tulajdonsgt lekrdezni:
var txt="Hello World!" document.write(txt.length)
260. oldal
A futs eredmnye 12.
Metdusok
A metdusok valamilyen tevkenysget hajtanak vgre az objektumon. A kvetkez plda egy sztring objektum toUpperCase metdust hasznlja a nagybets kirs rdekben:
var str="Hello world!" document.write(str.toUpperCase())
Objektum inicializl
Ez a lehetsg a C nyelv struktrjhoz vagy a PHP nyelv asszociatv tmbjhez hasonlt a leginkbb.
var motor = {szin: "piros", kerek: 2}
Konstruktor fggvny
A JavaScriptben nincsenek klasszikus rtelemben vett osztlyok. Az objektumokat kzvetlenl hozzuk ltre a new opertor segtsgvel. Minden objektum az Object tpusra vezethet vissza, gy egy res objektumot pl. gy hozhatunk ltre:
var objektum = new Object();
Az objektumokat a konstruktor fggvnyek pldnyostsval hozhatjuk ltre. A kvetkez kd egy egyetlen adattaggal rendelkez objektumok hoz ltre.
function tipus(tul) { this.tulajdonsag = tul; } var objektum = new tipus(5); // objektum pldnyostsa alert(objektum.tulajdonsag);
A PHP-bl is ismert this kifejezssel hoztuk ltre az objektum egyetlen adattagjt. A ltrehozott objektum vltoz tpusa Object.
Metdus ltrehozsa
A metdus az objektum egy olyan tagja, amely fggvny tpus.
4.6. Objektumok
261. oldal
Metdust akr a konstruktorban, akr utlag is hozzrendelhetjk egy objektumhoz. Pldul egy nvtelen fggvny formjban:
motor.f = function() { /*...*/ }
Tmbk
A JavaScript nyelvben a tmbk is objektumok. Ez tbb helyen is tetten rhet a kvetkez pldnkban. Hozzunk ltre hrom tmbt:
var arrayOne = new Array("One","Two","Three","Four","Five"); var arrayTwo = new Array("ABC","DEF","GHI"); var arrayThree = new Array("John","Paul","George","Ringo");
A new opertor mellett az is rulkodik, hogy a tmbknek ltezik concat metdusuk a tmbk sszefzsre, s length tagjuk a mretk lekrdezsre.
var joinedArray = arrayOne.concat(arrayTwo, arrayThree); document.write("joinedArray has " + joinedArray.length + " elements<br>"); document.write(joinedArray[0] + "<br>") document.write(joinedArray[11] + "<br>")
A tmb objektumoknak igen sok hasznos szolgltatsuk van. Pl. egy tmbt rendezhetnk, majd megfordthatjuk az elemeit:
var arrayToSort = new Array("Cabbage", "Lemon", "Apple","Pear","Banana"); var sortedArray = arrayToSort.sort(); var reverseArray = sortedArray.reverse();
262. oldal
Dtumok
A kvetkez pldnkban a beolvasott szveget dtumm konvertljuk a Date pldnyostsval, s gy lehetsgnk lesz a dtumokkal val mveletekre is. rdemes a getDate s a setDate fggvny hasznlatt megfigyelni.
var input = prompt("Drum (nap hnap v)", "31 Dec 2003"); var originalDate = new Date(input); var addDays = Number(prompt("Eltelt napok","1")) originalDate.setDate(originalDate.getDate() + addDays) document.write(originalDate.toString())
Matematikai mveletek
A JavaScript nyelvben a Math objektum sokfle esetben lehet hasznos segtsg. Hromfle kerekt algoritmus:
var numberToRound = prompt("Please enter a number","") document.write("round() = " + Math.round(numberToRound)); document.write("<br>"); document.write("floor() = " + Math.floor(numberToRound)); document.write("<br>"); document.write("ceil() = " + Math.ceil(numberToRound));
263. oldal
megkzeltse a dinamikus HTML (rviden DHTML) kifejezssel rta le azt, hogy ezt az adatszerkezet nem csak lekrdezhet, hanem manipullhat is. Nzzk elszr ezt a hagyomnyos megkzeltst. (Egyes terleteit ma is gyakran hasznljuk.) Majd utna trnk ki a DOM-ban rejl mai lehetsgekre.
objektum
A Window objektum az aktulis bngszablakot (vagy bngszflet) reprezentlja. Ezzel tudunk pl. j felugr ablakot nyitni:
window.open ("http://oldalam.hu","oldalam"); window.open ("http://oldalam.hu","oldalam","status=1,toolbar=1");
Ezt ma ritkn hasznljuk, mert a bngszk, vagy kiegsztik ltalban blokkoljk a kretlen reklmok miatt.
264. oldal
Document
objektum
A document objektum a HTML body tagjnak tartalmt reprezentlja. A title tulajdonsg az oldal cmt tartalmazza. Ezt akr meg is vltoztathatjuk JavaScript kddal. A lastModified vltoz a dokumentum utols mdostsnak idpontjt tartalmazza. Termszetesen dinamikusan (pl. PHP-vel) generlt oldal esetn a generls idpontja fog szerepelni. A location csak olvashat mez tartalmazza a dokumentum teljes URL-jt. A referrer tulajdonsg szintn csak olvashat mez. Annak az oldalnak az URLjt tartalmazza, amelyrl a ltogat egy linket kvetve rkezett. Ha nem linken keresztl rkezett, akkor res a mez. A forms s a links tmbk a dokumentum rlap s hivatkozs objektumait tartalmazzk. A name attribtummal rendelkez elemeket kzvetlenl is elrhetjk a tartalmazsi hierarchinak megfelelen. Nzznk egy pldt az utolsra. A 71. bra forrskdjnak egy rszlete jl mutatja, hogy urlap a form name tulajdonsga, ami tartalmaz tipus nev rdigombokat, valamint valasz s szoveg nev input mezket.
switch (true) { case document.urlap.tipus[0].checked: document.urlap.valasz.value = alert(document.urlap.szoveg.value)
History
objektum
A history objektum az elzleg megltogatott oldalakat tartalmazza. A kvetkez plda a sokak ltal szeretett, de nem a legszerencssebb Vissza linket hozza ltre:
<a href="javascript:history.go(-1)">Vissza</a>
Navigator
objektum
A navigator objektum a bngsznkrl tud informcikat kinyerni. Pl. a navigator.appName a bngsz nevt, a navigator.cookieEnabled a stik hasznlhatsgt tartalmazza. A bngsz pontos tpusnak meghatrozsra is alkalmazhat, br ez mai szemmel elg trkks mdon104.
104 Egy rdekes pldt lthatunk Peter-Paul Koch: Browser detect cm cikkben. Forrs: http://www.quirksmode.org/js/detect.html
265. oldal
Ahogy emltettk, az eddigi technikkat ma mr ritkbban hasznljuk, inkbb a kvetkez megkzelts alkalmazand.
4.7.2. DOM
A Document Object Model egy olyan szabvny, amelynek segtsgvel a bngsz a HTML dokumentum struktrjt faszerkezetben brzolja s teszi elrhetv, manipullhatv a JavaScript szmra.
A DOM hrom rszre oszthat: Core DOM, XML DOM s HTML DOM. Ezen kvl megklnbztetnk Level 1/2/3 DOM-okat. Mi azonban csak egy nagyon rvid bevezetssel fogunk a tmra pillantani.
A fastruktra minden pontja egy objektum, ami egy elemet reprezentl. Az elemek tartalmazhatnak szveget s tulajdonsgokat is, amit az objektumokbl ki is lehet nyerni. A kvetkez plda az oldalon val kattints hatsra srga htteret llt be:
<head> <script type="text/javascript"> function ChangeColor() { document.body.bgColor="yellow" } </script> </head> <body onclick="ChangeColor()"> Klikkeljen az oldalon! </body>
A document objektum tartalmazza az sszes tovbbi objektumot, amelyek egyttesen a HTML dokumentumot reprezentljk. A document.body objektum a body tagnak felel meg. Az objektumok tulajdonsgai egyszeren elrhetk, illetve manipullhatk. Az elz pldban ltott document.body.bgColor az oldal (body) httrsznt kpviseli. A kvetkez plda eredmnyben ugyanazt nyjtja, mint az elz, azonban a megkzeltse ms. A style tulajdonsg a CSS-ben bellthat tulajdonsgokat foglalja ssze:
document.body.style.background="yellow"
getElementById
Az egyik leggyakrabban alkalmazott metdus, hiszen ennek segtsgvel lehet a HTML dokumentum egy adott elemt elrni, azon pldul valamilyen manipulcit elrni. A kvetkez pldbl fontos megfigyelni, hogy csak az id-vel rendelkez elemeket rhetjk el a segtsgvel. A kvetkez plda egy link elemet keres meg, majd tbb jellemzjt megvltoztatja:
<a id="micro" href="http://www.microsoft.com"> Microsoft</a>
A JavaScript kd:
266. oldal
var link = document.getElementById('micro') link.innerHTML="Visit W3Schools" link.href="http://www.w3schools.com" link.target="_blank"
A getElementById metdussal megkapott objektum a HTML forrskd alapjn plt fel, amibl lekrdezhetnk informcikat, vagy akr mdosthatjuk is a mezit.
Az innerHTML mez segtsgvel a kezd s zr tag kztt szerepl teljes HTML kdot lekrdezhetjk vagy mdosthatjuk. Br hasznos lehetsg, csak egyszerbb esetekben, fleg tiszta szveg csernl rdemes hasznlni.
Tovbbi rdekes szolgltatsok: pldul egy elem megkaphatja a fkuszt a focus metdus meghvsval, vagy ppen elvesztheti a blur metdus hatsra. A focus praktikus lehet, ha a JavaScriptet rlap adatok ellenrzsre hasznljuk. Ekkor a hibazenet megjelentse utn vissza lehet kldeni a kurzort, a hibt tartalmaz beviteli mezre, gy egy kattintst megsprol a felhasznl.
Taln feleslegesnek tnik az ilyen aprlkos kdols, de sokszor az ilyen apr praktikus segtsgek miatt rzi azt a felhasznl, hogy ez egy bartsgos oldal.
Vgl nzznk meg egy kicsit komplexebb DOM pldt 105, amely az innerHTML helyett korszerbb megkzelts a dokumentum dinamikus megvltoztatsra. A kvetkez kd betmret vlaszt gombokat (div elemet, s abban a elemeket) hoz ltre.
function fontresizeShow() { var div = document.createElement("div"); div.id = "fontresize"; var aSmall = document.createElement("a"); var aNormal = document.createElement("a"); var aLarge = document.createElement("a"); aSmall.onclick = function() { StyleActivate('small'); return(false); }; aSmall.href = "#"; aSmall.className = "small"; aSmall.appendChild(document.createTextNode('A')); aNormal.onclick = function() { StyleActivate('normal'); return(false); }; aNormal.href = "#"; aNormal.className = "normal"; aNormal.appendChild(document.createTextNode('A')); aLarge.onclick = function() { StyleActivate('large'); return(false); }; aLarge.href = "#"; aLarge.className = "large"; aLarge.appendChild(document.createTextNode('A')); div.appendChild( aSmall ); div.appendChild( aNormal ); div.appendChild( aLarge ); document.body.appendChild( div ); }
105 Brthzi Andrs: Dinamikus betmret vlaszt cm cikke nagyszer rs a tmban. Forrs: http://weblabor.hu/cikkek/betumeretvalaszto
267. oldal
A getElementById DOM fggvny mintjra hasznos lenne, ha egy adott osztly elemeket knnyen ki tudnnk gyjteni, akr elemtpusokra (pl. p vagy h3) szktve is. A kvetkez egyszer verzi csak a keresett osztly nevt vrja. Lehetne szkteni a keresst, pldul csak egy tpus elemekre, vagy adott azonostj elem leszrmazottaiban, stb.
function getElementsByClass(name, element = "*") { var found = 0; var elems = new Array();
Ha a msodik paramtert is megadjuk a hvskor, az alaprtelmezett * helyett csak bizonyos elemekben keres. A visszaadott rtk lehet null is, ezrt ezt ki kell szrni:
if (alltags) { for (i=0; i < alltags.length; i++) { if (alltags[i].className==name) { elems[found++]=alltags[i]; } } } return(elems);
addEvent
Ez a fggvny egy adott bngsz objektum egy adott esemnyhez csatol hozz egy adott fggvnyt, melyeket paramterl kap.
function addEvent(obj, evType, fn) { if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; } else if (obj.attachEvent) { var r = obj.attachEvent("on"+evType, fn); return r; } else { return false; } }
Br a megolds bngszfgg, azrt knnyen tlthat. (A DOM az addEventListener-t tartalmazza, szoks szerint az Internet Explorer jr kln utakon.)
268. oldal
addLoadEvent
Ez a metdus az elz problma specilis esetnek is tekinthet. Az elz ugyanis a body tagra nem minden bngsz alatt mkdik, mg a kvetkez megolds igen.
function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; }
Elszr is megnzzk, hogy van-e esemnykezel rendelve az onload-hoz. Ha nem, egyszer a dolgunk.
else { window.onload = function() { oldonload(); func(); } } }
Ellenkez esetben egy j fggvnybe kell sszefoglalni az eddigi s az j kdot, hogy az j fggvnyt esemnykezelv tve mindkettt futtassa.
269. oldal
A link a dokumentum elejre mutat ( #). JavaScript hasznlata esetn az elugr ablak megnylik (window.open), majd a return(false) miatt a bngsz nem fogja a tnyleges link clt (#) figyelembe venni. JavaScript nlkl azonban az oldal elejre ugrik a bngsz. Egy j megolds lehet a kvetkez:
<a href="popup.html" onclick="window.open('popup.html','popup');return(false);"> popup nyits</a>
Ekkor a JavaScript gondoskodik az elugr ablak megnyitsrl, s false visszatrsi rtkkel megakadlyozza, hogy a foldal a popup.html-re ugorjon. JavaScript nlkl pedig a fablak jelenti meg a popup.html-t.
Mg diszkrtebb
A diszkrt JavaScript elvvel mg ennl is tovbb mehetnk. A JavaScript kd HTML oldalba keverse ugyangy nem praktikus, mint ahogy a HTML tartalom s a megjelents mikntjt definil CSS sszekeverse sem az. Clszer teht a JavaScriptet a lehet legjobban elklnteni a HTML dokumentumtl.
Ennek az elvnek megnyilvnulsa az a clunk is, hogy a JavaScript kdunk jelents rsze fggvnyekben s osztlyokban, azok pedig kln .js llomnyokban legyenek.
A kvetkez verzi ugyan feleslegesen bonyolultnak tnhet, de nem szabad elfelejteni, hogy a megolds gerinct alkot elveket s fggvnyeket mr msok kidolgoztk, neknk elg felhasznlni az munkjukat, s htradlni a karosszknkben. :) A HTML kdon nem is ltszik, hogy itt JavaScriptrl lenne sz:
<a href="popup.html" class="popup">popup nyits</a>
Az egsz HTML kdban csak a .js llomny betltse mutatja, hogy itt JavaScript kd fog futni. A feladatot megold JavaScript llomny tartalmaz tbb fggvnyt, s a kvetkez sort:
addEvent(window, 'load', classPopupHandler);
Ennek a sornak az a feladata, hogy a window objektum load esemnyhez hozzkapcsoljuk a classPopupHandler metdust. (Ennek kevsb szp megoldsa lenne a body onload="classPopupHandler" a HTML kdban).
270. oldal
Az addEvent metdus s egy segdmetdusa a fejezet ksbbi rszben kerlnek bemutatsra, itt csak az esemnykezel fggvnyt minden egyes popup osztly linkhez kapcsol classPopupHandler metdus s a tnyleges esemnykezel doPopup metdus kvetkezik.
function classPopupHandler() { var elems=getElementsByClass('popup'); for(i=0;i<elems.length;i++) { if (elems[i].href && elems[i].href!='') { addEvent(elems[i],'click',doPopup); } } }
Elszr is a (korbban bemutatott) getElementsByClass metdus egy tmbbe kigyjti a popup osztly elemeket. A ciklusban a megadott href rtkkel br tagokat szrjk, s hozzrendeljk a click esemnyhez a doPopup metdust.
A kevsb diszkrt megolds ugye pont azt jelenten, hogy a HTML kd tartalmazza minden helyen az onc-lick="" szveget.
Az ev esemny objektum elvileg a fggvny paramtereknt ll rendelkezsre, de Internet Explorer alatt ezt nem kapjuk meg, ezrt a window objektumbl kell kinyerni.
var source; if (typeof ev.target != 'undefined') { source = ev.target; } else if (typeof ev.srcElement != 'undefined') { source = ev.srcElement; } else { return(true); }
Megprbljuk kiderteni, hogy melyik objektum vltotta ki az esemnyt. A tbbfle prblkozs itt is a klnbz bngszk miatt szksges.
window.open(source.href,'popup');
Vgl arrl is gondoskodnunk kell, hogy az esemnyt mg egyszer ne kezelje le a bngsz, vagyis a fablak maradjon eredeti llapotban.
271. oldal
E-mail cm elrejtse
Nagyon feleltlen dolog egy e-mail cmet kitenni egy weboldalra. Az n. spam robotok pont azt keresik, hogy a weben hol vannak kint lev e-mail cmek, s a tallatokat egy kzponti szerverre gyjtik. Az ilyen e-mail gyjtemnyeket aztn eladjk, s jn a megszmllhatatlanul sok kretlen levl. Webfejlesztknt gondoskodnunk kell teht az illetktelen hozzfrs megakadlyozsrl. Korbban elterjedt megolds volt a kpek alkalmazsa: a kpszerkesztvel elksztett email cmet a ltogat el tudja olvasni, de a spam robot nem (hacsak nem foglalkozik karakterfelismerssel). Msik elterjedt megolds a szveges kdols, ahol a pont s kukac rsjelek szvegesen jelennek meg. Itt a biztonsg ugyan megvan, de knyelmetlen egy ilyen esetben begpelni az e-mail cmet, fennll a tveszts lehetsge. Ebben a krnyezetben jn jl a kvetkez megolds, ami szintn diszkrt JavaScriptre pt. A megolds lnye, hogy az e-mail cmet egy meghatrozott algoritmus szerint kdoljuk, amit a bngszben fut JavaScript visszaalakt eredeti formjra. Arra is gondolva, hogy a ltogat nem biztos, hogy engedlyezi a JavaScript alkalmazst, a kdolt cmnek az emberi felhasznl szmra rtelmezhetnek kell lenni. A HTML kd teht lehet pldul:
<a href="mailto:nagy.gusztav#KUKAC#gamf.kefo.hu"> nagy.gusztav#KUKAC#gamf.kefo.hu</a>
Ha a bngszben fut a JavaScript, akkor a #KUKAC# karaktersorozat minden elfordulst visszacserljk a @ karakterre.
function whatCorrector() { var replaces = 0; while (document.body.innerHTML.indexOf('#'+'KUKAC#')!=-1 && replaces<10000) {
Az innerHTML hozzfr a teljes body szveghez. Az indexOf a cserlend karaktersorozatot kutatja. Egy biztonsgi intzkeds az esetleg valami problma miatt fennll vgtelen ciklus elkerlse rdekben, hogy legfeljebb 10.000 futtats engedlyezett.
document.body.innerHTML = document.body.innerHTML.replace( '#'+'KUKAC#',String.fromCharCode(64));
A replace a tnyleges csert vgzi, br egy tovbi trkk, hogy a @ karakter nem szerepel a kdban, hanem a String.fromCharCode(64) segtsgvel lltjuk el.
} } replaces++;
272. oldal
4.8. Esemnykezels
JavaScript segtsgvel kszthetnk dinamikus weblapokat. Alapveten ez azt jelenti, hogy a honlap klnbz felhasznli (s bngsz) esemnyeket kpes rzkelni, s azokra valamilyen mdon reaglni. Jellemz esemnyek a kvetkezk: egrkattints a weboldal betltdtt, s a feldolgozsa megtrtnt az egeret rzkeny terleten mozgatjuk listbl egy elem kivlasztsra kerl rlap elklds billentylets Az egyes esemnyek bekvetkezse esetn egy fggvnnyel szoks a szksges funkcit vgrehajtani.
Az Event objektum
Egrrel vagy billentyvel kivltott felhasznli esemnyek kezelsekor az esemnykezel fggvny egy esemny objektumot kap paramterknt. Ebbl az objektumbl lehet kinyerni pldul, hogy melyik egrgomb volt lenyomva, vagy ppen milyen koordintkon van az egrkurzor.
4.8. Esemnykezels
273. oldal
Oldal betltdse utn (onload) a spammer robotok miatt elkdolt e-mail cmeket visszakdolhatjuk. (Ha sajt, egyedi elkdolst alkalmazunk, a spammer robot programok nem fogjk azt ismerni, teht a kitett e-mail cmet nem tudjk ellopni.)
sszetettebb logikj rlapokon hasznos lehet, ha az sszefggseket vizulisan is jelezzk a felhasznlnak. Pldul ha a felhasznl egy jellngyzeten kattintva jelzi, hogy van munkja, adjunk lehetsget a munkahely mez kitltsre. Egy ehhez hasonl esetben megolds lehet a kvetkez plda:
<input type="checkbox" onchange= "document.getElementById('info').style.visibility = this.checked ? 'visible' : 'hidden'"> Dologozok <br> <div id="info" style="visibility:hidden"> Munkahely: <input name="munkahely" type="text"> </div>
Az eredmny:
4.8.3. onSubmit
rlap elkldse eltt az sszes ellenrzst el lehet vgezni ennek az esemnykezelnek a segtsgvel. Az esemnykezel logikai rtkvel jelezhetjk a bngsznek, hogy az rlap elkldhet-e:
<form method="post" action="check.php" onsubmit="return checkForm()">
274. oldal
A checkForm fggvny visszatrsi rtkt az rlap adatai rvnyessgnek fggvnyben kell belltanunk.
Mg specilisabban alkalmazhat az onMouseDown s onMouseUp esemny kezelse, ami az egrgomb lenyomsakor s felengedsekor kvetkezik be. Erre ma tipikus plda a vonszols esete, amikor az egrgombbal trtn megragadskor s elengedskor kell valamit tenni.
Korbban sok helyen alkalmazott felesleges s rossz gyakorlat, hogy a HTML link ( a tag) helyett is valamelyik esemnyt alkalmazzk. Szintn elavult megolds az oldalunk menpontjait kpekkel megvalstani s a kpeket az onMouseDown s onMouseUp esemnyek esetn cserlgetni. (CSS-el is megoldhat a csere, msrszt az aktivitst jelz kp lass kapcsolat esetn nem jelenik meg azonnal, ami nagyon zavar.)
275. oldal
Egy rlap ttekinthet megtervezse, a magyarz szvegek pontos megfogalmazsa gyakran nehz feladat. De mg jl megtervezett rlapok esetn is elfordulhat, hogy a felhasznl hibt kvet el, egy hosszabb rlap esetn akr tbbet is. Rendkvl rontja a felhasznli lmnyt, ha a hibkat csak hosszas procedra utn lehet kijavtani: pl. az elkldtt adatokban lev els hibt a webalkalmazs hibazenettel jelzi, s gy a felhasznl akr j nhnyszor knytelen az adatokat javtani-jrakldeni, hogy egyltaln a hibazenetekkel szembeslhessen. Ez a ltogat szmra nagyon knyelmetlen. Egy rlap esetn az a minimum, hogy az sszes hibazenetet egyszerre (s a beviteli elem krnykn) mutatjuk meg, de mg jobb a megoldsunk, ha az adatok elkldse eltt jelezzk a hibkat. A jelzsre egy praktikus lehetsg, ha a beviteli elem krnykn pl. egy pipa megjelensvel, vagy ppen a httrszn vagy a szegly ms sznre lltsval jelezzk az adott elem helyes kitltst. Az itt kvetkez plda a szerz honlapjnak egy 2006-os vltozatn a hozzszls bekldsre szolgl rlap lesz. Elszr is rdemes megfigyelni, hogy a felhasznlval nem egy kitalls jtkot jtszunk, hanem a lehet legrszletesebb magyarzatot adjuk a beviteli mezkhz:
76. bra. j hozzszls rlap Az brn taln nem egyrtelmen ltszik, hogy a Klds gomb indul llapotban nem hasznlhat, szrke szn. Csak akkor vlik hasznlhatv, ha a felhasznl minden szksges mezt korrekten kitlttt.
276. oldal
HTML kd
<h2>j hozzszls</h2> <form id="hozzaszolas" action="index.php" method="post"> <label for="szoveg">(ktelez, minimum 10 bet):</label> <textarea id="szoveg" name="szoveg"></textarea> <label for="nev"><strong>Nv</strong> (ktelez, minimum 3 bet):</label> <input id="nev" name="nev" type="text" size="20" value=""> <label for="email"><strong>E-mail cm</strong>:</label> <p>(Az e-mail cm megadsa nem ktelez. Megadsa esetn megjelenik az oldalon, de nem lesz kiszolgltatva a spam robotok szmra.</p> <input id="email" name="email" type="text" size="20" value=""> <label for="human">Humn ellenrzs. <strong>Negyvenht</strong> szmmal:</label> <input id="human" name="human" type="text" size="5" value=""> <button name="hozzaszolaskuld" id="hozzaszolaskuld" type="submit" value="kuld">Klds</button> </form>
rdemes megfigyelni, hogy a JavaScript kd diszkrt, nem is ltszik kzvetlenl a HTML kdban. Ha a JavaScript nincs engedlyezve, akkor a knyelmi szolgltats nlkl ugyan, de az rlap elkldhet. A diszkrt mkds rdekben a gomb alaprtelmezetten lenyomhat, a kvetkez JavaScript kd teszi hasznlhatatlann (disabled):
document.getElementById('hozzaszolaskuld').disabled = true;
A kvetkez fggvny csak a minimlis szveghosszakat ellenrzi, zls szerint tovbbfejleszthet pl. e-mail cm szintaxis-ellenrzsre.
function urlapEllenoriz() { document.getElementById('hozzaszolaskuld').disabled = (document.getElementById('szoveg').value.length<10) || (document.getElementById('nev').value.length<3) || (document.getElementById('human').value.length<1); }
277. oldal
77. bra. Vizsga eredmnyek Nhny hagyomnyos megoldsi lehetsg: valamilyen offline mdium hasznlata (pl. egy Excel tblzat), ebben trtnik a szervezsi informcik ellltsa s publiklsa is hossz tblzatos oldal kialaktsa, amiben mr lehet szvegesen is keresni (nagyon hossz tartalom esetn a lapozs szksgess vlhat, ami szintn nem tl szp megolds) Az itt kvetkez megolds az elz megkzeltsek nehzsgeit prblja kikszblni. A Vgeredmny mkds kzben:
278. oldal
78. bra. Dinamikus lista A vizsgznak elegend a neve kt-hrom bets rszt bernia ahhoz, hogy a sok nv kzl csak azt a nhnyat lssa, amelyikbl mr knnyedn ki tudja vlasztani a sajt nevt. (A 78. brn a Kov begpelse ltszik.) Msodik lpsknt egyetlen kattints elegend, hogy a szmra fontos informcik jelenjenek meg az oldalon (idpont, helyszn stb.).
Az rlap felptse
A megolds logikja rviden az, hogy a nv minden egyes karakternek letse vagy trlse utn automatikusan meghvdik a gepel fggvny, ami a tallati lista megjelentsrt felels. A nvlistn val kattints esetn a valaszt fggvny gondoskodik a keresett adatok megjelentsrl.
A kvetkez kdrszletek nem a forrskdban elfordul sorrendben, hanem a vgrehajts sorrendjben kerlnek bemutatsra.
<form method="get" action="#" onSubmit="return false;">
Az rlap tnyleges adatkldst nem fog megvalstani. Errl az onSubmit="return false;" gondoskodik.
279. oldal
A listra kattintskor a valaszt fut le. Szksges mg bemutatni, hogy hol is fognak megjelenni a keresett adatok. Pldul az rsbeli vizsga adatai:
<div id="irasbeli" style="display: none"> <h2>rsbeli vizsga</h2> <p>Idpont: <span id="iido"></span><br> Hely: <span id="ihely"></span></p> </div>
Alaprtelmezetten a doboz nem jelenik meg (display: none), hiszen nem biztos, hogy a vizsgzknak lesz egyltaln rsbeli vizsgja. Msrszt rdemes megfigyelni a (most mg) res span elemeket: itt fognak megjelenni a keresett adatok.
Adatok trolsa
Mieltt a gepel fggvnyt megvizsglnnk, t kell gondolnunk, hogy honnan fogja venni a kdunk a megjelentend adatokat. Tbb megkzelts is szba jhet, mi itt csak a JavaScript vltoz hasznlatt vizsgljuk meg. Egyszerbb esetekben s kisebb adatmennyisg (nhny kb) esetn tkletesen megfelel az adatok tmbben val trolsa. Jelen megolds ezt az egyszer mdszert alkalmazza:
var vizsgazok = new Array( new Array("Antal Alma","a","a","C","7","1","8:45","8"), new Array("Bera Berta","n","k","B","","",""," "), ... )
Jelen fejezetben azzal nem foglalkozunk, hogy ezt a tmbt hogyan is lltjuk el. Mint lehetsg, meg kell azonban emlteni, hogy szerver oldalon nem csak HTML, hanem akr JavaScript kdot is generlhatunk, gy nincs annak sem akadlya, hogy PHP-vel az adatbzisbl szrmaz adatokat JavaScript tmbb rjuk ki, hogy a fenti eredmnyt kapjuk. Mg egyszerbb esetekben a tmb kzi mdszerekkel is elllthat. Komolyabb adatmennyisg esetn a 4.10. fejezetben bemutatsra kerl AJAX alap megolds jhet szba.
A gepel fggvny
A gepel fggvny nhny fontosabb rszlete:
280. oldal
function gepel(){ var nev = document.getElementById('nev') var lista = document.getElementById('lista')
Az str vltozban fogjuk felpteni a nvsort. Ha nem res a nv mez, listt generlunk:
if (nev.value.length>0) { for (i=0; i<vizsgazok.length; i++) { var vnev = vizsgazok[i][0];
Vgl egy technikai rdekessg: Az Internet Explorer hibsan mkdik, ha az innerHTML adattagot select elemre hasznljuk. Ezrt a nem szabvnyos outerHTML-t kell alkalmaznunk helyette:
if (lista.outerHTML) { lista.outerHTML = '<select size="10" id="lista" name="lista"' .' onChange="valaszt();">' + str + '</select>' } else { lista.innerHTML = str }
A valaszt fggvny
Az elz fggvny alapjn sok rszfeladat mr knnyen elkszthet. A kivlasztott nv kinyerse:
var nev = lista.options[lista.selectedIndex].text
281. oldal
Az AJAX az Asynchronous JavaScript and XML kifejezs rvidtseknt jtt ltre. Nagyon egyszeren fogalmazva az AJAX lehetv teszi, hogy az oldal gy reagljon a felhasznli interakcikra, hogy nem kell hozz (mindig) jratlteni az egsz weboldalt. A ltogat nem fog msodpercekig vrni 1-1 kattints utn, hogy az elbb a szerveren, majd a kliensen is rvnyesljn. Ehelyett a kliens l, mozog, reagl, s kzben a szerverrel is kommunikl. Nzznk meg egy nagyon egyszer helyzetet. A ltogat regisztrlni szeretne, s ezrt felhasznli nevet vlaszt magnak. Hagyomnyos JavaScript mdszerrel itt annyi knyelmi szolgltatst adhatunk, hogy a szintaxis ellenrzst elvgezhetjk (pldul a minimum hosszsg megvan-e, s csak megengedett karaktereket adott-e meg). Azt azonban, hogy a nv mr foglalt, csak az rlap elkldse utn tudjuk jelezni. AJAX segtsgvel akr azonnal jelezhet a foglaltsg.
AJAX kommunikci
A hagyomnyos webalkalmazsok a felhasznl ltal bevitt adatokat egy rlap formjban kldik el a kiszolglnak. Miutn az feldolgozta az adatokat, egy teljesen j oldalt kld vissza a bngsznek. Mivel minden felhasznli adatbevitel utn a kiszolgl j oldalt kld, ezek az alkalmazsok ltalban lassak s kevsb felhasznlbartok. AJAX-szal azonban a weboldalak gy kldhetnek s fogadhatnak adatokat a kiszolglnak, hogy nem szksges az egsz oldalt jra letlteni. Ez gy lehetsges, hogy az oldal a httrben kld egy HTTP krst a kiszolgl fel, majd JavaScript segtsgvel csak a weboldal egy rszt mdostjuk, ha megrkezik a vlasz.
106 http://www.adaptivepath.com/publications/essays/archives/000385.php
282. oldal
Habr brmilyen formtumot hasznlhatunk az adatok kldsre/fogadsra (akr egyszer szveget is), legelterjedtebb az XML hasznlata. (Br a JSON 107 npszersge is egyre nvekszik.)
HTML
A kezdetben res javaslatlista a txtHint span mezbe fog kerlni, az ppen begpelt szvegnek megfelelen. (Pldul az A begpelsre megjelenik az sszes A betvel kezdd nv.)
<form> Keresztnv: <input type="text" id="txt1" onkeyup="showHint(this.value)"> </form> <p>Javaslat: <span id="txtHint"></span></p>
showHint
Minden egyes billentylets (pontosabban felengeds: onkeyup) esetn lefut a showHint JavaScript fggvny. rdemes megfigyelni az tadott paramtert: a this.value az aktulis input elem (this) begpelt rtkt (value). A fggvny nhny ktelez ellenrzssel kezd, a lnyegi kd a fggvny vgn tallhat:
function showHint(str) { if (str.length==0){ document.getElementById("txtHint").innerHTML="" return } xmlHttp=GetXmlHttpObject() if (xmlHttp==null) { alert ("Browser does not support HTTP Request") return } var url="gethint.php" url=url+"?q="+str xmlHttp.onreadystatechange=stateChanged xmlHttp.open("GET",url,true) xmlHttp.send(null) }
107 http://www.json.org/
283. oldal
Ha ilyenkor a teljes listt kiadn, akkor a lnyeg veszne el. Egy ilyen helyzetben pont az az AJAX megolds elnye, hogy nem kell elre letlteni a tbb ezer vlasztsi lehetsget egy select tagba, hanem minden esetben csak egy jval szkebb tallati listt.
Kvetkez lps az AJAX mkds lelkt ad (pldnkban xmlHttp) objektum ltrehozsa. (Mivel ez a lps bngszfgg, ksbb rszletesen visszatrnk erre.) Ha ltrejtt a kommunikcis objektum, akkor az URL sszelltsa kvetkezik. Itt egyelre annyi lnyeges, hogy a megszltsra kerl gethint.php a paramterek alapjn tud arrl, hogy itt mi a krs: az A bet begpelse esetn az url a kvetkez lesz:
gethint.php?q=A
Termszetesen itt a tnyleges kdols eltt az sszes lehetsges helyzet alapjn rgzteni kell valamilyen paramtertadsi mdszert, s ehhez kell alkalmazkodni a krs kliens oldali sszelltsakor s szerver oldali feldolgozsakor is. (Ezt gy is mondhatjuk, hogy a kliens s szerver kzti kommunikcira egy interfszt vagy protokollt dolgozunk ki.) A pldban jl ltszik, hogy a szerver oldalon a q paramter rtke alapjn kell a javaslatokat sszelltani.
A szerver oldalon pldul egy adatbzis tblban trolt nevek esetn egy egyszer, a kvetkezhz hasonl lekrdezsre lesz szksg:
SELECT nev FROM nevek WHERE nev like "A%"
Az utols hrom sor kicsit tbb magyarzatot ignyel. Az AJAX aszinkron mkdse azt jelenti, hogy a szerver fel kldtt krsre a JavaScript nem vrja (nem is vrhatja) meg a vlaszt, hanem a felhasznlt hagyja tovbb dolgozni (esetnkben gpelni). A kommunikcis objektumunk szmra teht egy n. callback (visszahvhat) fggvny nevt adja meg az xmlHttp.onreadystatechange=stateChanged sor. Amikor a szervertl visszarkezik a vlasz, akkor a JavaScript kdunk errl gy fog rteslni, hogy a stateChanged fggvny kapja meg a vezrlst. Msknt fogalmazva: a stateChanged fggvnyt kell kpess tennnk arra, hogy a visszarkez vlaszt feldolgozza. Az xmlHttp.open fggvny a krst rja le: GET metdussal szeretnnk a krst kldeni az url szmra, a true paramter pedig az aszinkronitst rja el.
Aszinkronits nlkl a bngsz lemerevedne a vlasz megrkezsig. Ez (klnsen lassabb hlzati kapcsolat esetn) nem a felhasznli lmnyt nveln, hanem inkbb korltozn a munkt.
284. oldal
A fggvny tbbszr is meghvdik a vlasz teljes megrkezsig, de az esetek tlnyom tbbsgben elg akkor foglalkozni vele, amikor a teljes vlasz megrkezett (readyState==4). Ahogy eddig is ltszott, ez a plda az alapok rvid ttekintst tzi ki clul, s nem a teljes s komplex megoldst. A vlasz esetn is lthat, hogy itt nem XML vlasz rkezik a szer vertl, hanem szveges (akr HTML). Egyszerbb esetekben ez tkletes megolds lehet.
A fggvny elszr a Mozilla alap bngszkn alkalmazhat megoldssal kezd, majd Explorerben ActiveX vezrlt prbl ltrehozni. A kdbl az is kvetkezik, hogy az AJAX hasznlathoz a JavaScripten tl az ActiveX engedlyezsre is szksg van Explorer esetn. Az elz plda egyszer szveges (AHAH108) kommunikcit valstott meg. sszetettebb esetekben tbbnyire XML vagy JSON alap kommunikci szksges.
5. Tartalomjegyzk
1. Az alapok............................................................7 1.1. A web s a ltogat viszonya.......................7 1.1.1. Webes tipograi alapismeretek........7 1.1.2. Hogyan olvasunk a weben?...............8 1.1.3. Keres(re) optimalizls......................8 1.2. A web mkdse............................................9 1.2.1. Webszerver..........................................10 1.2.2. Webtrhely...........................................12 1.2.3. Virtulis szerver..................................12 1.2.4. HTTP protokoll...................................13 1.2.5. FTP protokoll.......................................16 1.2.6. Webcm (URL).....................................17 1.3. A tervezs folyamata...................................18 1.3.1. A honlap clja.....................................18 1.3.2. A honlap megtervezse.....................19 1.4. A fejlesztkrnyezet kialaktsa................23 1.4.1. Szerver opercis rendszer...............23 1.4.2. Szerver alkalmazsok........................24 1.4.3. A fejleszt gpe...................................26 2. A tartalom s a kinzet..................................31 2.1. HTML alapok................................................31 2.1.1. Mi az a HTML?..................................31 2.1.2. Hogyan kezdjnk neki?....................32 2.1.3. HTML szerkesztk.............................33 2.1.4. Hogy nzzk meg egy oldal HTML kdjt?............................................................33 2.1.5. HTML tagok........................................33 2.1.6. HTML elemek.....................................34 2.1.7. Tag tulajdonsgok...............................34 2.1.8. ltalnos tulajdonsgok....................35 2.1.9. Megjegyzsek......................................35 2.1.10. Karakter entitsok............................36 2.1.11. Szemantikus HTML.........................37 2.1.12. Szabvnyossg..................................38 2.1.13. HTML 5..............................................39 2.1.14. XHTML..............................................39 2.2. CSS alapok.....................................................41 2.2.1. Mi a CSS?............................................41 2.2.2. Hol legyenek a stlusdefincik?......44 2.2.3. A CSS nyelvtana.................................45 2.2.4. Szervezsi elvek..................................49 2.2.5. Mdia tpusok......................................50 2.2.6. Validtor...............................................52 2.2.7. CSS 3.....................................................52 2.3. Cmsorok s formzsuk.............................52 2.3.1. Httr....................................................53 2.3.2. Szeglyek.............................................56 2.3.3. Trkzk a szeglyen bell s kvl 58 2.4. Az oldalszerkezet kialaktsa.....................59 2.4.1. Mretek................................................59 2.4.2. Megjelents........................................59 2.4.3. A lebegtets.........................................60 2.4.4. Pozicionlsi smk...........................66 2.4.5. Z-index.................................................69 2.4.6. Begyazott keretek.............................69 2.4.7. A HTML 5 jdonsgai.......................69 2.5. Szvegek ksztse.......................................72 2.5.1. Bekezdsek...........................................72 2.5.2. Sortrsek............................................73 2.5.3. Kiemelsi lehetsgek........................74 2.5.4. Szvegek megjelentse.....................76 2.6. Linkek.............................................................79 2.6.1. HTML szintaxis..................................79 2.6.2. Linkek formzsa...............................81 2.7. Multimdia....................................................81 2.7.1. Kpek....................................................81 2.7.2. Flash lejtsz begyazsa..................83 2.7.3. HTML 5 jdonsgok..........................85 2.8. Listk..............................................................86 2.8.1. HTML szintaxis..................................86 2.8.2. Listk formzsa.................................88 2.9. Tblzatok......................................................89 2.9.1. HTML szintaxis..................................89 2.9.2. Tblzatok formzsa........................92 2.10. rlapok........................................................94 2.10.1. HTML szintaxis................................94 2.10.2. j lehetsgek a HTML 5-ben.......98 2.10.3. rlapok formzsa.........................101 2.11. Fejrsz........................................................104 2.12. A CSS3 nhny megoldsa.....................104 3. Szerver oldali mkds................................107 3.1. A szerver konfigurlsa............................107 3.1.1. Az Apache konfigurlsa................107 3.1.2. A PHP konfigurlsa.......................110 3.1.3. A phpMyAdmin konfigurlsa......113 3.1.4. A MySQL konfigurlsa, jogosultsgkezels......................................113 3.1.5. Karakterkdols: Hasznljunk mindenhol UTF-8-at..................................114 3.2. PHP alapok..................................................119 3.2.1. Szintaxis.............................................119 3.2.2. Megjegyzsek....................................120 3.2.3. Vltozk..............................................121 3.2.4. Sztringek hasznlata........................124 3.2.5. Opertorok s kifejezsek...............126 3.2.6. Tmbk...............................................130 3.2.7. Szuper-globlis vltozk.................133 3.3. Vezrlsi szerkezetek..................................133 3.3.1. Elgazsok.........................................133 3.3.2. Ciklusok.............................................137 3.3.3. Fggvnyek hasznlata...................141 3.4. Adatbzis-kapcsolat...................................145
286. oldal
3.4.1. MySQL alapok..................................145 3.4.2. Adatbzisok s tblk ltrehozsa.146 3.4.3. Adatok bevitele adatbzisba...........149 3.4.4. Lekrdezs.........................................150 3.4.5. Rekord felttelek...............................152 3.4.6. A rekordok rendezse......................153 3.4.7. Adatok mdostsa...........................154 3.4.8. Adatok trlse az adatbzisbl......154 3.4.9. Adatbzis absztrakci......................155 3.5. rlapok hasznlata....................................157 3.5.1. A GET paramtertads..................158 3.5.2. A POST paramtertads................159 3.5.3. Adatfeldolgozs................................160 3.5.4. llomnyok feltltse......................166 3.5.5. Levlklds........................................169 3.6. llomnykezels........................................171 3.6.1. Forrskd beillesztse......................171 3.6.2. Egyszer Front Controller megoldsok..................................................173 3.6.3. Fjlok egszknt kezelse................177 3.6.4. Fjlok tartalmnak kezelse............178 3.7. Felhasznlkezels.....................................180 3.7.1. Stik kezelse....................................180 3.7.2. Munkamenet-kezels.......................182 3.8. Objektumorientlt PHP............................184 3.8.1. Az OOP alapjai.................................184 3.8.2. Osztlyok hasznlat.........................187 3.8.3. rklds...........................................189 3.8.4. Asszocici........................................190 3.8.5. Lthatsg.........................................191 3.9. Hibakezels..................................................192 3.9.1. Alapvet hibakezels: a die fggvny hasznlata....................................................192 3.9.2. Alaprtelmezett hibakezel fggvny ksztse.......................................................193 3.9.3. Kivtelkezels....................................197 3.10. Tervezsi mintk.......................................199 3.10.1. Stratgia...........................................200 3.10.2. Front controller...............................202 3.10.3. MVC..................................................204 3.11. Sablonrendszerek.....................................210 3.11.1. Smarty..............................................211 3.11.2. A PHP mint sablonnyelv..............215 3.12. Tartalomkezel rendszerek.....................218 3.12.1. Clok.................................................219 3.12.2. Adatbzis felptse.......................220 3.12.3. Konfigurci....................................222
5. Tartalomjegyzk
3.12.4. Az Article osztly...........................223 3.12.5. Front-end.........................................228 3.12.6. Back-end..........................................231 3.12.7. A kinzet..........................................236 3.12.8. Nylt forrs tartalomkezel rendszerek....................................................237 3.13. Keretrendszerek........................................237 3.13.1. Yii......................................................237 4. Kliens oldali mkds..................................239 4.1. Alapok..........................................................239 4.1.1. Beilleszts a HTML kdba..............239 4.1.2. Hogyan kezdjnk neki?..................241 4.1.3. Esemny tulajdonsgok...................241 4.1.4. Dialgusablakok...............................242 4.2. Vltozk........................................................247 4.2.1. Vltoz deklarci............................247 4.2.2. Tpusok...............................................248 4.2.3. Literlok.............................................248 4.3. Kifejezsek s opertorok.........................249 4.3.1. Opertorok.........................................250 4.4. Vezrlsi szerkezetek..................................253 4.4.1. Elgazsok.........................................253 4.4.2. Ciklusok.............................................255 4.5. Fggvnyek.................................................257 4.6. Objektumok.................................................259 4.6.1. Alapok................................................259 4.6.2. Objektumok ltrehozsa..................260 4.6.3. Objektumknt viselked vltozk. 261 4.7. A dokumentum elrse s mdostsa...262 4.7.1. Dinamikus HTML............................263 4.7.2. DOM...................................................265 4.7.3. DOM megoldsok.............................267 4.7.4. Diszkrt JavaScript...........................268 4.8. Esemnykezels..........................................272 4.8.1. onload s onUnload.........................272 4.8.2. onFocus, onBlur s onChange........273 4.8.3. onSubmit............................................273 4.8.4. onClick, onMouseDown s onMouseUp.................................................274 4.9. Felhasznli lmny..................................274 4.9.1. Kliens oldali rlap ellenrzs.........274 4.9.2. Hossz listk bngszse helyett...277 4.10. AJAX bevezet.........................................281 4.10.1. Bevezet plda................................282 4.10.2. A bngszk AJAX tmogatsa...284 5. Tartalomjegyzk............................................285 6. Hogyan tovbb?............................................287
6. Hogyan tovbb?
287. oldal
6. Hogyan tovbb?
Ha eddig eljutottl s nem csak htralapoztl , kedves Olvas, akkor nyakig benne vagy a webfejleszts mocsarban. Mert aki belekstol s beleszeret az alkot munka rmeibe, azt fogva tartja, magval ragadja ez a fantasztikus vilg. n pedig veszem a btorsgot, s nem tiszteletlensgbl, hanem mint szakmabelit tegezni foglak e rvid fejezet erejig. Az alapok megismerse utn jl ltszik, hogy az ismeretlen nem cskkent, hanem mg nagyobb terleteket sejtet az ismeret hatrain tl. Ha csak szmba vesszk a ngy alaptmnk kvetkez lpseit, ltszik, hogy sok fel van mit bvteni a tudsunkon. A HTML 5 s a CSS3 szabvny mg nem vgleges, de nap mint nap jabb tutorialok, trk kk, megoldsok jelennek meg a szakmai kzssg tollbl. Taln soha nem volt ilyen ltvnyos verseny a bngszk fejleszti kztt, szinte hetente jelennek meg az jabb buildek valamelyik bngsz hza tjrl. A szabvnyok rengeteg jdonsgval kell a kzeljvben megismerkednnk. A JavaScript terletn is jelents verseny zajlik a bngsz gyrtk kztt. Nem csak a teljestmnyben, hanem a verziszmokban is nagy a prgs. Ezen kvl az elmlt 5-6 vben a Prototype109, jQuery110 s trsai nagyban gyorstjk, ltvnyoss s lvezetess teszik a fejlesztk munkjn kvl a ltogatk tevkenysgt is. Itt is sok tovbblpsi lehetsg van a tanulsban. A szerver oldalon a bemutatott keretrendszerek, tartalomkezel rendszerek, a tervezsi mintk mellett mg a PHP-n kvli vilg is htra van: a Perl, Ruby, Python, Java s .Net brmelyike vekre elegend tanulni valt nyjt. Vgl kt szemlyes javaslatot hagy adjak a szakmai tovbblpshez: Napi szinten olvasd a Weblabort111, csatlakozz a szakmai kzssg letbe a sajt aktivitsoddal is. Ismerd meg kzelebbrl a Drupalt112! A Drupal ismeret s az eddig elsajttott webfejlesztsi alapismeretek nagyszer szakmai htteret adnak a munkakeresshez, a karrierptshez vagy a vllalkozshoz, cg alaptshoz. Sok sikert kvnok! Nagy Gusztv
109 http://www.prototypejs.org/ 110 http://jquery.com/ 111 http://weblabor.hu/ 112 http://drupal.hu/