ugrás a tartalomhoz

Menu megjelenitese php fajlban

zoliky · 2007. Feb. 24. (Szo), 11.28
Van egy weblapom amelyen talalhato egy menu. A menu XHTML kodja a kovetkezo keppen nez ki:

<div id="menu">
	<ul>
		<li><a href="index.php" id="selected">Home</a></li>
		<li><a href="portofolio.php">Portofolio</a></li>
		<li><a href="sitemap.php">Site map</a></li>
		<li><a href="contactus.php">Contact us</a></li>
	</ul>
</div>
Ez a kod 4 fajlban szerepel (index.php, portofolio.php, sitemap.php, contactus.php).

Mi tortenik ha peldaul ki akarom szedni a "sitemap.php" oldalat a menubol? A problema az, hogy mind a negy XHTML fajlot ujra kell szerkeszteni. Ez borzaszto lesz idovel ha mindig valtozik a menu.

Gondoltam, hogy meg lehet oldani a problemat PHP hasznalataval, irok egy fugvenyt amelyet beolvasok minden HTML fajlban es meghivom.

A kodom a kovetkezo lenne:

<?php
function display_menu()
{
    $items = array(
        'index.php'     => 'Home',
        'portfolio.php' => 'Portfolio',
        'sitemap.php'   => 'Site map',
        'contect.php'   => 'Contact'
    );
    
    $request = basename($_SERVER['REQUEST_URI']);
    
    echo "<ul>\n";
    
    foreach ($items AS $filename => $item)
    {
        echo "\t" . '<li><a href="'. $filename .'"'. ($request == $filename ? ' id="selected"' : null) .'>'. $item .'</a></li>'. "\n";
    }
    
    echo "</ul>\n";
}  
?>
Mukodik elvileg de van egy kis gond. A basename($_SERVER['REQUEST_URI']); megkapja az oldal nevet. Ha peldaul igy nyitom ki az oldalt :

http://mywebpage.com/

Az apache szerver tudja, hogy letezik egy index.php fajl a konyvtarban de a basename($_SERVER['REQUEST_URI']) fugveny ezt nem tudja.

Van valami otlet, hogy lehet megoldani ?

Koszonom !
 
1

Request_URI

janoszen · 2007. Feb. 24. (Szo), 11.50
Én nem így oldanám meg. Szerintem, mod_rewrite-al irányíts át mindent egy index.php fájlra, amelyikben egy tömbben meg van határozva, hogy milyen URLekre milyen tartalmakat kell kiszolgálni.

És ne fejeltsd el leválasztnai a ? mögötti részt, mert csúnyán járhatsz GET formoknál és egyebeknél.

Na és ezek után ezeket az URL mintákat venném bele a menübe...
2

koszonom

zoliky · 2007. Feb. 24. (Szo), 12.11
Vegul sikerult megoldani a kovetkezovel:
$request = basename($_SERVER['PHP_SELF']);


Oszinten erdekelnenek masoktol is velemyek es modszerek, hogyan oldjatok meg. Gondolom gyakran talalkoztok ezel a menus helyzetel.

A mod_rewrite-t sajnos nem ismerem de utana nezek!
Koszonom!
3

Drupal minta

janoszen · 2007. Feb. 24. (Szo), 13.04
Hát, mondjuk egy megoldás erre az lenne, ha nem akarsz túlzottan komplex keretrendszert építeni viszont van adatbázisod, hogy a .htaccess fájlba ezt teszed bele: (Drupalból nyúlva.)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]


Ezek után a PHP-ben csinálsz egy olyat, hogy:

<?php
 // Ha az index.php hívódik fel
 if (!array_key_exists("q", $_GET))
 {
  $_GET["q"] = "/";
 }
?>
A következő lekérésekhez meg tartozhat ez a tábla:

CREATE TABLE oldalak
(
 id INT PRIMARY KEY AUTO_INCREMENT 'Az oldal azonosítója/rendezési száma',
 url VARCHAR(255) NOT NULL COMMENT 'Az oldal URLje',
 cim VARCHAR(255) NOT NULL COMMENT 'Az oldal címe/menüben levő szövege',
 modul VARCHAR(255) NOT NULL COMMENT 'A PHP fájl, amit be kell hívni',

 UNIQUE (url)
);
Na, ha ez megvan, értelemszerűen beletolod az oldalaid listáját az adatbázisba. Az oldal lekérésénél pedig ezt csinálod (MySQL-t feltételezve):

<?php
 $q = explode("?", $_GET["q"]);
 $q = $q[0];
 $r = mysql_query("SELECT modul FROM oldalak WHERE url=\"" . mysql_real_escape_string($q) . "\"");
 if (mysql_num_rows($r) == 0)
 {
  //404 oldal nem található hiba kezelése
  require_once(dirname(__FILE__) . "/modulok/e404.php");
 } else {
  $modul = mysql_fetch_row($r);
  $modul = $modul[0];
  require_once(dirname(__FILE__) . "/modulok/" . $modul . ".php");
 }
?>
És a menü építése pedig így nézne ki:

<ul>
<?php
 $r = mysql_query("SELECT url, cim FROM oldalak ORDER BY id");

 $q = explode("?", $_GET["q"]);
 $q = $q[0];

 while ($a = mysql_fetch_array($r))
 {
  echo("<li");
  if ($q = $a['url'])
  {
   echo(" class=\"selected\"");
  }
  echo("><a href=\"" . $a['url'] . "\">" . $a['cim'] . "</a></li>");
 }
?>
</ul>
Persze, ez egy nagyon durva váz, ötlet, de egyszintű menürendszer esetén használható. Lehet még tovább finomítani, de azért lett ennyire csontváz, hogy érteni lehessen. Értelemszerűen tömbökkel, SQL nélkül is meg lehet valósítani, csak akkor neked kell kézzel rendezni és keresni a dolgokat.

Mulatást.
4

array_key_exists

Hodicska Gergely · 2007. Feb. 24. (Szo), 15.56
Tipikusan fölösleges használata az array_key_exists függvénynek, isset simán elég lenne.


Üdv,
Felhő
6

Pont ezért lettem letolva...

janoszen · 2007. Feb. 25. (V), 11.09
Egy pár hónappal ezelőtt pont azt mondta valaki, hogy azt nem kéne használni, hanem az array_key_exists-et. Most akkor mi az igazság?
7

array_key_exists vs. isset

Hodicska Gergely · 2007. Feb. 25. (V), 14.34
Egy pár hónappal ezelőtt pont azt mondta valaki, hogy azt nem kéne használni, hanem az array_key_exists-et.
Ne hagyd magad! ;) Tudd a kettő közti különbséget, és szituációnak megfelelően használd.

Most akkor mi az igazság?
Az array_key_exists egy NULL értékű tömb elem esetén is igazat ad vissza, míg az isset nem. Egy GET változó értéke nem lehet NULL (csak max. üres string, vagy maga kulcs sem létezik), ezért elég az isset, ami minimálisan ugyen, de gyorsabb is.


Üdv,
Felhő
5

include is elég!

Csiszár Attila · 2007. Feb. 24. (Szo), 17.44
Nem az a legegyszerűbb, ha kiveszed a menüd egy külön fajlba, és mindig becsatolod, include-al? Akkor mindig csak a menüt tartalmazó fájlt kell szerkesztened, ha valami valtozik.
8

Include

Carter · 2007. Feb. 26. (H), 12.10
Én pontosan ugyanígy szoktam. Így csak a beincludolt fájt kell változtatni, ha ugrik a menü. [hülyemegrendelő]