Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sivujen rakennustyyli

punppis [30.01.2009 21:45:27]

#

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(...); ?>
// index.php
include("yla.php");
echo "Olet etusivulla. " . $muuttuja;
include("ala.php");

hunajavohveli [31.01.2009 01:14:36]

#

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:

<?php
  // Tulostukset ennen sivukohtaista dataa
  $sivu = $_GET['sivu'];
  if($sivu == a) include(foo);
  if($sivu == b) include(bar);
  ...
  // Tulostukset sivukohtaisen datan jälkeen.
?>

Lebe80 [31.01.2009 02:14:49]

#

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

temu92 [01.02.2009 02:03:59]

#

<?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">
				&copy; 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.

Matso [03.02.2009 19:21:50]

#

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.

punppis [05.02.2009 10:04:12]

#

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

tsuriga [05.02.2009 10:56:55]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta