условный источник заголовка на основе URL-адреса сервера - PullRequest
4 голосов
/ 02 апреля 2012

Проблема: Я хочу загрузить пользовательский заголовочный файл для каждого типа контента ($categoryId) в моей CMS. Например, если URL-адрес «/? Action = archive & categoryId = 1», я хочу, чтобы он включал мой файл «header_medicine.html».

Я определенно php noob, но я пытался уважать этот форум и решить мой вопрос, используя подсказки в этом посте об условном коде на основе URL , но страница архива все еще загружается с мое «другое» состояние.

Вот код:

<?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";
?>

Спасибо за рассмотрение моего вопроса!


Обновление: решение

Для всех, кто заинтересован, вот рабочее решение проблемы с кодом, которую я выложил выше (с упрощенным синтаксисом файловой системы). Я не использовал функцию isset, которую @Michael рекомендовал в своем коде ниже. Спасибо всем, кто предложил свои предложения, теперь я на шаг ближе к подсказке о php.

<?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";
    }
?>

Ответы [ 4 ]

1 голос
/ 02 апреля 2012

Вы можете получить доступ к параметрам в PHP через $_GET, $_POST и , другие . Так что $_GET['action'] выдаст архив типов действий, а $_GET['categoryId'] даст вам 1.

Так что вы можете сделать что-то вроде:

<?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

Ваш пример кода не будет работать, потому что $archive_url['path'] даст вам только путь /. Посмотрите на этот пример из руководства php:

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

<?php
  $url = 'http://username:password@hostname/path?arg=value#anchor';
  print_r(parse_url($url));
  echo parse_url($url, PHP_URL_PATH);
?>

Приведенный выше пример выведет:

Array
(
  [scheme] => http
  [host] => hostname
  [user] => username
  [pass] => password
  [path] => /path
  [query] => arg=value
  [fragment] => anchor
)
1 голос
/ 02 апреля 2012

Вы проделываете долгий путь вокруг чего-то, что на самом деле довольно просто в PHP. Вам нужно только проверить содержимое $_GET['categoryId'] через суперглобальный массив $_GET[] . parse_url() и его двоюродный брат parse_str() правильно проанализируют URL-адрес, и в вашем случае вы хотели бы посмотреть, какая часть была $archive_url['query'], но все это не нужно - необходимая информация находится в $_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');
  }
}

Теперь я нахожу подозрительным, что вы действительно хотите включить файлы типа /header_science.html. include() вызывает пути к файловой системе, поэтому, если корень документа не является также корневым путем к файлу сервера /, это, вероятно, неправильные пути включения.

Вместо этого вы можете искать что-то вроде

include($_SERVER['DOCUMENT_ROOT'] . '/header_science.html');
0 голосов
/ 02 апреля 2012

Можете ли вы получить путь включения динамически из вашей базы данных?Передача файлов через post / get небезопасна.

0 голосов
/ 02 апреля 2012

Используйте массив $ _GET (ИЛИ $ _REQUEST), он содержит все параметры, переданные в URL:

например:

page.php?aaa=1&bbb=hello

у вас есть:

 $_GET['aaa'] 

и

 $_GET['bbb']  

содержит их относительное значение

...