php switch get II.


Az alábbi leírásnak már van egy előzménye, melyet “php switch get I.” címmel megtaláltok a honlapon. Mivel e leírás annak továbbfejlesztett – és módszerben is újat adó – változata, a bevezető szöveg nagy része gyakorlatilag ugyanolyan lesz.
Magát az ötletet és a kódot TLoF barátomtól kaptam, ezúton is nagy köszönet illeti!

A 2 módszer közötti különbség: elég nagy, ha azt vesszük hogy teljesen más a kód. :) Ez viszont szerintem mellékes, ami fontosabb, hogy a második megoldás sokkal kényelmesebb! Az elsőnél részben ugye még az volt a menet, hogy amint új lappal bővült a lap, 3 új sorral kellett kipótolni a kezdő index.php-t (case, inluce, break). Ez nemcsak hogy plusz munkát jelentett, de a kezdőlap méretét is folyamatosan növelte.

Ennek az új megoldásnak köszönhetően viszont csak egyszer kell az index.php-be illeszteni a kódot, a további lapokat elég ha egy általunk definiált alkönyvtárba tesszük be. A többit a kód elvégzi, nekünk csak linkelni kell a lapokra :) Most pedig jöjjön a tényleges leírás!

Vegyünk egy példát:
Van egy honlapod, 1 kezdőlappal és 20 aloldallal együtt. A fájlok jelenleg HTML kiterjesztéssel vannak fent a szerveren, és mindegyik HTML fájlok tartalmazza a komplett grafikát.
Úgy döntesz, az egyik képet ki szeretnéd cserélni a fejlécben, de ezzel megbontod az eddigi arányokat is (amit pl. táblázatokkal oldottál meg), mit tudsz csinálni? Túl sok mindent nem, kénytelen vagy 21x módosítani ugyanazt a képet+táblázatot.
Ugye nem túl kényelmes …?

Egy másik lehetőség, hogy a lapodat frame-ekkel oldod meg, a fejléc, menü stb.. szóval az állandó elemek frame-ekbe kerülnek, így tulajdonképpen kevés munkával könnyen lehet frissíteni az egész lap kinézetét.
Mi van akkor, ha neked vmiért nem tetszik a frame-s megoldás, vagy vmi oknál fogva csak nem alkalmazható az adott szituban? Bőven elképzelhető a szitu, én pl. nagyon nem szeretem a frame-s lapokat (bár elvétve látni 1-1 egész jól sikerültet)

A 3. megoldás a PHP használata. Nem kell megijedni tőle, egyeltalán nem vészes a dolog, nem kell programozni tudni vagy hosszú kódokat böngészni, elég ha a copy-paste-t tudod kezelni :)

Először is hozz létre egy index.php nevű fájlt, ez lesz az alapértelmezetten megjelenő fájlod a könyvtárban, és ugyanakkor ez lesz a sablon/theme/skin (ki hogy hívja) is, ami a grafikát tartalmazza. A többi lapod (20db) tartalmát ebbe fogod úgymond beleolvasztani.

Miután létrehoztad az index.php-t, nyisd meg egy webszerkesztő programban (pl. Dreamweaver, Frontpage stb..), és készítsd el ugyanúgy, ahogy azt anno a index.html fájloddal is tetted. Csináld meg a fejrészt, a menüket, a lábrészt stb…, de azt a területet, ahova anno a kezdőlap tartalmát alkotó szöveget (köszöntés, bevezetés stb..) tetted, hagyd üresen. Ide fog jönni a PHP kód.

<?php
$_GET['id'] = str_replace('../', '',$_GET['id'] );
if (isset($_GET['id']) and $_GET['id'] != '')
{
if (is_file("modulok/". $_GET["id"] . ".php"))
{
include("modulok/". $_GET["id"] . ".php");
}
else
{
include("modulok/error.php");
}
}
else
{
include ("modulok/kezdolap.php");
}
?>

Ezt úgy ahogy van, másold be az index.php fájl azon területére, ahol majd szeretnéd, hogy megjelenjen a tartalom.

A kód tulajdonképpen csak annyit csinál, hogy ha a modulok alkönyvtárban talál olyan fájlt, aminek neve megegyezik az ID értékével+.php kiterjesztéssel, akkor beilleszti az index.php-ba a kód helyére. Az ID-t meg a linkekben adjuk meg. Nézzünk egy példát:

van egy főkönyvtárban található index.php, van egy modulok könyvtár, és a könyvtárban vannak php oldalak, melyek neve: oldal1.php, oldal2.php, oldal3.php és oldal4.php. Ha a linket az alábbi módon adjuk meg:

link az oldal2-re 

Az index.php-ban lévő kód az ID értékéhez (ami az oldal2) hozzáadja a .php kiterjesztést, majd az ezzel megegyező nevű fájlt betölti a modulok könyvtárból (ez lesz az oldal2.php). Ha nincs a feltételnek eleget tevő fájl, akkor az error.php-t jeleníti meg.

Online demo

A script működését illusztrálandó elkészítettem egy nagyon egyszerű “honlapot”, ahol ki lehet próbálni a működését: PHP Switch Get II demo

Maga a demo honlap is letölthető innen: www.tutorial.hu -> letoltes -> script.sources

Megjegyzések

  • A file kiterjesztése, ahova ezt a kódot beszúrod, mindig PHP-nak kell lennie.
  • Amely fájlokat behúzza, azoknak is PHP kiterjesztést ki kell adni.

Clean URL

Szintén fórumon vetődött fel a kérdés: Hogy lehet clean URL-eket gyártani ezzel a módszerrel? Pl. ha a
http://www.tutorial.hu/index.php?id=referencia helyett mondjuk a http://www.tuorial.hu/referencia.html címet szeretnénk használni?

Erre írta meg BlackY válaszként azt, hogy egy .htaccess fájlba fel kell venni az alábbi tartalmat:

RewriteEngine On
RewriteRule ^(.+?)\.html\??(.*) index.php?id=$1&$2

Kiegészítés

A fórumon utólagosan felvetett kérdés volt, mi a helyzet akkor, ha a behuzandó fájlok nem egy alkönyvtárban helyezkednek el, hanem pl. (ha a fenti mintához tartom magam) egy modulok/pstutorialok meg egy modulok/htmltutorialok (vagy akár több ilyen könyvtárban) nevű alkönyvtárban.

A könyvtárszerkezet pl. így néz ki:

-modulok/
———pstutorialok/
———————tutorial01.php
———htmltutorialok/

Ez esetben a linket így kell majd megadni:
index.php?id=pstutorialok/tutorial01

Szerző: Harder
Kódot írta: TLoF (www.kepregeny.net)

Kapcsolódó bejegyzések:
  • Honlapkészítés során, ha a hagyományos módon – statikus HTML fájlokat gyártva – állsz neki a munkának, előbb vagy utóbb belefutsz abba a problémába, hogy elég ma …

  • A cikk előzményeként olvasd el ezt a 2 leírást (php switch get I. és php switch get II.). A fórumon felvetődött a kérdés: hogy lehetne megoldani a nyelvválasztás …

  • Először is nem árt egy biztonsági mentést csinálni a főfájlodről! (index.html), aztán mentsd el a "fő" oldaladat , PHP dokumentumként. Egyszerűen csak …

  • Talán a cikk neve egy kicsit érdekesen hangzik, de aki belesett az alábbi problémába, az egyből érteni fogja miért is adtam ezt a nevet.Talán sokan olvastáto …

  • Az első kérdés, ami felmerül majdnem mindenkiben, hogy lehet egy többnyelvű honlapot megcsinálni, amin váltani lehet a nyelvek között. Vegyünk egy példát, van eg …

A cikket beküldte: Harder (http://blog.harder.hu)

20 hozzászólás

  1. Benedikt says:

    Mi a teendő akkor, ha alkönyvtárban helyezkednek el a fájlok és még CleanURLtis akarok használni?

    Tehát: index.php?id=pstutorialok/tutorial01 –> pstutorialok/tutorial01.html

    Külön-külön működnek a fent leírtak, egyszerre viszont nem. Gondolom a .htaccessben kellen módosítani a RewriteRule részt.

  2. kaktusztea says:

    Köszönöm a cikket!
    Nagyon nagyon hasznos, alkalmaztam is!

  3. Én ezt úgy szoktam kikerülni – mármint hogy amit pl. az index.php-n módosítok azt az összes aloldalon is átírjam – hogy az oldal felső (nevezzük header-nek) és az alsó (ez legyen footer) részét az oldal tartalmától kezdve és végén külön fájlokban tárolom.
    Így egy módosítás egy módosítás, bár ha mondjuk a menüben – tegyük fel ami a headerben van – azt már húzósabb “változtatni” de megoldható…

  4. Harder says:

    Nemsokára lesz ennek a cikknek folytatása, de már teljesen új motorral, amiben van clean URL-től kezdve snippet kezelésig mindenféle, szerintem tetszeni fog mindenkinek. A motort TLoF írta és mondta, hogy közkincsé tehető a lapon, csak még meg kell csinálni a cikket (reményeim szerint hétvégén lesz rá talán időm).

  5. Péter Piros says:

    Szeretném megkérdezni, hogy hogyan lehet egy php-s oldalba egy htm oldal csak egy részletét includolni?

  6. mmatyas says:

    Sziasztok !!
    Az én kérdésem az lenne, hogy lehet ezt megoldani kizárólag DIV-kel, tehát engem nem zavarna, ha nagy lenne az index.php állománya, sőt a keresők szeretik a sok szöveget, ezért “hide”, vagyis nem llátható DIV-ekbe raknám az anyagot és onann includolnám be.
    Ez talán még praktikusabb lenne, mint egy másik könyvtárból, vagy alkönyvtárból előkeresni egy html-t vagy php-t.
    Lehetne pl. Layereket is használni, azokkal még könnyebb lenne, de praktikus a hide DIV-is.

    Ezzel Péter Piros is meg lehetne elégedve :), hiszen akkor nem kellene egy egész oldalt bekérni

  7. misi89 says:

    Sziasztok.. én is ezt használom, de nekem internet explorerben állandóan hibát jelez. Tudna nekem valaki segígteni? Nem kódhiba, hanem kidob egy hibaüzenetet: “az Internet Explorer nem tudja megnyitni az internethelyet hxxp://www.touchofdeath1.com/index.php?id=band/loczi/. a művelet megszakadt.
    És van amikor megnyitja van amikor nem.. Kérlek segítsetek. Nagyon szépen köszönöm.

    U.I.: Először Switch Get I-et használtam. ott is ez az üzenet jött be.

  8. JuditBF says:

    Sziasztok!

    Kérdésem az, hogy az így készített linket — index.php?id=pstutorialok/tutorial01 — leköveti a google?? Ugyanis így készítettem el egy oldalt, és a gugli nem látja!! Már 1 éves az oldal, de az alapoldalig jut csak el!! — alapoldal.php?id=motorok/piaggio —
    Sajnos a piaggio.php ban lévő tartalmat (és az összes többi lapot) nem indexálja!! Kell valami mást is elkövetnem, hogy megtalálja a kereső, vagy a linkben szereplő ?id= dolog miatt ezt ne is várjam??

    Várom a választ! Köszönöm! J.BF.

  9. Harder says:

    URL-t tudsz adni ahol a lapot meg is lehet nézni?
    Nem tudok róla, hogy ez a módszer tiltva lenne a google-ban, hisz rengeteg cms használja ezt a fajta linkelést, soha nem hallottam róla hogy gondot jelenthetne. Inkább valami más lesz a gond szerintem.

  10. MacGyver says:

    Az oldalunk sokáig ment ezzel a módszerrel, és nem volt semmi gond a keresőkkel (napi 2000-es volt a csúcslátogatottságunk akkor).

  11. JuditBF says:

    Köszönöm a válaszokat, akkor valami más gond lehet! Keresem!

  12. SmiThY says:

    Sziasztok!
    Nekem igazából olyan kérdésem lenne hogy az utolsó inculde-ban hogy lehetne azt megcsinálni hogy gyökér mappába elhelyezkedő index.php állományt nyissa meg hibaüzenet nélkül.
    így nézz ki amire átírtam

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    $_GET['id'] = str_replace('../', '',$_GET['id'] );
    		if (isset($_GET['id']) and $_GET['id'] != '')
    		{
    		if (is_file("oldalak/". $_GET["id"] . ".php"))
    		{
    		include("oldalak/". $_GET["id"] . ".php");
    		}
    		else
    		{
    		include("oldalak/error.php");
    		}
    		}
    		else
    		{
    		include ("../index.php");
    		}

    és ezt az üzenetett kapom:

    1
    2
    
    Notice: Undefined index: id in C:wampwwwhonlapindex.php on line 43
    Unable to open WampServer's config file, please change path in index.php file

    köszi előre is a válaszokat.

  13. olomhuszar says:

    Csak tipp:
    Gondolom, hogy ez a kód maga a gyökér könyvtárban van, ott is az indexen belül.
    Persze a switch get ezen felhasználása másra is jó, de gondolom te a menüre akarod használni, akár a leírás.
    Szóval ha ez az indexben van, és te az indexed includolod be, akkor az körkörös hivatkozás.

  14. SmiThY says:

    Igen jól láttod menükre akarom használni és az index.php-ba van minden és hogyan lehet ki küszöbölni ezt a körkörös hivatkozást ? Talán az oldalak mappában létre kellene hozznom pl. egy kezdolap.php -t hogy az jelenjen meg alapból vagy még milyen más megoldások léteznek ?

  15. bogi says:

    Én ezt egyáltalán nem értem.
    Minden oldalnak készítenem kell 1 html, és 1 php oldalt is?
    Ha igen, akkor miért jó ez?
    Ha a php modulok/valami.php-ba illesztek 1 linket, akkor a tartalmi részbe hibát ír ki, és nem jeleníti meg.
    Úgy nem lehet megoldani, hogy az index.php-be hívjam meg az elemeket?
    Mint pl: fejléc, navi, side, tartalom, és lábléc?
    Így már nagyobb értelmét látnám a behívásoknak.

  16. Lackó says:

    Sziasztok!Ez a cikk nekem nagyon hasznos volt!Ugyanis egy CMS rendszert kezdtem el írni,és jó lesz hozzá!Köszönöm a cikket!

  17. Bogi says:

    Ez nagyon hasznos! Köszönöm! Kipróbáltam a .htaccess-t, és jól működik.
    Egy aggodalmam azért van, hogy kerülhetem el a goggle bácsi dühét, mivel így minden oldalam 2 címen is elérhető lesz.
    Pl:
    http://www.tutorial.hu/index.php?id=referencia
    http://www.tuorial.hu/referencia.html

  18. Harder says:

    Használd a canonical tag-t, itt olvashatsz róla bővebben: canonical – Google Webmestereszközök

    használata a HEAD-ben:

    1
    
    <link rel="canonical" href="http://www.tuorial.hu/referencia.html"/>
  19. Bogi says:

    Köszönöm!

  20. Bogi says:

    Megint elakadtam, de ez nem a a php switch get II. hibája.
    Van egy php kereső az oladalamon, ami nagyon jól működött, de az útvonak megváltozása miatt elakadtam. A kereső kódja:

    <?php
    // You may translate the string values here under to your native languages.

    $buttonvalue = "Keres";
    $search_at = "Keresési eredmény a (az) ";
    $search_result = "szóra";
    $pages = "Talált oldalak száma ";
    $to_small = "Legalább két karakter szükséges";
    $recursive = true; // Change to false if no searching should be done in subdirectories.

    //—————————- Do not change anything below this line ——————

    $html = <<<HTML

    Keresett kifejezés

    HTML;

    echo $html;

    function textpart($body, $search) {
    // Displays the text after the title
    $length = 30;
    $text = substr($body, max(stripos($body,$search) – $length, 0), strripos($body,$search) – stripos($body,$search) + strlen($search) + 2 * $length);
    if (strripos($text, ” “) $length) {
    $stop = substr($text, strripos($text, $search) + strlen($search), $length);
    $stop = substr($stop, 0, strripos($stop, ” “));
    }
    $text = “… “;
    while (stripos($temp,$search)) {
    $temp = substr_replace($temp, ““, stripos($temp, $search), 0);
    $temp = substr_replace($temp, “
    “, stripos($temp, $search) + strlen($search), 0);
    $text = $text . substr($temp, 0, stripos($temp, ““) + 4);
    $temp = substr($temp, stripos($temp, ““) + 4);
    if(stripos($temp, $search) > (2 * $length)) {
    $text = $text . substr($temp, 0, $length);
    $text = substr($text, 0, strripos($text, ” “)) . ” … “;
    $temp = substr($temp, stripos($temp, $search) – $length);
    $temp = substr($temp, stripos($temp, ” “));
    }
    }
    $text = $text . $stop . ” … “;
    echo $text;
    return;
    }

    function compress($string, $first, $last) {
    // Removes everything in $string from $first to $last including $first and $last
    while(stripos($string,$first) && stripos($string,$last)) {
    $string = substr_replace($string, “”, stripos($string,$first), stripos($string,$last) – stripos($string,$first) + strlen($last));
    }
    return $string;
    }

    function directoryToArray($directory, $recursive) {
    // This function by XoloX was downloaded from http://snippets.dzone.com/user/XoloX
    $array_items = array();
    if ($handle = opendir($directory)) {
    while (false !== ($file = readdir($handle))) {
    if ($file != “.” && $file != “..”) {
    if (is_dir($directory. “/” . $file)) {
    if($recursive) {
    $array_items = array_merge($array_items, directoryToArray($directory. “/” . $file, $recursive));
    }
    } else {
    $file = $directory . “/” . $file;
    $array_items[] = preg_replace(“/\/\//si”, “/”, $file);
    }
    }
    }
    closedir($handle);
    }
    return $array_items;
    }

    function filewalk($file, $search, $counter, $webpath) {
    // Selects and treats files with the extension .htm and .html and .asp and .php
    if (strtolower(substr($file, stripos($file, “.htm”))) == “.htm”
    || strtolower(substr($file, stripos($file, “.html”))) == “.html”
    || strtolower(substr($file, stripos($file, “.asp”))) == “.asp”
    || strtolower(substr($file, stripos($file, “.php”))) == “.php”) {
    $all = file_get_contents($file);
    $body = substr($all, stripos($all,”<body"),stripos($all,"”) – stripos($all,”<body"));
    $body = preg_replace('//i’, ‘ ‘, $body);
    $body = preg_replace(‘//i’, ‘ ‘, $body);
    $body = compress($body,”<noscript","”);
    $body = compress($body,”<script","”);
    $body = compress($body,”<iframe","”);
    $body = compress($body,”<noframe","”);
    $body = strip_tags($body);
    $body = html_entity_decode($body, ENT_QUOTES);
    $body = preg_replace(‘/\s+/’, ‘ ‘, $body);
    // Scans and displays the results
    if (stripos($body, $search)) {
    $title = substr($all, stripos($all,””) + 7,stripos($all,””) – stripos($all,””) – 7);
    $title = html_entity_decode($title, ENT_QUOTES);
    $title = preg_replace(‘/\s+/’, ‘ ‘, $title);
    echo ‘‘ . $title . ‘‘;
    echo ” . $webpath . substr($file, stripos($file, “/”)) . ”;
    echo textpart($body, $search) . ”;
    $counter = $counter + 1;
    }
    }
    return $counter;
    }

    // Reads the search text from the page’s URL
    $url = $_SERVER[‘HTTPS’] == ‘on’ ? ‘https://’ : ‘http://';
    $url .= $_SERVER[‘SERVER_PORT’] != ’80’ ? $_SERVER[“SERVER_NAME”].”:”.$_SERVER[“SERVER_PORT”].$_SERVER[“REQUEST_URI”] : $_SERVER[‘SERVER_NAME’] . $_SERVER[‘REQUEST_URI’];

    if (stripos($url,”?search=”)) $search = $_GET[‘search’];

    $webpath = dirname($url);

    // Starts searching
    if (strlen($search) < 2 && trim($search) “”) {
    echo ” . $to_small . ‘!';
    $search = “”;
    }

    if (trim($search) “”) {
    echo “” . $search_at . ” ‘” . $search . “‘ ” . $search_result . “.”;
    $counter = 0;
    // Path to the folder containing this file
    $curdir = getcwd();
    // Opens the folder and read its contents
    if ($dir = opendir($curdir)) {
    $files = directoryToArray(“./”, $recursive);
    foreach ($files as $file) {
    $counter = filewalk($file, $search, $counter, $webpath);
    }
    closedir($dir);
    }
    echo “” . $pages . “: ” . $counter . “”;
    }
    ?>

    A hiba gondolom itt van, de nem tudom hogyan írjam át:

    Bocs hogy ide írtam, de a fórum nem mükszik.

Szólj hozzá
a php switch get II. c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>