Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Linkit siisteiksi ilman mod_rewriteä

GoldenDragon [09.10.2007 23:19:47]

#

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");
        }
    }
?>

Merri [23.10.2007 13:38:50]

#

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.

punppis [01.11.2007 21:40:44]

#

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?

Merri [06.11.2007 10:13:26]

#

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.

rax [18.06.2008 17:57:35]

#

Mites helvetissä tän saa toimimaa?

Joku ohje ois voinu olla paikallaa

Vastaus

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

Tietoa sivustosta