Tämä pienehkö koodivinkki näyttää miten toteutat sivusi _turvallisesti_ dynaamisiksi ja näin helpotat sivujen päivittämistä ja vaivaasi.
Kommentit koodivinkin aikana on englanniksi (tottumus kaiketi)
Sivut ladataan osoiterivin perusteella. Esim http://jope.psykoosi.org/index.php?page=etusivu
Testaa ja ymmärrä koodi.
<?php /* * Page load system coded by Joni Järvinen a.k.a Jope <jope@psykoosi.org> * More scripts can be found at http://jope.psykoosi.org/ (Finnish site) * * This system shows you how to load page safely using GET method. * There is much benefits in this kind of system for example you can make * your homepages more dynamic loading texts from seperate files. * */ // Here you have to list every page you want that can be loaded $pages = Array ( "news" => "includes/news.php", "info" => "includes/info.php", "and so on" => "right?/you get it?.php" ); // We check if there is page given. If not by default we load news.php $page = ($_GET["page"] != "") ? $_GET["page"] : "news"; // Lets check that the file exists and it is in $pages array if (isset($pages[$page]) AND file_exists($pages[$page])) { // Everything's allright lets load the page include ($pages[$page]); } else { // Somethings wrong! We show error message echo "Error 404 - The page cannot be found."; } /* * If you think you have like 100 pages and you don't want to write * the array manually. Here's the solution for you. * * function MakeArray (String handle) * * Example: * MakeArray ("/home/jope/public_html/my_pages/loads/"); * * Then you have an array to use with Page load system. Remember the ending slash! * * Use this function with caution! Check the directory which you turn * into array that it doesn't include any UNWANTED files. * */ function MakeArray ($dir) { global $pages; $handle = OpenDir ($dir) or die ("Couldn't open $handle!"); while (FALSE !== ($file = ReadDir($handle))) { if ($file != ".." AND $file != ".") { if (is_dir($dir . $file)) { MakeArray ($dir . $file . "/"); } else { $pages[ereg_replace("\.(.*)$", "", $file)] = $dir . $file; } } } CloseDir ($handle); } ?>
Kun tuo tarjoaa tuota virhe numero neljänollanelosta, niin eikö siitä pitäisi laittaa myös headeriin jokin tieto. Vai muistanko väärin. Pitäisi varmaan tutkia HTTP:n määritystä...
hööm... ei täs oo mitää ideaa, helpompaa on vaa includaa jokaiseen PHP-tiedostoon kaks osaa, ylle yks ja alle toinen, ja sit keskelle sisältö, eikä tarvi tehä tommosii vaivallisii scriptei jotka sit pahimmas tapaukses alkaa bugaa jotenki todella oudosti..
noitten arraytten kirjottamisiin menee varmaa enemmän aikaa ku kahen includen pasteemiseen ;P bad idea...
No te ette nyt kai tajunnut? Tonhan avulla ei edes tarvitse laittaa includeja. Teet vaan index.php:n ja laitat html koodin sinne ja sitten laitat tuon skriptin siihen kohtaan mihin sivut ladataan ja sen jälkeen kirjoitat vaan tekstit erillisiin tiedostoihin ja käytät vaikka tota funktiota tossa luomaan sen arrayn. Tämähän on ihan pirun kätevä.
Ja DSword tossa ei ole kyse semmoisesta vaan yksinkertaisesti tulostetaan sivulle, että sivua ei löydy.
Samanlaista skriptiä käytän omilla sivuilla.
http://jope.psykoosi.org/?sivu=taa_ei_toimi
http://jope.psykoosi.org/?sivu=etusivu
kyllä mä tajusin, sun pitää tehä tiedostot, kirjottaa niitten nimet ja osotteet arrayhin... kaks includee on _mun_ mielestä selvempi, jepjep..
siis hetkinen includeeko toi sit halutun tiedoston indexin sisään jos olen divittänyt kaikki valikot reunoihin ja tämän keskimmäiseksi?
Tai parempi kai kokeilla itse, mutta vastatkaa silti :-S
Öö.. en tajunnut oikein kysymystäsi?
Tämähän toimii esim näin: (Sivut tulee muotoon index.php?page=jotain)
<html> <head> <title>Testi</title> </head> <body> <h2>Nämä on Jopen hienot kotisivut</h2> <!-- PASTEA TÄHÄN YLLÄ OLEVA SKRIPTI --> </body> </html>
Nyt vain kirjoittelet tekstit erillisiin tiedostoihin ja ne latautuvat tekstin "Nämä on Jopen hienot kotisivut" tekstin alapuolelle.
Ja T.M. Jos include on mielestäsi selvempi niin tee vaikka näin:
Näin sinun ei tarvitse laittaa joka tiedostoon includeja?
Tämä säästää tilaakin koneelta jos nyt vähän viilaillaan :))
Sivuja on helpompi hallita ja skriptin mukana olevan funktion avulla ei edes arraytä tarvitse itse kirjoittaa.
Aivan erinomainen vaihtoehto jokaiselle.
Siis juurinoin olen tehnyt lähes :-P
Ja sitten vain linkit sivuilla mutoon: http://osote.com/index.php?page=joku_sivu
Mitä se sanoo? Virheilmoitus? Muuten vain ei toimi?
Ahh, kiitti vähän jouduin tota säätää, mut thx nyt toimii loistavasti yhdistän viel ton "tyylisivun" niin, että ennen tuota includetan diviä (objektin paikan määritys (koordinaatit) avulla käyttäen tehdyn upean ulkoasun :-P
Ok. :)
oli kyl tarkotus tonnefoorumii;-)
*shooting myself because didnt know this earlier*
voisiko noin tehdä? Ja olisko siitä minkäänlaista hyötyä?
Sorry kun floodaan mutta vielä yksi kysymys kun tuhoan oman www-projektini täydellisesti ;p
Jos tekee näin (index.php):
<?php
include("ylä.php");
?>
*** tuo scripti ***
<?php
include("ala.php");
?>
niin täytyykö ne linkit olla tuossa keskellä vai voiko ne olla myös vaikkapa tuossa ylä.php tiedostossa?
Kiitoksia Jopelle mahtavasta koodivinkistä =) Muutama tuntihan siinä vierähti ennen kuin ymmärsin täysin mitä ajoit takaa. Tuo kuitenkin toimii ja varsinkin kun heittää includet ylös ja alas ja tuon scriptin siihen väliin. Mutta hieman koodia joutui hiomaan omaa käyttöäni varten. Opiskelen juuri XML:ää ja PHP on jäänyt unohduksiin jo hieman yli vuodeksi, joten muisteltavaa on vielä paljon =p
Mulon ainaki yla.phpees ja ala.pahpees o sitte copyrigtit ;-)
No kaikkien vapaaseen käyttöön tämä skripti täällä on :)
Enhän minä tänne muuten tätä olisikaan lisännyt.
Itselläni moinen toteutuu yksinkertaisesti switchillä.
URL on muotoa /www/index.php?sivu=etusivu tai vaikkapa /www/index.php?sivu=linkit
Juu kyllä se onnistuu noinkin.. ihan samaa asiaa toteuttaa, mutta minun esimerkissäni on juuri se etu, että taulukon missä sivut ovat määritelty voi luoda automaagisesti kansiosta tuolla funktiolla.
Niin ja tästähän näkee myös esimerkin rekursiivisestä funktion kutsumisesta. :)
Frameja ne olla pitää :)
No ei todellakaan ei niinkun mistään hinnasta. Framet pilaavat jokaisen sivun. iframe saattaa jossain tilanteessa olla ihan kätevä, mutta frameja ei tod käytetä.
frameja niiden ei olla pidä
mul on mun sivuilla iframe ja ajattelin et tää laittais sen sivun siihen ifameen miten se toimis
Tuohan on hieno systeemi! Toistaiseksi olen naputellut arrayt käsin, mutta nyt sisällön pursuillessa hakemistoista ulos, olisi tarkoitus ottaa käyttöön tuo MakeArray-funktio. Mietityttää vaan, että mihin kohtaan tuota koodia tulisi määrittää hakemistopolku, josta tahdon tehdä arrayn? Ja miten? Osaisiko joku auttaa, odys kenties?
MakeArray() luo globaalin taulukon, joka toimii kaikissa kohdissa koodiasi, funktioissa tietysti esittelet global $pages;
Laitat MakeArray ("polku/hakemistoon/missä/ladattavat/sivut/ovat/
Jepulis. Rupesinkin vääntämään polkua väärin ja olin ymmälläni kun ei toiminut. Sen jälkeen tutkin tarkemmin ja niinhän siitä puuttui tuo viimeinen merkki.
Kiitos siis kommentista! Ja ennen kaikkea suurkiitokset hienosta skriptistä - olet todella lahjakas.
Miksi, oi miksi en saa tuota toimimaan yhdessä Apachen kanssa. Aina lykkää vain 404-virheilmoitusta, sitä skriptissä määriteltyä. Heti kun heitän tiedostot oikealle servulle, niin johan alkaa pelittää. Osaako kukaan auttaa? Apachen asetuksia muokkaamaan kenties?
Mitenkäs tohon koodin pätkään sais toisen muuttujan lisäksi.
eli kun sivu on nyt ?page=members ni tulis ?page=members&name=pauli esim. ?
lisäys edelliseen: siis nyt on vaik ?page=members ja sit siel sivul on linkki vaikka "pauliin" ja oon pistäny pauli.phpn arrayseen ja sen linkin muotoon ?page=pauli, niin se ei toimi. eli pitäs saada vaikka ?page=members&name=pauli
Siis pitääkö koodiin tehdä jotain muutoksia (osoitepolkuja) tai pitääkö luoda jotain tiedostoja/kansioita?
Ei mee perille...
ööh pirhana ei skulaa en tiedä mikä on vikana kun painan linkkiä alkaa lataamaan mutta haluttu teksti ei vai ilmesty tuo etusivun saan näkymään mutta linkit eivät skulaa =/
hmm siis eikös laitetaanko linkiksi ?sivu=jotain vaiko index.php?sivu=jotain kummallakaan tavalle ei toiminut tarvitseeko targetiksi jotain?
Molemmilla tavoilla pitäisi (siis olettaen, että tiedoston nimi on index.php) toimia. Olet tehnyt varmaankin jotain väärin.
Kiitoksia koodista, todella pätevä ja yksinkertainen.
Loistava koodi käytän itsekkin
Sivuilla: http://www.opypmk.fi on käytössä tuollainen koodi yhdeksällä muuttujalla. Muuten toimii hyvin , mutta Linkeistä tulee aika pitkiä...
Tossas on vain yksi vika: Entäs jso formista lähetetään POST tietoa, jonka pitäisi sitten mennä index.php?sivu=jokuihmejuu :n ei taida onnistua?
Hyvien koodaustapojen mukaisesti arrayn sekä funktioiden ensimmäiset kirjaimet voisi kirjoittaa pienellä sekä käyttää heittomerkkejä lainausmerkkien sijaan taulukon arvoihin viitatessa.
Näinkin voi tehdä linkit metatageista ja yllä oleva esimerkki yhdistettynä tähän olisi näppärä.
linkitettävän tiedoston head osaan <META NAME="title" CONTENT="LINKIN NIMI"> ja alla oleva koodi sivulle, hakee
siis sivun linkin, tässä esimerkissä kaikista .phtml päätteisistä tiedostoista.
<?php function Metatiedot($tiedostonimi) { $metatiedot = get_meta_tags($tiedostonimi); return $metatiedot; } $polku = "./"; $hakemisto = opendir( $polku ); while ( $tiedosto = readdir($hakemisto) ) { if ( ereg("\.phtml",$tiedosto) ) // tiedosto tyyppi esim .htm { $meta = Metatiedot($polku . "/" . $tiedosto); print "<a href=\"$tiedosto\">$meta[title]</a><br>"; } } closedir( $hakemisto ); ?>
Sain toimimaan ensimmäisen koodin. Kun yritin tehdä sivusta väännöstä englanniksi, saan koko ajan 404- virheen.
englannin kielinen tiedosto on index2.php ja sijaitsee samassa juuressa index.php:n kanssa. Tiedoston ensimmäinen linkki osoittaa includes-kansioon, jossa englannin kielinen versio on muitten joukossa.
Vaikka kuinka silmät kipeinä tuijotan, en näe mitään rakenteellista eroa, mutta toinen ei toimi? Osoiterivillä näkyy jopa oikea osoite, mutta sisältö vain ei avaudu.
Jos joku ymmärtää tästä selityksestä, niin nöyrästi pyydän auttamaan..
odys, se jos osoite on vaikka \ros\kaa\?kebab niin se kokeilee oletuksena tämmöistä: \ros\kaa\index.php?page=kebab
Aihe on jo aika vanha, joten et voi enää vastata siihen.