• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Navi mit include verändern und einbinden

Xeno

Mitglied
Liebe Community

Ich mache gerade erste Schritte mit PHP. Ich habe eine Homepage ( Michael Ritter ). Damit ich bei Anpassungen der Navigation dies nicht auf jeder Unterseite bzw. in jedem html-Dokument händisch machen muss, binde ich sie mit PHP wie folgt ein (mein Hoster hat PHP 5.2.17):

PHP:
<?php
include("header.php");
?>

Das klappt auch wunderbar und war ein Aufsteller für mich:-?.

Jetzt habe ich aber noch folgendes Problem: Bei einigen Unterseiten (de 6 Menü-Seiten) ist die Navigation nicht ganz identisch mit der Navi auf allen übrigen Seiten. Die Abwechung im HTML-Code besteht darin, dass ein Verweis (den auf die gerade geöffnete Seite nämlich) statt mit <a> </a> mit <span> </span> erfolgt; der Zweck ist, dass ich so den Menüpunkt der gerade aufgerufenen Seite anders formatieren kann, auch kann er so nicht mehr (erneut) angeklickt werden. Item!

Nun möchte ich, dass ich die inkludierte Navi bzw. deren Datei "header.php" auch auf diesen 6 Seiten mit der veränderten Navi verwenden kann. Das würde aber voraussetzen, dass ich die fragliche Datei "header.php" mit PHP verändern und dann das Ergebnis (die veränderte Datei also) inkludieren kann. Und das übersteigt noch meinen Horizont.

Ich habe im Moment Folgendes:

PHP:
<?php
$datei = "header.php";
$alt = 'a href="http://www.michaelritter.ch/vereine.php">Vereine &raquo;</a>';
$neu = '<span>Vereine &raquo;</span>';
file_put_contents($datei, str_replace($alt, $neu, file_get_contents("header-vereine.php")));

include("header-vereine.php");

?>

Das funktioniert nicht, weil es offenbar nicht möglich ist, in der von mir erwünschten Art eine neue Datei ("header-verein.php") zu schreiben. Es gibt dann folgende Fehlermeldungen:

Code:
[B]Warning[/B]:  file_get_contents(header-vereine.php) [[URL="http://www.michaelritter.ch/function.file-get-contents"]function.file-get-contents[/URL]]: failed to open stream: No such file or directory in [B]/kunden/364182_8001/web/2131036/A2131036/michaelritter.ch/vereine.php[/B] on line [B]19[/B]

[B]Warning[/B]:  include(header-vereine.php) [[URL="http://www.michaelritter.ch/function.include"]function.include[/URL]]: failed to open stream: No such file or directory in [B]/kunden/364182_8001/web/2131036/A2131036/michaelritter.ch/vereine.php[/B] on line [B]20[/B]

[B]Warning[/B]:  include() [[URL="http://www.michaelritter.ch/function.include"]function.include[/URL]]: Failed opening 'header-vereine.php' for inclusion (include_path='.:/usr/local/lib/php') in [B]/kunden/364182_8001/web/2131036/A2131036/michaelritter.ch/vereine.php[/B] on line [B]20[/B]


Die Lösung, einfach denselben Dateinamen ("header.php") zu nehmen, geht aber auch nicht, denn dann gibt es zwar keine Fehlermeldung, aber die Navi ist dann überall weg, weil "header.php" leer ist oder nicht mehr existiert (oder was auch immer!).

Ich nehme an, dass ich etwas ziemlich grundsätzlich falsch mache. Aus einem (anderen) Forum habe ich folgende Befehlskette kopiert (ich habe dort selbstverständlich aber keinen Fred eröffnet):

PHP:
file_put_contents($datei, str_replace($alt, $neu, file_get_contents($datei)));

Auf diese Weise kam ich auf obigen Code.

Herzlichen Dank für ggf. Hilfe!

Lg Xeno
 
Werbung:
Also mit file_put_contents() und file_get_contents kenne ich mich nicht aus, aber die erste Warnung zeigt, dass der Codeschinpsel, den Du hier gepostet hast, nichts mit der Warnung zu tun hat. Dort wird bemängelt, dass für file_get_contents die Datei vereine.php nicht gefunden wird, aber in Deinem snippet sehe ich kein vereine.php.

Aber ich habe einen gänzlich anderen Ansatz, für meine Navigation:
PHP:
        <?php
         if ($PHP_SELF != "index.php")
           echo "<li>";
        else
          echo "<li id='aktiv'>";
        ?>
            <a href="index.php">Startseite</a>
         </li>
Ich lasse den Link zwar immer klickbar, färbe ihn aber ein, wenn er aktiv ist.
 
So ließe sich die Navi dynamisch erstellen und der jeweils aktiven Seite eine CSS-Klasse im Link zuweisen.

PHP:
<?php
    $links = array('index', 'politik', 'vereine', 'links', 'intern', 'archiv');
    $page = reset(explode('.', end(explode('/', $_SERVER['REQUEST_URI']))));
?>




<ul>
    <?php
    foreach ($links as $link):
    $active = $page === $link ? 'aktiv' : ''; ?>
    
    <li>
        <a class="<?php echo $active; ?>" href="<?php echo $link; ?>.php">
        <?php echo ucfirst($link); ?></a>
     </li>
        
    <?php endforeach; ?>
</ul>
 
Zuletzt bearbeitet:
Werbung:
Lieber thuemmy, lieber Tronjer

Herzlichen Dank für die Antworten! Ich werde sie gerne analysieren und hierbei meine PHP-Kenntnisse erweitern!

Lg Xeno
 
Um die Analyse etwas zu vereinfachen:

Die Variable $page extrahiert aus einem URI-String á la "localhost/verzeichnis/home.php" das "home".

$active = $page === $link ? 'aktiv' : ' '; ist die Kurzform für:

PHP:
if($page === $link) {
    $active = 'aktiv';
} else {
    $active = ' ';
}
 
Werbung:
Also mit file_put_contents() und file_get_contents kenne ich mich nicht aus, aber die erste Warnung zeigt, dass der Codeschinpsel, den Du hier gepostet hast, nichts mit der Warnung zu tun hat. Dort wird bemängelt, dass für file_get_contents die Datei vereine.php nicht gefunden wird, aber in Deinem snippet sehe ich kein vereine.php.

Aber ich habe einen gänzlich anderen Ansatz, für meine Navigation:
PHP:
        <?php
         if ($PHP_SELF != "index.php")
           echo "<li>";
        else
          echo "<li id='aktiv'>";
        ?>
            <a href="index.php">Startseite</a>
         </li>
Ich lasse den Link zwar immer klickbar, färbe ihn aber ein, wenn er aktiv ist.

Hallo thuemmy

Ich habe Deine Lösung zu adaptieren versucht. Irgendetwas mache ich aber noch falsch oder habe ich grundsätzlich nicht begriffen. Die zu inkludierende Datei "header.php" lautet (zu Testzwecken habe ich sie jetzt mal nur für den Menüpunkt "Vereine" gemacht):

PHP:
<div id="header">

<ul id="navi">

  <li><a href="http://www.michaelritter.ch/index.htm">Hauptseite</a></li>

  <li><a href="http://www.michaelritter.ch/politik.htm">Politik &raquo;</a>

   <ul>

    <li><a href="http://www.michaelritter.ch/politik2.php">Biographie</a></li>

     <li><a href="http://www.michaelritter.ch/wahlen12.php">Wahlen 2012</a></li>

     <li><a href="http://www.michaelritter.ch/markthalle.php">Markthalle</a></li>

   </ul>

  </li>
  <?php
         if ($PHP_SELF != "vereine.php")
           echo "<li><a href=\"http://www.michaelritter.ch/vereine.php\">Vereine &raquo;</a>";
        else
          echo "<li><span>Vereine &raquo;</span>";
        ?>

   <ul>

    <li><a href="http://www.michaelritter.ch/radioemme.php">Radio&nbsp;Emme</a></li>

    <li><a href="http://www.michaelritter.ch/dampflokfest.php">Dampflokfest</a></li>

    <li><a href="http://www.michaelritter.ch/casinogesellschaft.php">Casino-Gesellschaft</a></li>

    <li><a href="http://www.michaelritter.ch/kadettentage.php">Kadettentage</a></li>

    <li><a href="http://www.michaelritter.ch/solatte.php">Solätte</a></li>

     <li><a href="http://www.michaelritter.ch/casinotheater.php">Casino&nbsp;Theater</a></li>

   </ul>

  </li>

    <li><a href="http://www.michaelritter.ch/links.htm">Links &raquo;</a>

          <ul>

              <li><a href="http://www.michaelritter.ch/gemeinden.php">Gemeinden&nbsp;<br>usw.</a></li>

            <li><a href="http://www.michaelritter.ch/parteien.php">Parteien</a></li>

        </ul>

   </li>

  <li><a href="http://www.michaelritter.ch/intern.htm">Intern &raquo;</a>

       <ul>

              <li><a href="http://www.michaelritter.ch/kontakt.php">Kontakt</a></li>

              <li><a href="http://www.michaelritter.ch/changelog.php">Changelog</a></li>

              <li><a href="http://www.michaelritter.ch/impressum.php">Impressum</a></li>

          </ul>

      </li>

      <li><a href="http://www.michaelritter.ch/archiv.htm">Archiv &raquo;</a>

          <ul>

            <li><a href="http://www.michaelritter.ch/markthalle-argumente-archiv.php">Markthalle Argumente</a>"</li>          

          </ul>

      </li>

</ul>

</div>

Wenn man jetzt Michael Ritter aufruft, passiert leider nicht dasselbe (und Gewünschte), wie bei Michael Ritter , d. h. weder ist der Menüpubkt eingefärbt noch ist er nicht anklickbar.

Unterstützung ist natürlich weiterhin willkommen!

Lg Xeno

@Tronjer: Ich habe mich jetzt mal auf eine Lösungsvariante konzentrieren. Dein Vorschlag ist möglicherweise noch professioneller, aber wohl auch anspruchsvoller. Nicht sauer werden!
 
Guten Morgen Xeno,

ich habe in meinem letzten Posting doch noch etwas vergessen, sorry. Natürlich muss ja die Variable $PHP_SELF gefüllt werden, Du musst zu Beginn der header.php noch folgendes einfügen:
PHP:
$PHP_SELF = $_SERVER['SCRIPT_NAME'];
Damit wird der Variablen $PHP_SELF der Name der aktuellen Seite zu, in dem Fall 'vereine.php'

Gruß thuemmy
 
Werbung:
Guten Morgen Xeno,

ich habe in meinem letzten Posting doch noch etwas vergessen, sorry. Natürlich muss ja die Variable $PHP_SELF gefüllt werden, Du musst zu Beginn der header.php noch folgendes einfügen:
PHP:
$PHP_SELF = $_SERVER['SCRIPT_NAME'];
Damit wird der Variablen $PHP_SELF der Name der aktuellen Seite zu, in dem Fall 'vereine.php'

Gruß thuemmy

Danke für den Hinweis! Hätte ich mit mehr Erfahrung natürlich selber merken müssen.

Leider funktioniert es immer noch nicht. Vielleicht noch ein ärgerlicher Syntaxfehler, oder so was? Hier nochmals der aktuelle Code der inkludierten Datei:

PHP:
<div id="header">

<ul id="navi">

  <li><a href="http://www.michaelritter.ch/index.htm">Hauptseite</a></li>

  <li><a href="http://www.michaelritter.ch/politik.htm">Politik &raquo;</a>

   <ul>

    <li><a href="http://www.michaelritter.ch/politik2.php">Biographie</a></li>

     <li><a href="http://www.michaelritter.ch/wahlen12.php">Wahlen 2012</a></li>

     <li><a href="http://www.michaelritter.ch/markthalle.php">Markthalle</a></li>

   </ul>

  </li>
<?php
  $PHP_SELF = $_SERVER['SCRIPT_NAME']; 
     if ($PHP_SELF != "vereine.php")
          echo "<li><a href=\"http://www.michaelritter.ch/vereine.php\">Vereine &raquo;</a>";
     else
          echo "<li><span>Vereine &raquo;</span>";
?>

   <ul>

    <li><a href="http://www.michaelritter.ch/radioemme.php">Radio&nbsp;Emme</a></li>

    <li><a href="http://www.michaelritter.ch/dampflokfest.php">Dampflokfest</a></li>

    <li><a href="http://www.michaelritter.ch/casinogesellschaft.php">Casino-Gesellschaft</a></li>

    <li><a href="http://www.michaelritter.ch/kadettentage.php">Kadettentage</a></li>

    <li><a href="http://www.michaelritter.ch/solatte.php">Solätte</a></li>

     <li><a href="http://www.michaelritter.ch/casinotheater.php">Casino&nbsp;Theater</a></li>

   </ul>

  </li>

    <li><a href="http://www.michaelritter.ch/links.htm">Links &raquo;</a>

          <ul>

              <li><a href="http://www.michaelritter.ch/gemeinden.php">Gemeinden&nbsp;<br>usw.</a></li>

            <li><a href="http://www.michaelritter.ch/parteien.php">Parteien</a></li>

        </ul>

   </li>

  <li><a href="http://www.michaelritter.ch/intern.htm">Intern &raquo;</a>

       <ul>

              <li><a href="http://www.michaelritter.ch/kontakt.php">Kontakt</a></li>

              <li><a href="http://www.michaelritter.ch/changelog.php">Changelog</a></li>

              <li><a href="http://www.michaelritter.ch/impressum.php">Impressum</a></li>

          </ul>

      </li>

      <li><a href="http://www.michaelritter.ch/archiv.htm">Archiv &raquo;</a>

          <ul>

            <li><a href="http://www.michaelritter.ch/markthalle-argumente-archiv.php">Markthalle Argumente</a>"</li>          

          </ul>

      </li>

</ul>

</div>

So oder so schon mal herzlichen Dank.

Lg Xeno
 
Ich bin jetzt nur sehr grob drüber geflogen, aber willst du wirklich die Inhalte von geparsten .php Dateien neu schreiben?
 
Habs mir jetzt auch nicht durchgelesen, ob sinnvoll oder nicht - ich denke das hilft dir weiter:

PHP:
$PHP_SELF = basename($_SERVER['SCRIPT_NAME']);
 
Werbung:
Habs mir jetzt auch nicht durchgelesen, ob sinnvoll oder nicht - ich denke das hilft dir weiter:

PHP:
$PHP_SELF = basename($_SERVER['SCRIPT_NAME']);

Genau, das wars. Herzlichen Dank!!

Zum Thema Sinnhaftigkeit der Lösung muss ich mich später noch äussern bzw. vorher Gedanken machen!

Lg Xeno
 
Bei dieser Schreibweise
$PHP_SELF = $_SERVER['SCRIPT_NAME'];
if ($PHP_SELF != "vereine.php")
zucke ich etwas zusammen. Es hat schon seinen Grund, warum bei PHP globale Variablen in Großbuchstaben geschrieben werden. Eigene Variablen sollte man deshalb so nicht schreiben.
 
Werbung:
Mag ja sein, aber es hindert ihn doch niemand daran, das zu verbessern ;)
 
Es geht ihm doch nicht darum, den aktiven Link hervorzuheben, sondern die aktive Seite automatisch zu ermitteln. Und das geht mit CSS nicht.

In deinem Beispiel muss man ja jedem Body-Tag zuweisen, auf welcher Seite er sich befindet. #home, #kontakt, ...

Bei einer PHP-Navigation wird dies automatisch durch den Dateinamen erkannt und die minimale Erhöhung der Ladezeiten merkt niemand.

Klar, so wie das jetzt gelöst ist, hat das keine Zukunft. Würde die ganze Navigation aber aus einer Datenbank oder einem Array generiert werden hat man dadurch enorme Vorteile was das umbenennen, verschieben, hinzufügen, entfernen von Navigations- und Sub-Navigationspunkten (und noch weiter in die Tiefe) angeht.

Außerdem kann man so seine Seite in weiteren Belangen erweitern (Keywords, Description, Seitentitel, Template, Design, ... ). Je nachdem wie sich die Seite eben weiterentwickelt.

Somit hat man nämlichen immer das "Wissen" (also das PHP-Skript weiß es) auf welcher Seite man sich befindet und welche Inhalte geladen werden müssen.
 
Werbung:
Ich finde die von djehke gepostete Lösung gar nicht schlecht. Zumindest mir war bisher noch nicht bekannt, dass sich so etwas auch mit CSS realisieren lässt.
 
Es geht ihm doch nicht darum, den aktiven Link hervorzuheben, sondern die aktive Seite automatisch zu ermitteln. Und das geht mit CSS nicht.

In deinem Beispiel muss man ja jedem Body-Tag zuweisen, auf welcher Seite er sich befindet. #home, #kontakt, ...

Bei einer PHP-Navigation wird dies automatisch durch den Dateinamen erkannt und die minimale Erhöhung der Ladezeiten merkt niemand. ....

.

Ja, stimmt, aber soviel Hauptnavipunkt werden wohl nichtmehr dazu kommen. Wenn Xeno in seine Navilist alle Einträge behndeln will. Ist die ihm vorgeschlagende Variante aber sehr aufwändig. Oder?
Da könnte mein Php-Vorschlag titel vielleicht einfacher sein, Aber nicht besser,

Ich habe nochmal Xenos's Anliegen gelesen und er wollte doch eine Möglichkeit seine aktuelle Seite hervorzuheben.
 
Zuletzt bearbeitet:
Zurück
Oben