Millä systeemillä rakentaa putkalainen sivunsa? Itsellä on oma systeemi melkein joka sivulla ollut tähän asti, mutta se ei oikein ole aukoton, sillä esim. headerien lähetys menee vaikeaksi. Risuja, ruusuja, vinkkejä ja omia neuvoja/ratkaisuja tähän ketjuun.
Systeemini on karkeasti tälläinen:
// yla.php <?php include("mysql.php"); //tässä tiedostossa määritellään yhteysmuuttujat, ja tietokannan mahdollinen luonti $muuttuja = "moi"; ?> <html> ..... <body>
// ala.php </body> </html> <?php mysql_close(...); ?>
En ole kovin paljon sivuja rakennellut, mutta PHP:llä suosin rakennetta, jossa jokaisen sivupyynnön käsittelee yksi skripti (index.php tai vastaava), jolle haluttu sivu annetaan parametrina osoitteen mukana. Jotakuinkin siis tyyliin:
(Eiks näitä aiheita ala oleen jo miljuuna?)
No sanon sen mitä olen sanonut aikaisemminkin.
Tuo "yla.php ja ala.php" -systeemi toimii yksinkertaisilla sivuilla, mutta kun sivupohjaan tehdään enemmän grafiikkaa, jolloin ylimääräisiä elementtejä lisäillään, niin muokkaaminen käy ennenpitkää erittäin hankalaksi.
Siksi olisi hyvä, että aloitetut html-tägit suljettaisiin samassa tiedostossa, missä ne on aloitettukin.
Eli systeemi toimi kutakuinkin näin:
Parametrien mukaan tulostetaan puskuriin sisältö, sisällön ja parametrien mukaan valitaan sivupohja. Sivupohjaan on määritelty kohdat, joihin sisältö tulostetaan.
Eli sisältö "rakennettaisiin" ensiksi, ja tämän jälkeen vasta alettaisiin tulostamaan mitään.
<?php // Conffit include_once("include/config.php"); // Yhdistetään kantaan include_once("include/db_connect.php"); $site_var = "s"; if(file_exists("form/form_".strtolower($_GET[$site_var]).".php")){ $error = array(); @include("form/form_".strtolower($_GET[$site_var]).".php"); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Site title</title> <link rel="stylesheet" href="style.css" /> <link rel="shortcut icon" href="favicon.ico" /> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-15" /> </head> <body> <div id="wrapper"> <div id="header"> <!-- HEADER TEXT --> </div> <div id="navigation"> <h3>Navigation</h3> <a href="?">Index</a> </div> <div id="content"> <?php $page_dir = "pages/"; $_page = strtolower($_GET[$site_var]); $_page = trim(str_replace(array("..", "/"), "", strip_tags($_page))); if(empty($_page)){ include_once($page_dir."home.php"); } else { if(file_exists($page_dir.$_page.".php")){ include_once($page_dir.$_page.".php"); } else { include_once($page_dir."notfound.php"); } } ?> </div> <div id="footer"> © Sites 2008-<?php echo date("Y"); ?> </div> </div> </body> </html>
Siinäpä oman sivutyylini index.php, ja kyseinen ulkoasun runko on nyt alkanut pysymään vakiona minulla.
Formien käsittely (tai mikä tahansa muu haluttu sivun alussa hoidettava juttu) hoidetaan form/-kansiossa olevia koodinpätkiä includettamalla.
Nykysin kun käytän luokkia, teen lähes kaiken niillä. Tällä hetkellä käytössä sellanen tapa, että sivut/sivujen pohjina toimivat muotit on omia luokkia, ja sitten on eriksen jotain perushyödyllisiä luokkia.
Elikkä sivut löytyy omasta hakemistosta, ja index.php:ssä tai muussa sivupyyntöjä käsittelevässä tiedostossa/luokassa luodaan instanssi sitten sivuluokasta ja kutsutaan haluttua metodia.
Esim.
<?php //Sivupyynnöt /* Ja sivuthan voi löytyä vaikka tietokannasta, kuten CMS:ssäni, lisäks voidaan määritellä vaikkapa parametreja joita syötetään sitten luokan kutsuttavalle metodille tms, jolloin voidaan yhdestä luokasta saada erilaisia sivuja. */ $pages = array( 'sivu1' => 'TekstiSivu', //... ); if(array_key_exists($requestPage, $pages){ //Luodaan instanssi pyydetystä sivu-luokasta $page = new $pages[$requestPage](); /* Kutsutaan inittiä ennen mitään tulostusta, tietty toi vois olla ihan constructorinakin, mutta jos sitä ei haluta kutsua ihan heti, ni voi tehdä näi.. */ $page->init(); /* Headeri. Ja tietty hienommin toteutettuna, on erillinen teemoja käsittelevä luokka jne.. :)) */ require('header.php'); //Tässä voitas kutsua jtn muutakin metodia, mikäli määritelty if(method_exists($page, 'index'){ $page->index(); }else{ //Kutsuttua metodia ei löydy! } //Footteri require('footer.php'); }
<?php //Sivu-luokka class TekstiSivu { function init(){ //Kutsutaan aina ennen mitään tulostusta } function index(){ //Sivuluokan "oletusmetodi", jota kutsutaan jos muuta ei määritelty } function jotainIhanMuuta(){ //Elikkä void } }
Sillain.. ja ?>-lopetustagithan on turhia tiedostojen lopuissa.
Matso kirjoitti:
Sillain.. ja ?>-lopetustagithan on turhia tiedostojen lopuissa.
Ei sitä koodia ole myöskään pakko sisentää, mutta se vain näyttää siistimmältä :D
Ja ideanahan tuossa lopetustagin poisjättämisessä on se, että ylimääräiset merkit (esim. rivinvaihdot, välilyönnit) lopetustagin jälkeen voivat johtaa surullisenkuuluisaan headers sent...
-tilanteeseen. Kuuluu mm. Zend Frameworkin koodaussuosituksiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.