[Alku]
Testaa CSS-oppaan navigoinnin toimivuutta!
   
 
Hae sivuiltani:
[Apua]

Katkelmien hakeminen

Aiheet

Katkemat hakevat funktiot

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;?>
tulostaa seuraavan tekstin:
"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:

Palvelimiin liittyviä huomautuksia:

  1. Kaikki palvelimet eivät tue readfile() funktiota.

  2. 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.

  3. Palvelimet antavat vaihtelevassa määrin virheilmoituksia. Online-tilassa voi olla mahdotonta paikallistaa virhettä.

  4. 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).

  5. Palvelimet voivat estää myös absoluuttisten (http://...) polkujen käytön, jolloin PHP-tiedostoja ei voi jakaa useiden hakemiston kesken.

[Alku]

Mitkä laitetaan katkelmiksi

Ainakin seuraavat katkelmat olisivat mielekkäitä:

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 ja BODY-elementin alkumerkkaus.
/* BODY-osan alku: */
readfile('topSection.inc'); /* Välittömästi BODY-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ää BODY ja HTML elementtien 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ä.

Yksityiskohtia

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):

  1. Dokumenttiin laitetaan ennen linkkejä sivukohtainen tieto muuttujiin (laittaisin sen dokumentin HEAD-osaan):
    <?php
    $next = "Elementit.php3";
    $up = ...
    ?>
  2. Jos käytetään elementtiä LINK, PHP:llä laitetaan muuttujien avulla saadut attribuuttien arvot, esim. rel="up" href="<?php print $up;?>"
  3. Sivun lopussa oleva linkkikokonaisuus haetaan samalla tavalla kuin yleensä <?php require('...');?> tai <?php include('...');?> käyttäen.
  4. Haettu tiedosto sisältää linkit muualla määriteltyjen muuttien avulla haettuina attribuuttien arvoina. Se voisi olla kahden alla olevan esimerkin kaltainen:
    <?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, ...;). */
...
}

...
<a href="
<?php nextSection();?>"> ...

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.

[Alku]