[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Путь к подключаемым файлам.
vegasmoscow
Всем здравствуйте! Не первый раз сталкиваюсь с такой проблемой - при подключении какого либо файла посредством "require" или "include". Дело в том, что файл подключается относительно какой либо директории и соответственно относительно этой же директории и задается путь к подключаемому файлу. Стоит переместить файл, в котором подключают другой файл в другую папку.. и все - путь не работает. Есть ли способы нахождения пути к подключаемому файлу из любого места на сервере?

Для наглядности приведу пример: при создании сайта я решил использовать стандартный, но удобный (в случае изменений), шаблон - в каждой странице функцией "require" или "include" подключаю хидер, футер и другие фрагменты кода, которые многократно повторяются в других страницах. Пути к подключаемым файлам начинаются из корневой директории ("templates/header.php"). При создании папки администратора в корневой директории, в файлах, находящихся в этой папке, путь для подключаемых файлов уже будет "../templates/header.php". Не очень удобно создавать два хидера, два футера, два меню и тд. Нужен универсальный способ нахождения пути к файлу где бы он не находился.



Спустя 21 минута, 31 секунда (4.11.2009 - 02:32) Ulanych написал(а):
Создайте еще один подключаемый файл, например config.php, в котором определите такие вот основные, можно сказать глобальные, переменные с путями в качестве значений. Отдельную переменную для пути от "админа" и отдельную для пути от "пользователя". Эту переменную методом конкатенации подставляете в строку пути к файлам, которые нужно подключить в посследствии. Только не забудьте созданный файл require_once(config.php) во все файлы, в самом начале кода каждого файла.
Этот способ, конечно же, не я придумал, так многие (почти все) поступают.

Спустя 17 минут, 1 секунда (4.11.2009 - 02:49) vegasmoscow написал(а):
Ulanych, может я чего то не так понимаю, но мне кажется, что все равно придется создавать два подключаемых файла с разными путями. Можно написать функцию, которая будет выбирать путь - если страница находится в папке "админ", то "путь 1", если иначе, то "путь 2". Просто я предполагал, что, возможно, есть такая функция PHP, которая эту работу делает сама, без написания конфигурационных файлов, функций и т.д. Читал что то про $_SERVER['DOCUMENT_ROOT'] и dirName(__FILE__), но не работает.

Спустя 47 минут, 16 секунд (4.11.2009 - 03:36) twin написал(а):
Самый простой способ - одна точка входа. То есть все запросы отправлять на один файл - index.php а там уже распределять. И тогда все пути нужно прописывать относительно корня, то есть той директории, в которой находится этот индекс. Перепутать что либо в принципе невозможно. Если обращения идут непосредственно на файлы, то никакая функция не поможет. Только вариант Ulanych'a при условии, что ко всем этим файлам подключен конфиг.

Спустя 13 часов, 39 минут, 19 секунд (4.11.2009 - 17:16) vegasmoscow написал(а):
Вот алгоритм моего способа:

Чтобы прописать путь к подключаемому файлу, нужно определить, на сколько директорий выше находится подключаемый файл. Для этого я написал такую вот простенькую функцию:

PHP
function GetParentDir () {
    $path = $_SERVER['REQUEST_URI']; // Определяем структуру папок на сервере
    // Убираем ТОЛЬКО первый слэш в полученном пути (в дальнейшем он создает лишний уровень)
    
$path_new = preg_replace("|/|", "", $path, 1); 
    preg_match_all 
("|/|", $path_new, $out); // Определяем количество слэшей (соответственно и количество папок)
    $count = count($out);  // Количество слэшей
    for ($i=1; $i<=$count; $i++) {    // Данным циклом определяем, на сколько директорий нужно подняться вверх
        echo "../";
    }
}


Эта функция должна напечатать "../" столько раз, на сколько папок выше нужно подняться.

Далее во всех строчках подключения файлов прописываю эту функцию:

PHP
<? require "".GetParentDir ()."templates/footer.php";<


По идее, путь в итоге, после отработку функции "GetParentDir ()", должен получиться "../../templates/footer.php", но этого не происходит, а происходит следующее:

Функция "GetParentDir ()" отрабатывает независимо от строчки
PHP
<? require "".GetParentDir ()."templates/footer.php";<

и печатает "../../", а ниже PHP выдает ошибку, что файла или папки "templates/footer.php" не существует.

Как можно заставить "require" учитывать и те символы, которые выдает функция "GetParentDir ()". Я уже голову сломал user posted image

Спустя 4 часа, 6 минут, 12 секунд (4.11.2009 - 21:22) Ulanych написал(а):
for ($i=1; $i<=$count; $i++) изменить на for ($i=0; $i<$count; $i++) для начала. Во избежание проблем, которые иногда бывают.
Зачем определять структуру папок на сервере? На мой взгляд это ни к чему.

Мой вариант такой:
файл config.php
PHP
// файл config.php
<?php
    define 
("FROM_ADMIN_2_TEMPL""../temlates_folder/template.php");
    
define ("FROM_PUBLIC_2_TEMPL""template_folder/template.php");

Это при условии, что папка "admin" лежит в корневой директории сервера, там же, где и файл "config.php"
Вставляем файл "config.php" во все файлы, например, так:
PHP
require_once("config.php");
. Далее, там где это необходимо, константы можно использовать для составления путей к файлам template. Для файлов из корневой директории будет применяться константа "FROM_PUBLIC_2_TEMPL", а для файлов в админской папке "FROM_PUBLIC_2_TEMPL". В этом случае ты будешь использовать одни и те же файлы template, лежащие в одной и той же директории. Вот и все.

Спустя 3 часа, 8 минут, 3 секунды (5.11.2009 - 00:30) vegasmoscow написал(а):
Ulanych, этот способ я понял, но как быть, если один и тот же подключаемый хидер используется и в админке и в публичных файлах? Как пути в этом хидере прописывать? Ведь если я пропишу "FROM_PUBLIC_2_TEMPL", то эти пути не будут работать в админке, а если пропишу "FROM_ADMIN_2_TEMPL", то пути не будут работать в публичных страницах. Вот поэтому я и хотел написать некую функцию, которая сначала определяет где находится данный файл, а потом прописывает путь к подключаемым файлам. Я привел такой пример, потому что в хидере тоже много разных подключаемых файлов - яваскрипты, стили. Тут либо два хидера делать, либо.. я временно пользуюсь таким скриптом.. не судите строго smile.gif

Этот скрипт подключается и отрабатывает в каждом файле , находится он в функциях. Единственный минус - подключение файла с функциями все равно для каждого файла прописывать вручную.
PHP
$path = $_SERVER['REQUEST_URI']; // Определяем структуру папок на сервере
// Убираем ТОЛЬКО первый слэш в полученном пути (в дальнейшем он создает лишний уровень)
$path_new = preg_replace("|/|", "", $path, 1); 
preg_match_all 
("|/|", $path_new, $out);   // Определяем количество слэшей (соответственно и количество папок)
$count = count($out);  // Количество слэшей

if ($count == 0) {
    define ("UP_DIR", "");
}
else if ($count == 1) {
    define ("UP_DIR", "../");
}
else if ($count == 2) {
    define ("UP_DIR", "../../");
}
else if ($count == 3) {
    define ("UP_DIR", "../../../");
}
else if ($count == 4) {
    define ("UP_DIR", "../../../../");
}
else if ($count == 5) {
    define ("UP_DIR", "../../../../../");
}

А пути прописываю вот так:
PHP
require (UP_DIR."templates/header.php");


Можно "углубляться" до пяти уровней, на первое время хватит smile.gif

Спустя 1 год, 10 месяцев, 11 дней, 19 часов, 2 минуты, 4 секунды (16.09.2011 - 18:32) caballero написал(а):
А просто указывать полный путь от корня каталога сайта религия запрещает?
$_SERVER['DOCUMENT_ROOT'] в руки и все проблемы

Впрчем, можно просто начинать путь с / по идее должен начинать искать с корня - но это надо конкретно проверять - под разными ОС или разными серверами может по разному быть

Спустя 40 минут, 43 секунды (16.09.2011 - 19:13) inpost написал(а):
caballero
откопал?! smile.gif

Спустя 43 минуты, 40 секунд (16.09.2011 - 19:56) Winston написал(а):
inpost
Да нет, здесь посты со смайликами появились, вот они и подняли эту тему.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.