Сделай сам универсальный заголовок / footer.php - PullRequest
1 голос
/ 09 февраля 2012

Я хочу сделать универсальные файлы заголовка / колонтитула.
Универсальный здесь означает быть применимым в файлах на любом уровне каталога без необходимости добавлять «../» на любом более глубоком уровне при вызове «header.php» из каталога «include».

Хорошо.
Я могу использовать
<?php include $_SERVER[‘DOCUMENT_ROOT’].”/includes/header.php”;?>

чтобы иметь его где угодно, но header.php содержит относительную ссылку на файл .css, а файл .css содержит его относительные ссылки (например, «background: url (../ images / o.gif);» и все, что приводит меня в трясину «../../» на каждом новом уровне.

Конечно, я мог бы копировать .css и ../images на каждом уровне, но это кажется немного неловким и противоречащим самому принципу и духу великого php (контролировать все в одном месте).

С уважением, Ваш` sehrguey ogoltsoff

Ответы [ 3 ]

3 голосов
/ 09 февраля 2012

Вы можете иметь url в CSS как абсолютный путь (который начинается с /).Тогда он будет работать независимо от того, где на вашем сайте просматривался пользователь.

В качестве альтернативы, вы можете использовать перезапись URL-адреса mod_rewrite, чтобы сделать URL-адрес, который посещает пользователь, на верхнем уровне.

1 голос
/ 09 февраля 2012

Вы хотите инкапсулировать то, что меняется, то есть относительный путь к некоторому местоположению запроса (просматриваемый из браузера) к корневому URL вашего сайта (снова просматриваемый из браузера).

Для этого вам прежде всего необходимо знать корневой URL и URL запроса, в PHP это может выглядеть примерно так:

$rootURL = 'http://example.com/mysite/basedir/';
$requestURI = $_SERVER['REQUEST_URI']; # e.g. /mysite/basedir/subdir/index.php

Затем PHP предлагает разнообразные строковые функции, чтобы превратить это в относительный путь:

'../' + X

Например, вы можете поместить это в класс, который делает это:

$relative = new RelativeRoot($rootURL, $requestURI);

echo $relative; # ../
echo $relative->getRelative('style/default.css'); # ../style/default.css

Примером такого класса будет:

/**
 * Relative Path to Root based on root URL and request URI
 * 
 * @author hakre
 */
class RelativeRoot
{
    /**
     * @var string
     */
    private $relative;

    /**
     * @param string $rootURL
     * @param string $requestURI
     */
    public function __construct($rootURL, $requestURI)
    {
        $this->relative = $this->calculateRelative($rootURL, $requestURI);
    }

    /**
     * @param string $link (optional) from root
     * @return string
     */
    public function getRelative($link = '')
    {
        return $this->relative . $link;
    }

    public function __toString()
    {
        return $this->relative;
    }

    /**
     * calculate the relative URL path
     * 
     * @param string $rootURL
     * @param string $requestURI
     */
    private function calculateRelative($rootURL, $requestURI)
    {
        $rootPath = parse_url($rootURL, PHP_URL_PATH);
        $requestPath = parse_url($requestURI, PHP_URL_PATH);

        if ($rootPath === substr($requestPath, 0, $rootPathLen = strlen($rootPath)))
        {
            $requestRelativePath = substr($requestPath, $rootPathLen);
            $level = substr_count($requestRelativePath, '/');
            $relative = str_repeat('../', $level);

            # save the output some bytes if applicable
            if (strlen($relative) > strlen($rootPath))
            {
                $relative = $rootPath;
            }
        }
        else
        {
            $relative = $rootPath;
        }

        return $relative;
    }
}
1 голос
/ 09 февраля 2012

Вызов изображений CSS и тому подобное использует ../ в то время как программно правильно это плохая форма.Вы всегда должны использовать абсолютные пути /css/style.css /images/image.png /js/script.js и т.д ...

Обычно я определяю каталог приложения с константой для верхних и нижних колонтитулов.

define('APPDIR', $_SERVER['DOCUMENT_ROOT']);

Облегчает включение других файлов без необходимости многократно записывать все переменные для корня документа.

Хотя, на мой взгляд, все движется в сторону фреймворков, вы должныдействительно считают спетым Symfony, Codeigniter или тому подобное.Если это трехстраничная сделка, сделайте это прямо в php, но если вы создаете полноценное приложение и его новая разработка, вы оказываете себе медвежью услугу, не используя фреймворк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...