• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

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

Nathea

Admin
AT Administration
Registriert
29.08.04
Beiträge
15.098
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
 

Sir Q

Rheinischer Winterrambour
Registriert
12.04.05
Beiträge
923
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");
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Nathea

kauan

Stina Lohmann
Registriert
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";
}
 

Nathea

Admin
AT Administration
Registriert
29.08.04
Beiträge
15.098
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 ...
 

kauan

Stina Lohmann
Registriert
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
 
  • Like
Reaktionen: Nathea

Nathea

Admin
AT Administration
Registriert
29.08.04
Beiträge
15.098
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
 

pepepy

Becks Apfel (Emstaler Champagner)
Registriert
20.06.06
Beiträge
332
Das ist kein Problem - nur - wie rufst du die seiten auf?


$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/>';
}

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.
 
Zuletzt bearbeitet: