Datan hakeminen muilta sivuilta, handlerit ja sivupohja - Demo 9
- RSS-feedin sisällyttäminen omalle sivulle
- HTML-dokumentin osan sisällyttäminen omalle sivulle
- Apache handlerit
- Sivupohjan käyttöönotto
Käytetään muiden tekemiä XML-dokumentteja ja WWW-sivuja tiedonlähteenä. Tutustutaan Apachen handlereihin ja toteutetaan niiden avulla oma sivupohja.
RSS-feedin sisällyttäminen omalle sivulle
- Aloita uusi PHP-ohjelma. Pyritään hakemaan ja parsimaan XMLhack.comin RSS-feedi ja sisällyttämään siitä tärkeimmät osat omalle sivulle.
- Käsiteltävä RSS-feed löytyy osoitteesta: http://xmlhack.com/rss10.php. Tutki sivun lähdekoodia niin pääset jyvälle RSS-tiedoston rakenteesta.
-
Haetaan RSS-dokumentti PHP-ohjelmaan käyttäen PHP:n DOM-kirjastoa:
// näytetään kaikki tässä vaiheessa pelkkänä tekstinä header("content-type: text/plain"); $url = "http://xmlhack.com/rss10.php"; // luodaan uusi dokumentti ja haetaan sen sisältö halutusta osoitteesta $doc = new DomDocument(); $doc->load($url); // tulostetaan koko dokumentti print $doc->saveXML(); - Kaivellaan dokumentista yksittäisiä osia. Haetaan ensimmäiseksi yleistietoja:
// dokumentissa tarvittavat nimiavaruudet $rdf_ns = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; $dc_ns = "http://purl.org/dc/elements/1.1/"; $rss_ns = "http://purl.org/rss/1.0/"; $mn_ns = "http://usefulinc.com/rss/manifest/"; // haetaan dokumentin yleistiedot // täytyy käyttää nimiavaruuksia ymmärtävää versiota // getElementsByTagName-metodista $title = $doc->getElementsByTagNameNS($rss_ns, "title"); $link = $doc->getElementsByTagNameNS($rss_ns, "link"); print $title->item(0)->textContent."\n"; print $link->item(0)->textContent."\n"; - Hae edellä tehtyyn tapaan description, rights ja language -elementit ja tulosta niiden tekstisisältö. Huomaa ottaa käyttöön oikea nimiavaruus ($rss_ns tai $dc_ns).
- Muuta dokumenttisi mediatyypiksi text/html ja poista edellä tehdyt
tulostuslauseet. Kopioi itsellesi pohja.xml-tiedosto. Luo uusi DomDocument ja avaa
tähän pohjaksi pohja.xml-tiedosto:
$oma = new DomDocument(); $oma->load("pohja.xml"); -
Lisää $oma-dokumenttiin RSS-feedistä kaiveltu pääotsikko ja tulosta koko $oma-dokumentti:
// on syytä huomata, että id pitää määritellä // <body xml:id="foo"> // jos dokumentti olisi ladattu komennolla loadHTMLFile niin tavallinen // id="foo" olisi riittänyt $body = $oma->getElementById("foo"); $h1 = $oma->createElement("h1"); $h1->appendChild($oma->createTextNode($title->item(0)->textContent)); $body->appendChild($h1); print $oma->saveXML();Testaa myös selaimella.
- Lisää edellä tehtyyn tapaan pääotsikosta linkki RSS-feedistä saatuun osoitteeseen (link). Lisää myös muiden RSS-feedistä kaivamiesi elementtien sisältö XHTML-dokumenttiisi esim. tekstikappaleina.
- Hae RSS-feedistä kaikki item-elementit. Käy nämä kaikki läpi silmukassa ja luo XHTML-dokumenttiin linkkilista (ul), jossa yksi lista-alkio (li) muodostuu kunkin item-elementin sisältämästä title- ja link-elementistä. Vinkkejä silmukassa tehtäviin toimenpiteisiin löytyy mm. seuraavasta tehtävästä, jossa luodaan myös samantyyppinen silmukka sekä luentoesimerkistä. Katso myös mallikuva.
HTML-dokumentin osan sisällyttäminen omalle sivulle
- HTML-dokumentin parsiminen tapahtuu PHP:ssa aivan samalla tavalla kuin
edellä parsittiin RSS-dokumenttia. Luo uusi PHP-tiedosto
ja hae siihen tiedot IT-tiedekunnan pääsivulta:
$url = "http://www.jyu.fi/it"; $doc = new DomDocument(); $doc->load($url);Kokeile validoida sivu. Huomaat, että sivu ei ole täysin validia XHTML:ää, joten edellä ollut sivun lataus XML:nä ei toimisi.
-
Koska sivu ei ole täysin validia, sivu täytyy ladata HTML-moodissa XML:n sijaan. Säädetään lisäksi asetukset
siten, että sivun suoritus ei jää kesken, vaikka tulisi epävalidi kohta:
$url = "http://www.jyu.fi/it"; // säädöt mahdollisimman löysälle ja ladataan HTML-moodissa $doc = new DomDocument(); $doc->recover = true; $doc->strictErrorChecking = false; $doc->loadHTMLFile($url);Nyt sivun lataus pitäisi onnistua.
- Poimitaan seuraavaksi dokumenttiin tuodulta IT-tiedekunnan pääsivulta "Ajankohtaista tiedekunnassa" -kohdassa olevat aiheet ja linkit.
- Muuta dokumenttisi mediatyypiksi text/html. Luo uusi DomDocument ja avaa siihen pohjaksi sama pohja.xml-tiedosto, jota käytettiin ensimmäisessäkin tehtävässä.
- Lisää dokumenttiin bodyn alle uusi listaelementti (ul). Lisääminen tapahtuu samalla idealla kuin edellisessä tehtävässä lisättiin h1-elementti.
- Hae seuraavaksi dokumenttiin tuodulta IT-tiedekunnan sivulta div-lohko, jonka sisällä "Ajankohtaista tiedekunnassa" on.
Katso sivun lähdekoodia ja mieti, miten saat lohkon parsittua irti muusta sivusta. Lohkosta tarvitaan vain sen sisältämät
li-elementit, joten hae ne seuraavaksi taulukkoon.
$ajankohtaista = $doc->getElementById("dynamicpage-fifth-list"); $tapahtumat = $ajankohtaista->getElementsByTagName("li"); - Käy seuraavaksi foreach-silmukassa läpi löytyneet li-elementit.
- Poimi jokaisen elementin sisältö (getElementsByTagName) ja elementin href-attribuutin sisältö (getAttribute) joihinkin muuttujiin.
- Luo sitten silmukassa uusi a-elementti (createElement) ja liitä sille äsken parsimasi sisältö (appendChild, createTextNode, textContent) ja href-attribuutti (setAttribute).
- Luo silmukassa sen jälkeen uusi li-elementti (createElement) ja liitä sen sisällöksi (appendChild) juuri luomasi a-elementti.
- Liitä lopuksi vielä luomasi li-elementti silmukan ulkopuolella luotuun ul-elementtiin (appendChild).
- Edellisissä kohdissa suluissa on metodeja, joita todennäköisesti tarvitset kyseisissä kohdissa.
- Tulosta lopuksi luomasi sivu, jotta voit tarkastella sitä selaimessa.
Katso myös mallikuva.print $oma->saveXML();
Apache handlerit
Apachen handlereilla saadaan helposti otettua käyttöön oma sivupohja tai lisättyä esim. autentikointi kokonaisen sivuston päälle ilman, että tarvitsee tehdä mitään muutoksia yksittäisiin sivuihin.
- Siirrä edellä tekemäsi PHP-tiedostot uuteen demo9-alikansioon webbisivut. Älä siirrä SOAP-tiedostoja, sillä niille emme
tarvitse template-käsittelijää. Lisää webbisivut-kansioon
.htaccess-tiedosto, johon kirjoitat:
# määritellään oman käsittelijän sijainti # korjaa osoite toimivaksi Action oma /~tunnus/cgi-bin/template.php # määrätään .php-päätteisille tiedostoille oma käsittelijä AddHandler oma .php
Action-rivin osoite on puoliabsoluuttinen viite käsittelijäohjelmaan (samaan tapaan kuin uudelleenohjauksessa). - Kirjoitetaan seuraavaksi oman käsittelijän (template.php) runko:
<?php // www-palvelimelta pyydettävän tiedoston polku $file = $_SERVER["PATH_TRANSLATED"]; // käynnistää puskuroinnin eli ottaa talteen kaiken // sen mitä yritetään tulostaa ja antaa template-nimiselle funktiolle käsiteltäväksi ob_start("template"); // käsittelee varsinaisen tiedoston eli suorittaa sen sisältämän mahdollisen // PHP-koodin yms. include($file); // puskurointi loppuu ob_end_flush(); // funktio, joka käsittelee puskuriin kerätyn datan // yksinkertaisimmassa tapauksessa ei tee mitään vaan palauttaa suoraan // puskurin sisällön function template($buffer) { return $buffer; } ?> - Tallenna tiedosto
template.phphtml-hakemiston juuressa olevaan cgi-bin-hakemistoon - Kokeile vieläkö aiemmin tekemäsi PHP-ohjelmat toimivat. Luultavasti
ne eivät toimi, koska template-käsittelijän läpi ajo muuttaa oletuspolkua.
Käy vielä muuttamassa edellisten tehtävien PHP-tiedostoissa ladattavien
XML-tiedostojen suhteelliset polut absoluuttisiksi. Esim.
/omaHOMEpolku/html/sovellukset/demo9/webbisivut/pohja.xml
- Muuta template-funktiota sen verran, että se lisää jonkin
merkkijonon puskurissa tulleeseen dataan, niin pääset toteamaan, että käsittelijä
todella toimii:
return $buffer." Kyllä toimii";Tarkista selaimella näkyykö lisätty teksti sivun lähdekoodissa (View | Page Source).
- Omalla käsittelijällä voidaan nyt rakentaa kaikkien PHP-tiedostojen päälle esim. autentikointi tai lisätä yhtenäiset navigointilinkit (sivupohja).
Sivupohjan käyttöönotto
- DOM-rajapinnan ja oman käsittelijän avulla on helppoa liittää puskuriin tullut dokumentti omaan sivupohjaan. Kopioi käyttöösi valmis sivupohja.
- Lisää template-funktioon DOM-rajapinnan avulla seuraavat
toiminnot:
- Luo uusi DOMDocument, johon lataat pohjaksi sivupohjan.
- Luo toinen DOMDocument, johon lataat puskurissa tulleen dokumentin (loadXML).
- Hae puskurissa tulleesta dokumentista title-elementin tekstisisältö ja kopioi
se sivupohjadokumenttiisi title-elementin sisällöksi.
Tarviset DOMDocumentin metodeja ja ominaisuuksia:
- getElementsByTagName
textContent(PHP:ssa read-only)- appendChild
- createTextNode
- Hae puskuroidusta dokumentista body-elementti ja importoi se sivupohjadokumenttiin ($doc->importNode($node, true)).
- Lisää jokainen puskuroidun dokumentin body-elementin lapsisolmu sivupohjadokumentin body-elementin sisälle.
Helpoiten siirto onnistuu while-silmukalla, firstChild-ominaisuudella ja
appendChild-metodilla.
Mieti miksi
childNodes-listan läpikäyminen for-silmukassa olisi hankalaa? - Palauta lopuksi returnilla sivupohjadokumentti, johon on nyt sisällytetty kaikki sisältö, mitä puskuroidusta dokumentista löytyi.
- Kokeile selaimella miten ohjelmassasi on nyt navigointilinkistö.

Käyttäjien kommentit