Luettelen alla aihealueittain tekemäni aihepiirit. Paluulinkkeinä tähän aihepiiriin on tämä valikko ja sivun yläreunassa oleva linkki Aihepiiriluettelo.
| |||||||||||||||
| Aihepiiriluettelo > Sekalaisten tietotekniikkasivujen etusivu > Sekalaisia > Dynaaminen rakenne PHP:llä > Katkelmien hakeminen (jakso 1/4) |
|---|
Katkelmat kootaan yhteen joko readfile(), require() tai include() funktioilla ja jokainen rivi päätetään puolipisteeseen (;). Haettava tiedosto on yleensä sulkumerkkien sisällä, mutta require kohdalla pelkät lainausmerkitkin (yksinkertaiset tai kaksinkertaiset) riittävät (esim. <?php require 'joku.inc';?>). Lisäksi on huomattava, että include() pitää lisäksi olla kaarisulkujen ({ + }) rajoittaman käskylohkon sisällä, mikäli se on ehtolauseen sisällä.
Niiden lisäksi tarvitaan perustulostuksissa joko print() tai echo() funktio, joka joko kirjoittaa uutta koodia tai kirjoittaa haetun koodin jonnekin toiseen paikkaan. Jälkimmäisessä tapauksessa haettu koodi on määritelty muuttujaksi. Alla on esim. muuttujan käyttämisestä tietyn merkkijonon tulostamiseksi:
<?php $Muuttuja="\"Tämä on muuttujan sisältämä teksti\"";
print $Muuttuja;?>
"Tämä on muuttujan sisältämä teksti"
Merkkijono voi sisältää tavallista tekstiä tai vaikka HTML-koodia. Mikäli merkkijonossa on yksin- tai kaksinkertaiset lainausmerkkejä, niiden eteen täytyy laittaa etukenoviiva (\) pakokirjaimeksi (escape character). Muutoin jäsennin tulkitsee lainausmerkkien joko päättävän muuttujan tai katkovan sitä osiin. Jos merkkijono jaettaisiin lainausmerkeillä osiin, välissä tulisi olla piste (esim. "jono"."jono"), jolloin kyseessä olisi konkatenointi.
Toisinaan tarvitaan ns. taulukkomuuttujia (arrays), joissa samalla muuttujalla on useita jäsenmuuttujia, esim.:
$aLinks = array('Linkki1.inc','Linkki2.inc','Linkki3.inc');
Funktioita, jotka sisällyttävät katkelmat toisiin dokumentteihin kannattaa käyttää siten, että palvelin toimisi mahdollisimman nopeasti, mutta funktioilla on myös omat ongelmansa. Alla hieman perustietoa:
Funktiota readfile() voi käyttää, jos katkelmassa jonka haetaan ei ole PHP-koodausta (jos tiedostossa olisi vahingossa PHP:tä, PHP-jäsennin ei jäsennä sitä PHP:nä). Esim. tiedosto topSection.inc
<div class="cNoPrint"><a href="#Top"><img src="../Kuvat/buttons/Top.gif" border="0" alt="[Alku]"
align="middle" title="Tämän sivun alkuun"/></a></div>
haetaan esim.:
<?php readfile('topSection.inc');?>
Funktiota require() voi käyttää, jos katkelmassa jonka haetaan on PHP-koodausta, mutta haettua tiedostoa ei tarvitse laittaa silmukkaan eikä haetuista tiedostoista luoda taulukkomuuttujaa. Esim. letters.inc tiedostossa olevan muuttuja
<?phphaetaan toisessa kohdin kirjoitettavaksi esim. seuraavalla koodilla:
$Standards="A";
...
?>
<?php require('letters.inc'); print $Standards;?>
Funktiota include() pitää käyttää, jos katkelmassa jonka haetaan on PHP-koodausta ja tiedostoa käytetään silmukoissa taulukkomuuttujan osina. Esim. tiedostoista Linkki1.inc, Linkki2.inc ja Linkki2.inc tehdään taulukkomuuttuja ja ne haetaan for-silmukkaan, jossa linkin ympärille kirjoitetaan listamerkkaukset. Linkkikokonaisuus tuotetaan listaelementin sisälle:
<ul>
<?php
$aLinks = array('Linkki1.inc','Linkki2.inc','Linkki3.inc');
for ($i = 0; $i < count($aLinks); $i++)
{
print "<li>";
include $aLinks[$i];
print "</li>";
}
?></ul>
Palvelimiin liittyviä huomautuksia:
Kaikki palvelimet eivät tue readfile() funktiota.
Jos require()-funktion kanssa tulee tilanne, että haettua sivua ei löydy, sivun käsittely pysähtyy virheeseen. Mikäli käytettäisiin include() funktiota palvelin pystyisi ohittamaan virheen. Funktion include() käyttö on siten kaikkein turvallisinta.
Palvelimet antavat vaihtelevassa määrin virheilmoituksia. Online-tilassa voi olla mahdotonta paikallistaa virhettä.
Tietyillä toimintamoodi- ja open_basedir-asetuksilla suhteelliset polut eivät toimi. Mikäli sivuja täytyy testata offline-tilassa, on syytä luoda hyvin systemaattinen nimeämiskäytäntö ja laittaa pääosa tiedostoista samaa hakemistoon. Kullekin tietotyypille tulee laittaa nimi, jota voi etsiä helposti tiedostomaskeja käyttäen (esim. *index.inc).
Palvelimet voivat estää myös absoluuttisten (http://...) polkujen käytön, jolloin PHP-tiedostoja ei voi jakaa useiden hakemiston kesken.
Ainakin seuraavat katkelmat olisivat mielekkäitä:
Sivun alkuosa eli suurin osan HEAD elementin sisään tulevaa
koodia.
Sivun yläosan rakennemerkkaukset.
Sivun yläosan navigointielementit.
Sivun asiasisältö.
Sivun loppuosan rakenne- ja navigointielementit + mahdolliset mainokset tai muut tiedotteet.
Itselläni esim. monijaksoisen liitesivun aloitussivun DynamicMenus.php3 rakenne on joskus ollut seuraava (olen lisännyt kommentteja):
<?php
/* Sivun yläosa: */
readfile('AdviceMeta.inc'); /* Alkuosa, jossa yhteiseen HEAD-osaan asti. */
require ('DynamicMenus0Top.inc'); /* Sivukohtainen HEAD-osa jaBODY-elementin alkumerkkaus.
/* BODY-osan alku: */
readfile('topSection.inc'); /* VälittömästiBODY-elementin jälkeen tuleva yhteinen BODY-osan koodaus. */
require ('dynamicMenusButtons.inc'); /* Sivukohtaiset navigointinappulat. */
readfile('AdviceOldInfo.inc'); /* Vanhoja selaimia koskeva yleinen tiedoite. */
/* BODY-osan yläosassa olevat yleiset navigointielementit: */
readfile('./include/AdviceHideInst.inc');
readfile('./include/allPages4.inc');
require ('AdviceNavigation.inc');
/* BODY-osan asiasisältöön liityvät osat: */
print "<div class=\"doc\" id=\"docSection\">"; /* Asiasisällön ympärille kirjoitettavan perusrakenne-elementin alkumerkkaus. Joillakin sivuilla tämä on osana varsinaista asiasisältöä. */
require ('./appendixesContents/DynamicMenus0Content.inc'); /* Sivun varsinainen asiasisältö. */
/* Sivun päättämiseen liityvät osat: */
readfile('./include/nextSection.inc'); /* Kaksi navigointinappia (linkki sivun alkuun ja seuraavalle sivulle). */
print "<br /></div>"; /* Asiasisällön ympärille kirjoitetun perusrakenne-elementin loppumerkkaus. */
readfile('bottomShort.inc'); /* Sivun lopullinen päätös, joka sisältääBODYjaHTMLelementtien päätösmerkkaukset. Joillakin sivuilla ennen päätösmerkkauksia on mainoksia ja tiedotteita. */
?>
Jotkin katkelmat voi ajatella ikään kuin moduuleiksi. Yllä olleessa tapauksissa kaikki selaimet saavat samat moduulit, mutta niitä voisi myös yksilöisi selainkohtaisesti (käsittelen selaintunnistuksia edempänä.
Sivukohtaisissa META elementeissä osa on yleistä ja osa sivukohtaista. Esim.
sivukuvauksen alkuun haen alisivuston yleisen kuvauksen ja loppuun kirjoitan sivukohtaisen tarkennuksen:
<meta name="description" content="<?php
readfile('metaContent.inc');?>..." />
Olen tehnyt PHP + JavaScript koodauksella hyvin tehokkaan tavan kontrolloida relatiivisia navigaatiolinkkejä (Takaisin, edelliselle sivulle, seuraavalle sivulle ja sivun alkuun; engl. up, prev ja next) laittamalla sivun HEAD-osaan (mallina on CSS-sivujen englanninkielinen versio):
<link rel="prev" href="javascript:prev();" />
<link rel="next" href="javascript:next();" />
<link rel="up" href="javascript:up();" />
...
<script language="JavaScript1.1" type="text/javascript">
<!--
function print $up{
open("index1.php3","_self");}
function prev(){
open("Linkkeja.php3","_self");}
function next(){
open("index2a.php3","_self");}
//--></script><style type="text/css">
...
Ja sivun BODY-osaan:
<body...>
...
<td align="left" style="width:16px !important">
<a href="javascript:prev();" onmouseover="window.status='The\ previous\ page\ or\ anchor';return true;" onmouseout="window.status='';return true;" class="left" title="The previous revious page tai anchor"><img
src="../Kuvat/buttons/Left.gif" border="0" alt="[Prev]" align=
"middle" style="height:16px; width:16px" /></a>
</td>
<td align="center" class="up">
<a href="javascript:up();" onmouseover="window.status='To\ the\ upper\ page\ level';return true;" onmouseout="window.status='';return true;" class="up" title="To the upper page level"><img
src="../Kuvat/buttons/TopSmallDouble.gif" border="0" alt="[Up]" align=
"middle" style="height:16px; width:16px" class="up" /></a></td>
<td align="right" style="width:16px !important">
<a href="javascript:next();" onmouseover="window.status='The\ next\ page\ or\ section';return true;" onmouseout="window.status='';return true;" title="the next page tai section" class="right"><img
src="../Kuvat/buttons/Right.gif" border="0" alt="[Next]" align="middle" style="height:16px; width:16px" /></a>
</td>
...
<?php readfile('./include/nextSection.inc'); ?>
</div>
</body>
</html>
Tiedostossa nextSection.inc on seuraava HTML-koodi:
<div style="margin-top:1.0em"><div class="cNoPrint"><a href="#Top"><img
src="../Kuvat/buttons/Top.gif" border="0" alt="[Top]" align="middle" title="To the top of this page"/></a><br /><br /></div>
<div class="noPrint noBig" align="right"><a href="javascript:up()"><img
src="../Kuvat/buttons/TopSmallDouble.gif" border="0" alt="[Up]" align="middle" title="To the upper page level" /></a> <a href="javascript:next();"><img
src="../Kuvat/buttons/Right.gif" border="0" alt="[Next]" align="right" title="The next page tai section" /></a></div><br /></div>
Kun käytetään JavaScript-koodausta ongelmana on se, että JavaScript-tuki täytyy olla päällä. Homma voitaisiin koodata pelkästään PHP:n avulla esim. seuraavalla tavalla (esimerkkinä siirtyminen sivulta Elementit0.php3 sivulle Elementit.php3):
<?php
$next = "Elementit.php3";
$up = ...
?>
LINK, PHP:llä laitetaan muuttujien avulla saadut attribuuttien arvot, esim. rel="up" href="<?php print $up;?>"<?php print "...<a href=\"".$next."\"><img src=\"../Kuvat/buttons/Right.gif\" border=\"0\" alt=\"[Next]\" align=\"right\" title=\"The next section\" /></a>"; ?>
tai
...<a href="<?php print $next;?>"><img src="../Kuvat/buttons/Right.gif" border="0" alt="[Next]" align="right" title="The next section" /></a>
Muuttujat voidaan sijoittaa myös funktioihin ja sitten kutsua niihin liittyviä funktioita, esim.:
<?php
function nextSection(){
$next=...
print $next; /* Muuttujat eivät toimi, jos ne määritellään funktion ulkopuolella paitsi siten, että funktion sisällä ilmoitetaan, että käytetään yleismuuttujia (esim.global $next, ...;). */
...
}
...<?php nextSection();?>
<a href="">...
Helpoiten selviää, jos muuttujille määrittelee oletusarvot, jotka sivukohtaisesti tarvittaessa määrittää uudelleen. Kaikissa tapauksissa osaa muuttujista ei tarvitse määritellä lainkaan sivukohtaisesti. Kun sivukohtaisia muuttujia käytetään, on muistettava, että muuttujat ottavan sen arvon, joka niille on viimeksi määritelty ennen muuttujiin liittyvää funktiota. Seuraava koodi ei toimi missään selaimessa:
<link rel="up" href="<?php up(); ?>" />
<?php
$up = "Content.php";
function print $up{
global $up;
print $up;
}
?>
Edellä olleessa esimerkissä linkit määritellään muuttujiksi. Käsittelen muuttujien käyttöä seuraavassa jaksossa hieman enemmän.
| Sivun jaksot: | Introjakso | Edellinen jakso | Seuraava jakso![]() | Viimeinen jakso![]() |