1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[PHP] .class - Änderung aufgrund einer "ausgelesenen" Info möglich?

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von Nathea, 23.04.06.

  1. Nathea

    Nathea Admin
    AT Administration

    Dabei seit:
    29.08.04
    Beiträge:
    13.550
    Hallo allerseits,

    ich beginne allmählich, die Vorzüge von PHP für meine Webseiten zu entdecken. Das Auslagern von Inhalten, die auf den Seiten unverändert immer wieder auftreten, via <include> klappt problemlos und hat mich "Blut lecken lassen" ;)

    Nun mein nächster Schritt:

    Bislang steht der "komplette Text" meiner Seitennavigation in einem <div id="nav"> auf allen Webseiten. Per CSS gebe ich den <a>, die dort eingebunden sind, ein bestimmtes optisches Bild (Hintergrund, Textfarbe, border u.s.w.). Um dem Besucher besser darzustellen, auf welcher Seite er sich gerade befindet, habe ich eine class .active definiert (farblich entsprechend "anders") und setze bisher "manuell" für die gerade "aktive" Seite <a class="active" href>.

    Kann man das mit PHP automatisieren? Also auslesen, auf welcher Seite sich die Besucher gerade befindet und die Entsprechung in der Navi-Leiste auf "active" setzen? Oder denke ich einfach viel zu kompliziert?

    Bitte gebt mir mal einen Tip, auf welchem Wege so etwas funktionieren kann, damit ich den dicken Wälzer auf meinem Schreibtisch nicht weiter ziellos durchblättern muss :)

    Lieben Gruß,
    Nathea
     
  2. Sir Q

    Sir Q Rheinischer Winterrambour

    Dabei seit:
    12.04.05
    Beiträge:
    921
    Das ist kein Problem - nur - wie rufst du die seiten auf?

    „Anfänger“ machen das in der Regel so:

    <a href="index.php?nav=1">punkt 1</a><br/>
    <a href="index.php?nav=2">punkt 2</a><br/>
    <a href="index.php?nav=3">punkt 3</a><br/>
    <a href="index.php?nav=4">punkt 4</a><br/>


    und kommen dann auf das Konstrukt:

    <a href="index.php?nav=1" <?PHP if($nav==1) echo ' class="active" '; ?>>punkt 1</a><br/>
    <a href="index.php?nav=2" <?PHP if($nav==2) echo ' class="active" '; ?>>punkt 2</a><br/>
    <a href="index.php?nav=3" <?PHP if($nav==3) echo ' class="active" '; ?>>punkt 3</a><br/>
    <a href="index.php?nav=4" <?PHP if($nav==4) echo ' class="active" '; ?>>punkt 4</a><br/>


    Dann fängt man an redundanten Code zu eleminieren - die Idee sind dabei Arrays für das Menü

    $menuArray = array();
    $menuArray[1] = "punkt 1";
    $menuArray[2] = "punkt 2";
    $menuArray[3] = "punkt 3";
    $menuArray[4] = "punkt 4";

    foreach($menuArray as $key => $value)
    {
    $sel = "";

    if($key == $menu)
    $sel = ' class="active" ';

    echo '<a href="index.php?menu='.$key.'" '.$sel.'>'.$value.'</a><br/>';
    }


    Die Variable $menu welche als Parameter übergeben wird, muß nicht numerisch sein - macht aber das ganze recht übersichtlich.

    Die Schleife lässt sich natürlich nicht nur mit einem manuellen Array füttern, sondern auch mit Daten aus einer Datenbank.

    Die Parametrisierten Seitenaufrufe sind aber nicht wirklich schön - also kommt mann irgendwann auf Vodoo - resp - mod_rewrite. Eine .htaccess-Datei mit dem Inhalt:

    RewriteEngine on
    RewriteBase /

    RewriteCond %{REQUEST_URI} (.*)_(.*).htm
    RewriteRule (.*)_(.*).htm index.php?menu=$1 [L,NC]


    Die Ausgabe in der Schleife wird dann entsprechend umgestaltet:

    echo '<a href="'.$key.'_'.urlencode($value.).'.htm" '.$sel.'>'.$value.'</a><br/>';

    Dadurch werden URLs produziert, die etwa so aussehen <a href="1_punkt+1.htm">Punkt 1</a><br/> - was natürlich viel netter ist, als index.php?menu=1 - zumal auch Suchmaschinen lieber „scheinbar“ statische HTML-Seite indizieren als „offensichtlich“ dynamische ...

    Die Variable $menu kann dann ganz einfach dazu verwendet werden - beliebige einzelseite einzubinden. Etwa in der Art:

    if($menu && file_exists("seite$menu.php"))
    require("seite$menu.php");
    else
    require("seite0.php");
     
    #2 Sir Q, 23.04.06
    Zuletzt bearbeitet: 23.04.06
    Nathea gefällt das.
  3. kauan

    kauan Stina Lohmann

    Dabei seit:
    31.12.05
    Beiträge:
    1.043
    Ich mach's etwa so:

    Code:
    $nav = $_GET['nav'];
    
    $links = array(
        1 => 'punkt 1',
        2 => 'punkt 2',
        3 => 'punkt 3',
        4 => 'punkt 4'
    );
    
    foreach(array_keys($links) as $navID) {
        $link = 'index.php?nav='.$navID;
        $linkText = $links[$navID];
        $class = ($nav == $navID) ? 'active' : '';
        echo '<a href="'.$link.'" class="'.$class.'">'.$linkText.'</a>'."\n";
    }
     
  4. Nathea

    Nathea Admin
    AT Administration

    Dabei seit:
    29.08.04
    Beiträge:
    13.550
    Von solchen "Konstrukten" bin ich noch weit entfernt, ich beginne erst allmählich die Zusammenhänge zu verstehen.

    Mein Code sieht augenblicklich etwa so aus:

    Code:
    <a class="active" href="seite1.php">Seite1</a><br/>
    <a class="block" href="seite2.php">Seite2</a><br/>
    <a class="block" href="seite3.php">Seite3</a><br/>
    Also eher "schlicht" und - schätzungsweise - für erfahrene PHP-Coder eher "daneben" o_O
    An if - else - Schleifen habe ich mich noch nicht herangetraut.

    Gruß,
    Nathea

    edit:
    Ich bin noch auf dem Status "jede Seite hat ihre eigene Navi-Leiste" ... daher, wie oben gesagt, verpasste ich bisher dem "aktiven" Link der aktiven Seite manuell die class "active". Genau davon will ich jetzt weg ...
     
  5. kauan

    kauan Stina Lohmann

    Dabei seit:
    31.12.05
    Beiträge:
    1.043
    Okay :)
    Also musst du ja den aktuellen Dateinamen (also den in der Adresszeile) auslesen. Das kannst du wie folgt machen:
    Code:
    $file = $_SERVER['PHP_SELF'];
    Nun hast du den absoluten Pfadnamen der Seite. Wenn die Seite z.B. http://www.deinedoman.de/seite1.php heisst, hat $file nun den Wert /seite1.php

    Nun machst du bei der Ausgabe die Ueberpruefung, ob der aktuelle Link zu der Seite zeigt, die du verlinkst:
    Erst die CSS Klasse in einer Variable speichern:
    Code:
    $link = '/seite1.php';
    $linkText = 'Seite 1';
    if($file == $link) {
        $class = 'active';
    } else {
        $class = 'block';
    }
    Und dann den Link ausgeben:
    Code:
    echo '<a href="'.$link.'" class="'.$class.'">'.$linkText.'</a>';
    Gruss
    Jonathan
     
    Nathea gefällt das.
  6. duderino

    duderino Goldparmäne

    Dabei seit:
    26.01.06
    Beiträge:
    556
    Immer wieder ein Link den ich weitergeben:

    http://tut.php-q.net

    durchlesen, verstehen, php programmieren ;)
     
    Nathea gefällt das.
  7. Nathea

    Nathea Admin
    AT Administration

    Dabei seit:
    29.08.04
    Beiträge:
    13.550
    Danke euch allen, ich werde mich nach und nach durch die Tips wühlen.

    Besonders Deine Hilfestellung, kauan, erscheint mir bekömmlich und klein genug, dass ich mich nicht sofort daran "verschlucke". Das werde ich als erstes ausprobieren.

    Das Quake-Net Tutorial nehme ich mir parallel dazu ebenfalls vor, mal sehen wie das aufgebaut ist.

    Bislang fehlt mir - bei den angebotenen Code-Schnipseln - immer der Bezug dazu, an welcher Stelle bzw. in welcher Datei ich welche Infos unterzubringen habe. Gleich am Beginn der "web-Seiten-Datei"? Eingebunden im body? Ausgelagert als separate, zu includierende Datei? Da lerne ich augenblicklich am leichtesten, wenn ich Beispiele vor Augen habe, die ich dann nachbaue und verändere und wo mir auf diese Weise die Funktion deutlich wird.
    Aber ich krieg das schon hin :-D

    Nochmal: Danke für die rasche Unterstützung!
    Lieben Gruß,
    Nathea
     
  8. pepepy

    pepepy Riesenboiken

    Dabei seit:
    20.06.06
    Beiträge:
    284
    Von PHP verstehe ich nichts, aber mit dem Code kann ich schon mal etwas anfangen.
    Wie kann ich das aber in mein Menü übersetzen? Da bin ich wieder überfordert.

    Code:
    <ul id="menu">
          <li id="home" class="active">
         <a href="/index.html">
         <span>home</span>
         </a>
         <li id="punkt2">
         <a href="/seite2.php">
         </a>
         </li>
         <li id="punkt3">
         <a href="/seite3.php">
         </a>
         </li>
         <li id="punkt4">
         <a href="/seite4.php">
         </a>
         </li>
        </ul>
    CSS:
    Code:
    ul#menu {
    	height: 146px;
    	width: 684px;
    	text-align: right;
    	display: block;
    	position: absolute;
    	top: 0;
    	right: 0;
    	padding: 0;
    	margin: 0;
    }	
    
    ul#menu li, ul#menu li a {
    	float: left;
    	list-style: none;
    	padding: 0;
    	margin: 0;
    	width: 114px;
    	height: 146px;
    	text-align: right;
    }
    ul#menu li a span {
    	visibility: hidden;
    }
    
    ul#menu li#home a {
    	background: url(/inc/img/menu/menu_01.jpg) no-repeat;
    }
    	
    ul#menu li#home a:hover,
    ul#menu li#home.active a {
    	background: url(/inc/img/menu/menu-over_01.jpg);
    }
    Viele Grüße
    pepepy

    EDIT: Kann der von mir genannte PHP-Code fehlerhaft sein? Sobald ich ihn
    einfüge, bekomme ich eine Fehlermeldung.
     
    #8 pepepy, 05.08.10
    Zuletzt bearbeitet: 06.08.10

Diese Seite empfehlen