Динамически добавлять один и тот же файл CSS с разных страниц на разных глубинах каталогов - PullRequest
3 голосов
/ 29 апреля 2011

Хорошо, я пытался понять это некоторое время. У меня есть веб-сайт, над которым я работаю, и вот моя структура:

index.php
page-x/
    index.php
    page-x-y/
        index.php
include/
    functions.php
css/
    main.css

За исключением добавления на дополнительные подпапки и индексные страницы. В основном страницы на трех разных уровнях.

Все они должны иметь css / main.css, но путь к любой странице индекса будет другим.

Прямо сейчас я использую functions.php для добавления CSS, и уже должен вручную ввести относительный путь от страницы индекса к functions.php (то есть require_once("../include/functions.php"); или ../../include и т. Д.

Как я могу сделать так, чтобы functions.php мог определить относительный путь от любой индексной страницы, к которой он включен, к css / main.css?

т.е. как бы определить $relDir для следующего кода в functions.php:

echo '<link rel="stylesheet" type="text/css" href="' . $relDir . 'css/main.css" />';

Я мог бы каждый раз вручную передавать "" или "../" или "../../" в функцию, но можно ли этого избежать?


РЕДАКТИРОВАТЬ 3 Если я определю $BASE = dirname(__DIR__); в functions.php, я смогу найти корень сайта и перейти оттуда к абсолютному пути к CSS.

Однако, похоже, что css не связывается должным образом, на моей локальной машине результирующая ссылка выглядит следующим образом: (Я могу манипулировать косой чертой, чтобы она была согласованной, но это не помогает)

"C:\Documents and Settings\Lucas\site/css/main.css"

(Примечание: я использую псевдоним на easyPHP, чтобы я мог подключиться к этому адресу с http://127.0.0.1:8888/site/, но __DIR__ находит фактический каталог файла.

И на (Мои университеты) сервер, на котором я тестирую, возвращается

"/Volumes/Web/Students/MYNAME/Sites/MYSITE/css/main.css"

АКТУАЛЬНЫЙ URL сайта выглядит так:

http://www.SCHOOL.com/MYNAME/MYSITE/

CSS не будет ссылаться в любой ситуации


РЕДАКТИРОВАТЬ 2 Я могу определить $relDir как:

 str_repeat('../', substr_count($_SERVER['REQUEST_URI'], '/');

возвращает одно из следующих значений в зависимости от глубины индекса:

""
"../"
"../../"

Очевидно, что это большая обработка. Похоже, что лучшее, что можно сделать, это изучить правильные среды тестирования и использовать абсолютный путь. Я посмотрю на это. Я все еще немного новичок в этом.


РЕДАКТИРОВАТЬ 1: Хорошо, большинство людей предлагают, чтобы я придерживался только того, чтобы делать это вручную, первоначально у вызова функции было что-то вроде этого:

<?php require_once("../include/functions.php");
buildHead("Music", "../"); //($title, $relDir) ?>

Мне просто нужно изменить ../ на что угодно в обоих местах для каждой страницы.

Ответы [ 4 ]

4 голосов
/ 29 апреля 2011

Почему вы даже пытаетесь использовать относительный путь? Вы не можете просто связать это как /css/main.css? Тогда он всегда будет относиться к корню вашего сайта, а не к текущему каталогу.

3 голосов
/ 29 апреля 2011

Самый простой способ?Используйте абсолютные пути.Если ваш сайт просто находится на одном фиксированном пути, это легко.Если вы хотите оставить себе возможность изменять структуру своего сайта, добавьте параметр конфигурации, например.включите конфигурационный файл поверх каждого PHP-файла и определите там параметр $ BASE, который содержит абсолютный путь к базе вашего приложения, затем выполните:

echo '<link rel="stylesheet" type="text/css" href="'.$BASE.'/css/main.css" />'

Если $ BASE пуст, по умолчанию он будет равенкорень вашего веб-сервера.

Вы также можете выполнять всю эту обработку автоматически, используя магическую константу __DIR__ (или __FILE__, если вы используете PHP <5.3, но он не сильно меняется - вам просто нужно удалить файлимя из того, что вы получаете).Если вы включите этот файл конфигурации вверху каждого файла PHP (или используете директиву apache auto prepend), и ваш файл конфигурации находится в базовом каталоге вашего веб-сайта, этого будет достаточно: </p>

$BASE = __DIR__;

В противном случае, если он находится в каталоге, вам просто нужно подняться, но это известно при развертывании и не зависит от запроса.

0 голосов
/ 29 апреля 2011

вы должны получить базовый каталог вашего сайта, используя $_SERVER['DOCUMENT_ROOT']. Затем поместите это значение в сессию. Тогда вы можете использовать в базе index.php

$dir = $_SERVER['DOCUMENT_ROOT'];
$include = $dir. "/includes/functions.php";
$_SESSION['include_dir'] = $include;

Другие файлы, которые вы можете использовать

reqire($_SESSION['include_dir']);
0 голосов
/ 29 апреля 2011

хм .. Я бы порекомендовал связать CSS абсолютно ...

в противном случае вы могли бы

echo str_repeat('../', substr_count($_SERVER['REQUEST_URI'], '/');
...