2012-04-02 9 views
4

Problem: Ich möchte eine benutzerdefinierte Header-Datei für jeden Inhaltstyp ($categoryId) auf meinem CMS laden. Wenn die URL beispielsweise "/? Action = archive & categoryId = 1" lautet, möchte ich sie in meine Datei "header_medicine.html" einschließen.bedingte Header-Quelle basierend auf Server-URL-Pfad

Ich bin definitiv ein php noob, aber ich habe versucht, dieses Forum zu respektieren und meine Frage mit den Tipps unter this post about conditional code based on url zu lösen, aber die Archivseite lädt immer noch von meinem 'else' Zustand.

Hier ist der Code:

<?php $archive_url = parse_url($_SERVER['REQUEST_URI']); 

if ($archive_url['path'] == "/?action=archive&categoryId=1") 
    include "header_medicine.html"; 

    elseif ($archive_url['path'] == "/?action=archive&categoryId=2") 
    include "header_science.html"; 

    elseif ($archive_url['path'] == "/?action=archive&categoryId=3") 
    include "header_other.html"; 

    else 
    include "header.html"; 
?> 

Dank für meine Frage unter Berücksichtigung!


Update: Lösung

Für jeden, der interessiert ist, hier ist die Arbeitslösung, um den Code Problem, das ich oben geschrieben (mit vereinfachten fileysystem Syntax). Ich habe nicht die Isset-Funktion verwendet, die @ Michael in seinem Code unten empfohlen hat. Danke an alle, die Vorschläge gemacht haben, ich bin jetzt einen Schritt näher dran, einen Hinweis auf PHP zu haben.

<?php switch ($_GET['categoryId']) { 
    case 1: 
    include "header_medicine.html"; 
    break; 
    case 2: 
    include "header_science.html"; 
    break; 
    case 3: 
    include "header_other.html"; 
    break; 
    default: 
    include "header.html"; 
    } 
?> 
+2

Lesen Sie über das GET super global. –

+0

Warum nicht einfach $ _GET Variable verwenden? – hjpotter92

+0

Es gibt auch eine Frage der categoryId ändern, sollten Sie wahrscheinlich eine textliche Darstellung anstelle einer Zahl haben, weil zum Beispiel, wenn Sie löschen 'categoryId = 1' Header Header_medicine.html wird nie angezeigt. Berücksichtigen Sie auch die Verwendung von 'dirname (__ FILE __)' auf Ihrem Code. – Panagiotis

Antwort

1

Sie nehmen den langen Weg um etwas, das eigentlich ganz einfach in PHP ist. Sie müssen nur den Inhalt von $_GET['categoryId'] über the $_GET[] superglobal array überprüfen. parse_url() und seine Cousine parse_str() wird parsen richtig analysieren eine URL, und in Ihrem Fall war der Teil, den Sie sehen wollten, war $archive_url['query'], aber das ist alles unnötig - die Informationen, die Sie benötigen, ist in $_GET.

if (isset($_GET['categoryId']) { 
// If this also depends on action=archive, use 
// if (isset($_GET['categoryId']) && isset($_GET['action']) && $_GET['action'] == 'archive') 
    switch($_GET['categoryId']) { 
    case 1: 
     include('/header_medicine.html'); 
     break; 
    case 2: 
     include('/header_science.html'); 
     break; 
    case 3: 
     include('/header_other.html'); 
     break; 
    default: 
     include('templates/include/header.html'); 
    } 
} 

Jetzt finde ich es verdächtig, dass Sie tatsächlich bedeuten Dateien wie /header_science.html aufzunehmen. include() ruft Dateisystempfade auf. Wenn Ihr Dokumentstamm also nicht der Serverdateistammpfad / ist, handelt es sich wahrscheinlich nicht um die richtigen Einschlusspfade.

Sie stattdessen für

die _GET Array $
include($_SERVER['DOCUMENT_ROOT'] . '/header_science.html'); 
+0

Vielen Dank @michael !! Ich habe es großartig mit Ihrem Vorschlag arbeiten. Danke für die Sorge um meine include() - Dateisystemaufrufe, aber ich habe die Syntax vereinfacht, um die Frage einfacher darzustellen. – Dave

-1

Verwendung wie etwas suchen können (OR _REQUEST $), enthält es alle in URL übergebenen Parameter:

ex:

page.php?aaa=1&bbb=hello 

Sie haben:

$_GET['aaa'] 

und

$_GET['bbb'] 

enthalten, dessen relativen Wert

1

Sie Parameter in PHP über $_GET zugreifen können, $_POST und others. So gibt $_GET['action'] den Aktionstyp Archiv und $_GET['categoryId'] wird Ihnen 1 geben.

So können Sie so etwas wie:

<?php 
    switch ($_GET['categoryId']) { 
    case "1": 
     include "/header_science.html"; 
     break; 
    case "2": 
     include "/header_other.html"; 
     break; 
    default: 
     include "templates/include/header.html"; 
    } 
?> 

http://php.net/manual/en/control-structures.switch.php

Ihr Beispiel-Code wird nicht funktionieren, weil $archive_url['path'] Sie geben nur den Pfad /. Werfen Sie einen Blick auf dieses Beispiel aus der PHP-Handbuch:

http://php.net/manual/en/function.parse-url.php

<?php 
    $url = 'http://username:[email protected]/path?arg=value#anchor'; 
    print_r(parse_url($url)); 
    echo parse_url($url, PHP_URL_PATH); 
?> 

Das obige Beispiel Ausgang:

Array 
(
    [scheme] => http 
    [host] => hostname 
    [user] => username 
    [pass] => password 
    [path] => /path 
    [query] => arg=value 
    [fragment] => anchor 
) 
+0

Gut, vielen Dank für die Erklärung der Parse-Funktion. Ich werde das definitiv verwenden, um ein Problem zu lösen, das nichts mit meinem CMS zu tun hat – Dave

0

können Sie den Pfad dynamisch aus der Datenbank enthalten bekommen? Es ist nicht sicher, Dateispeicherorte durch post/get zu übergeben.

Verwandte Themen