Pieni koodibinkki siitä, miten saada sivut dynaamisiksi ja samalla linkit siisteiksi ilman mod_rewrite:a. Koodivinkki koodattu käyttäen OOP:ta. Vaatii PHP5:n toimiakseen.
Skripti toimii näin. Uuden sivun saa luomalla tämän sivun nimisen kansion ja samannimisen sisältötiedoston .pages-kansioon (tai mihin tahansa kansioon, jonka itse määrittelet skriptissä).
Esim. Palvelimen julkisen osan juuressa, (tai siinä, jonka annoit muuttujalle $inetpub arvoksi) oleva index.php ($inetpub/index.php) on aina automaattisesti etusivu (tai minkä tahansa muun määrittelemäsi niminen). Kansiossa $inetpub/sivunnimi/ oleva index.php taas saa sisällökseen kansionsa nimisen tiedoston sisällön ($inetpub/.pages/sivunnimi).
Uusi sivu luodaan siis luomalla uuden sivun niminen kansio ja luomalla sinne index.php, joka lisää itseensä julkisen osan juuressa olevan index.php:n. Näin linkit saadaan muotoon "http://www.domain.com/sivunnimi/" muodon "http://www.domain.com/?sivu=sivunnimi" sijasta.
Ja tätä vinkkiähän voi soveltaa. ;P Kysykää, jos jokin kohta jäi epäselväksi. Muistakaa muuttaa index.php:n tiedot omaa järjestelmää vastaaviksi.
Koodi testattu toimivaksi omassa järjestelmässä.
<?php
// Tarvittavat, lisättävät tiedostot:
require_once '/home/tunnus/wwwroot/includes/pageclass.php';
// Palvelimen julkisen osan juuri sekä skriptin tiedostonimi ja polku.
$inetpub = '/home/tunnus/wwwroot/public_html';
$script_name = getcwd() . '/index.php';
// Luodaan sivusta objekti ja näytetään sivu.
$page_obj = new Page($script_name, $inetpub); /* Jätetään loput parametrit
oletuksiksi (etusivutiedoston nimi jne.). */
$page_obj->display();
?><?php
class Page
{
/**
* Luokkamuuttujat
*/
// Privaatit
private $_isPage = false; /* Sisältää tosi/epätosi, riippuen onko
sivua olemassa (alkuarvo epätosi, bool). */
private $_pTmpName; /* Sisältää väliaikaisen sivunnimen
(tarkistusta varten, string). */
// Julkiset
public $frontPageName; // Sisältää etusivutiedoston nimen.
public $nfPageName; // Sisältää ei löytynyt -tiedoston nimen.
public $pagesDir; /* Sisältää sivujen sisälttötiedostojen kansion
nimen. */
public $pContent; // Sisältää sivun sisällön (string).
public $pName; // Sisältää sivun nimen (string).
public $pagesList = null; // Sivulistan alustus (mixed, string).
public $inetPub; /* Sisältää palvelimen julkisen osan juuren
polun (string). */
/**
* Luokan konstruktori
*/
public function __construct($scriptName, $inetPub,
$frontPageName = 'etusivu', $nfPageName = 'notfound',
$pagesDirname = '.pages', $nfPageName_str = '[[notfoundpagename]]')
{
// Viedään palvelimen julkisen osan juuri luokkamuuttujaan.
$this->inetPub = $inetPub;
// Etusivutiedoston nimi.
$this->frontPageName = $frontPageName;
// Ei löytynyt -tiedoston nimi.
$this->nfPageName = $nfPageName;
// Kansio, jossa sivujen sisältötiedostot ovat.
$this->pagesDir = "$inetPub/$pagesDirname";
/* Siinä tapauksessa, että sivua ei ole, on näytettävä sivu, joka
kertoo että sivua ei löytynyt. Tämä muuttuja määrää, minkälainen
kohta tekstistä korvataan ei-löytyneen sivun nimellä. */
$this->nfPageName_str = $nfPageName_str;
/* Jos skriptinnimi (polku + tiedostonimi) on juuressa oleva
index.php, on sivu etusivu. */
//echo "$inetPub/index.php $scriptName ";
if ($scriptName == "$inetPub/index.php") {
$this->_setPage($this->frontPageName);
// Muuten tarkastetaan, onko sivua. Jos on, ladataan vastaava sivu.
} else {
$this->_pTmpName = substr(
$scriptName, (strlen($inetPub) - 1),
(strlen($scriptName) - 1)
);
/* Jos sivu on olemassa, asetetaan se sivuksi. Muuten sivuksi ei
löytynyt -sivu. */
($this->_isPage()) ?
($this->_setPage($this->pTmpName)) :
($this->_setPage($this->nfPageName));
}
}
/**
* Metodi, jolla sivu lopulta näytetään:
* $pobject->display();
*
* Tee täällä kaikki mahdollinen käsittely näytettävän sivun html:lle.
*/
public function display()
{
/* Jos sivua ei löytynyt, korvataan $this->nfPageName_str -muuttujan
mukainen kohta notfound-sivusta löytymättömän sivun nimellä */
if ($this->pName == $this->nfPageName) {
$this->pContent = str_replace(
$this->nfPageName_str,
$this->_pTmpName,
$this->pContent
);
}
echo $this->pContent;
}
/**
* Privaatti metodi _setPage() Asettaa luokkamuuttujan pName arvon ja
* lataa sivun sisällön luokkamuuttujaan pContent.
*/
private function _setPage($pageName)
{
$this->pName = $pageName;
$this->pContent = $this->_loadPage();
}
/**
* Privaatti _isPage() tarkastaa, onko sivua olemassa
*/
private function _isPage()
{
// Kerätään kaikki sivut (tiedostot) taulukkoon.
$this->pagesList = glob("$this->pagesDir/*");
/* Käytetään tilapäistä ptmpName-muuttujaa (pName, ennen
tarkistusta, onko sennimistä sivua olemassa). */
$this->_pTmpName = explode('/', $this->_pTmpName);
$this->_pTmpName = $this->_pTmpName[(count($this->_pTmpName) - 2)];
/* Käydään pagesList-taulukko läpi silmukassa ja muunnetaan sen
alkiot niin, että niiden arvoina on pelkkä sivunnimi (poistetaan
polku ja tiedostonimi niin, että viimeisen kansion nimi jää
alkion arvoksi. */
$plcount = count($this->pagesList);
for ($i = 0; $i < $plcount; $i++) {
if (!is_dir($this->pagesList[$i])) {
/*$this->pagesList[$i] = explode('/', $this->pagesList[$i]);
$this->pagesList[$i] = $this->pagesList[$i][
(count($this->pagesList[$i]) - 1)
];*/
// Yksinkertaisempi tapa
$this->pagesList[$i] = basename($this->pagesList[$i]);
}
}
// Jos annettu nimi on olemassa, palautetaan tosi (true).
if (in_array($this->_pTmpName, $this->pagesList)) {
$this->_isPage = true;
return true;
}
// Muutoin epätosi (false).
return false;
}
/**
* Privaatti _loadPage() palauttaa sivun sisällön tiedostosta
*/
private function _loadPage()
{
return file_get_contents("$this->pagesDir/$this->pName");
}
}
?>Jos tämänkaltaisesta systeemistä haluaa vaivattoman, niin jokin FTP-luokka kehiin ja sen voimin voi luoda/poistaa hakemistot ja tiedostot. Eli sivumuokkain saa hoitaa hommat. Omin voimin FTP:llä sörkkiminen joka välissä on kuitenkin kauhean vaivalloista.
FTP-luokan etuhan on ehdottomasti se, että tiedostojen oikeudet menevät oikein, PHP:n kautta tiedostoja luodessa tiedostoille tulee eri oikeudet ja jotkin palveluntarjoajat voivat rajoittaa näitä merkittävästi. FTP toimii varmasti.
Ymmärsinkö nyt oikein? Ton esimerkin mukaan siis pitäis olla seuraavat tiedostot ja kansiot:
.../public_html/index.php
.../public_html/sivunnimi/index.php
.../public_html/.pages/sivunnimi/sivunnimi (tiedosto)
Tuohon sivunnumi (tiedostoon) pitäisi siis laittaa jotain tekstiä.
Kaiken tämän jälkeen saat sivun näkyviin, kun kirjoitat osoiteriville domainisi.fi/sivunnimi...
Miksei voisi suorilta laittaa tuota sivunnimi-kansiota tuohon public_html:n juureen, ja sivu toimisi täsmälleen samalla lailla?
IIS:ään on saatavilla mod_rewriteä pitkälti vastaava ja samaan tapaan toimiva ratkaisu, ISAPI_Rewrite. Täysversio on maksullinen, mutta ilmainenkin versio löytyy ja se on täysin riittävä yhtä tai vaan paria sivustoa koneellaan pyörittävälle. Täysversio tukee hakemistoista löytyviä .htaccess-tiedostoja.
Mites helvetissä tän saa toimimaa?
Joku ohje ois voinu olla paikallaa
Aihe on jo aika vanha, joten et voi enää vastata siihen.