Включить HTML, сохраняя пути относительно включаемого файла - PullRequest
1 голос
/ 11 ноября 2010

Имейте несколько фрагментов HTML, которые я хочу включить в «родительский» файл.
Родительский файл содержит относительные пути.
Эти фрагменты также содержат относительные пути относительно их расположения - не относительно файла, который они будутбыть включенным в.
Например, один фрагмент - это заголовок, общий для всех страниц сайта.

<div style='background:url(img/bg.jpg)'>
  <img src='img/logo.png'>
</div>

Это будет вставлено в существующую страницу следующим образом:

  <div style='background:url(img/gradient.jpg)'>
    <?php include '../includes/header.txt'; ?>
  </div>

Пример: очень сильно упрощен , реальные файлы имеют много путей.
Я НЕ контролирую файлы, которые будут включены.
Это означает, что я не могу добавить переменные PHP в URL.

Я также не могу сделать пути абсолютными в любом случае.
Длявключенные файлы - потому что я не контролирую html.
Для всех файлов - потому что последние страницы создаются на нескольких машинах и должны работать либо на http://www.mysite/myfile, http://localhost/mysite/myfile,, либо дажеhttp://127.0.0.1/~/anyuser/...

Некоторые идеи, которые у меня были:

  1. php include : include '../includes/header.txt';
    • Пути выходят относительно файлаэто было включено в.
  2. Включение каждого фрагмента в виде iFrame:
    • Макет страницы не очень удобен для iFrame.Помимо SEO и проблем с загрузкой страницы.
  3. Анализ страницы и замена всех путей с помощью парсера.
    • Страницы не являются на 100% действительными HTML (без контроля над ними), и анализатор кашляет и переворачивается замертво.Помимо нелепой загрузки сервера.
  4. Использование базовых тегов
    • Прекрасно работает в любом реальном браузере.
      Но Internet Explorer 7, 8,и 9 просто игнорируют базовый тег (вне головы).Один базовый тег может быть объявлен в заголовке, но тогда все остальные пути на странице (и, вероятно, в файлах CSS) будут неверными.

BaseTag Использование:

<?php
  echo "<base href='$path_to_includes_folder' />";
  include '../includes/header.txt';
  echo "<base href='$path_based_on___file__' />";
?>

Как я понимаю, именно поэтому базовый тег был создан и поддерживается во всех приличных браузерах - так чтомы можем в середине одного HTML-файла сообщить браузеру, что я собираюсь включить второй HTML-файл, и все пути должны быть относительно нового местоположения.Это прекрасно работало в IE6, и я предполагаю, что, должно быть, была какая-то логика в отбрасывании его поддержки.Некоторая логика, которая ускользнула от Opera, Webkit и Mozilla.Единственные сообщения, которые я могу найти на эту тему, хвалят Microsoft за отказ от поддержки, не давая даже намека на причину, почему отказывается от поддержки для чего-то, что является принятым стандартом (используется во всехбраузеры того времени) и полезно - это хорошо.

Теперь я ненавижу разработку для IE со страстью, но не могу игнорировать это.У них все еще есть почти треть пользователей!

Итак, как включить фрагменты php с относительными путями и сохранить их относительно включаемого файла?

И кто-нибудь может сказать мне, если есть какая-то причина вообще поддержки MS отброшенной базыили что можно сделать, чтобы вернуть его?

1 Ответ

1 голос
/ 11 ноября 2010

Для этих ситуаций я использую следующее,

$PROTOCOL = (!empty($_SERVER['HTTPS'])) ? 'https' : 'http';
$DOC_ROOT = $PROTOCOL.'://'.$_SERVER['SERVER_NAME'];

//The project path points to the root file (index.php, or whatever your index file is).
$projectRoot = dirname($DOC_ROOT.$_SERVER['SCRIPT_NAME']).'/';

Тогда вы могли бы сделать (используя ваш пример)

<div style='background:url(<?php echo $projectRoot; ?>img/bg.jpg)'>
    <img src='img/logo.png'>
</div>

Это даст вам динамический абсолютный путь.

...