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

Tartalomjegyzék

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)

20 HOZZÁSZÓLÁS

  1. 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. É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ó…

  3. 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).

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

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

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

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

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

  9. 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).

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

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

  12. 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 ?

  13. É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.

  14. 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!

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

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét