Сразу скажу что для своего сайта использую денвер. Так вот. Команда: PHP: <?include("/file.txt");?> возвращает скрипт в самый home каталог. можно ли как-то изменить это? что-бы возвращало в корневую папку сайта
Тебе нужно использовать относительные пути. Структуру файлов и папок проекта ты всегда знаешь. Если тот, кто будет устанавливать себе и использовать твою программу возьмёт и поменяет структуру папок - это уже его проблемы. Например, скрипт лежит в папке /site/blocks относительно корневой папки сайта. А в корневой лежит некий file.php, который тебе нужно инклудить. Тогда: PHP: <?php // Определяешь абсолютный путь скрипта, который что-то инклудит $path = dirname(__FILE__); // Определяешь путь к корневой папке сайта. Ты же знаешь, что // этот твой скрипт лежит в папке /site/blocks - значит ты знаешь, // что тебе нужно подняться на 2 уровня вверх, чтобы добраться // до корневой папки. Тогда путь к корню сайта определяется так $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..'); // Теперь можешь инклудить скрипт из корневой папки include($rootPath . DIRECTORY_SEPARATOR . 'file.php'); // DIRECTORY_SEPARATOR - используется для "кросс-серверности", чтобы // никак не зависеть от ОС сервера. В большинстве случаев достаточно // использовать просто символ / , но на винде может не работать. ?>
Вот как раз хотелось бы расставить в шаблоне инклуды, что-бы они были одинаковы но работали в любом удалении от корня.
Не понимаю, чего ты хочешь? Чтобы не зависимо от того, в какой директории лежит некий файл (и ты не знаешь заранее, в какой директории он лежит) можно было его инклудить? Ну, или из него что-либо инклудить? ИМХО, оба варианта - это бред, структура папок программы заранее извествна всегда, ты же сам её придумываешь, когда пишешь. Можешь попробовать поэкспериментировать с set_include_path()
Не всегда. Авторам фреймворков/библиотек неизвестно, в куда запихнут их код (а требовать, что в /lib - глупо). Поэтому,
[vs], получается PHP: <?php // Определяешь абсолютный путь скрипта, который что-то инклудит $path = dirname(__FILE__); // Определяешь путь к корневой папке сайта. Ты же знаешь, что // этот твой скрипт лежит в папке /site/blocks - значит ты знаешь, // что тебе нужно подняться на 2 уровня вверх, чтобы добраться // до корневой папки. Тогда путь к корню сайта определяется так $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..'); // Теперь можешь инклудить скрипт из корневой папки include($rootPath . DIRECTORY_SEPARATOR . 'file.php'); // DIRECTORY_SEPARATOR - используется для "кросс-серверности", чтобы // никак не зависеть от ОС сервера. В большинстве случаев достаточно // использовать просто символ / , но на винде может не работать. ?> это то что я ищу? При использовании всеравно получаю: [sql] include(/design/head.txt) [function.include]: failed to open stream: No such file or directory in КОРЕНЬ САЙТА\panel\index.php on line 8[/sql] ну а 8 линия это собственно и есть инклуд PHP: include($rootPath . DIRECTORY_SEPARATOR . 'design/head.txt'); При использовании обычного инклуда в корневом файле ошибки не наблюдается
А какая разница куда их запихнут? Хоть в /fkdsjfl/asdfa/addwd/sdadad/asfdas....... Библиотека же не должна инклудить что-то внешнее, это её должны инклудить, на сколько я понимаю. С фреймворками мне кажется, так же. Они инклудят "свои файлы", которые все лежат вот в этом "/fkdsjfl/asdfa/addwd/sdadad/asfdas". И всё что там лежит - имеет такую структуру папок и файлов, которую задумал разработчик этой библиотеки или фреймворка. Соответственно, в любом скрипте можно определить путь к файлу данного скрипта (dirname(__FILE__)) и уже относительно него - инклудить то, что нужно. На счёт именно фреймворков, конечно, не уверен на 100%, может фреймворк и должен инклудить какие-то "внешние" для него файлы, которых в нём самом нет, которые дописывает тот, кто пользуется этим фреймворком. Но всё равно тогда нужно ведь либо как-то указать этому фреймворку, откуда брать эти файлы, либо использовать его структуру.
klon5555 1) Тот скрипт, из которого ты хочешь проинклудить "design/head.txt" - где лежит? Относительно корня сайта. 2) Папка "design" - в корне сайта?
Вообщем так. Изанчально инклуд возвращает в home сверху находится структура вроде /[динамический IP]/www/корень нужно что-бы он возвращал в корень папка design лежит в этом самом корне и содержит все инклуды для шаблона скрипт из которого инклуд будет происходить лежит в корень/panel НО. Возможно ли сделать что-бы 1 шаблон с инклудами мог номрально инклудится в любом удалении от корня сайта? Т.е. не важно от куда исполняется инклуд.
Я про другое сейчас спросил. Тот скрипт, в котором ты пишешь include(что-то там) - он где находится? Относительно корня сайта.
Не понял этой фразы. И, мне кажется, ты меня тоже не понял. Вот у тебя есть корень/panel/script1.php И из него ты хочешь проинклудить что-либо. Тогда в нём ты пишешь: // определяешь путь к script1.php, т.е. это "ip/www/корень/panel" $path = dirname(__FILE__); // теперь ты определяешь путь к корню - "ip/www/корень" $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..'); // теперь ты знаешь путь к корню. Инклудишь всё что хочешь: include($rootPath . DIRECTORY_SEPARATOR . 'design' . DIRECTORY_SEPARATOR . 'head.txt'); Допустим, у тебя есть ещё какой-то скрипт корень/panel/folder/script2.php И из него ты тоже хочешь проинклудить что-либо. Тогда в нём ты пишешь: // определяешь путь к script2.php, т.е. это "ip/www/корень/panel/folder" $path = dirname(__FILE__); // теперь ты определяешь путь к корню - "ip/www/корень" $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..'); // теперь ты знаешь путь к корню. Инклудишь всё что хочешь: include($rootPath . DIRECTORY_SEPARATOR . 'design' . DIRECTORY_SEPARATOR . 'head.txt'); Из script1.php достаточно подняться на 1 уровень выше, чтобы оказаться в корневой папке. Из script2.php нужно подняться на 2 уровеня выше, чтобы оказаться в корневой папке. И, собственно, всё.
Ладно уж. Видимо то что я хочу - невыполнимо. Спасибо вам и на этом Я хотел что-бы именно одинаковый код инклуда мог выполнятся в любом удалении от корня.
Можешь просто хранить все скрипты, к которым идёт обращение из браузера (т.е. которые не инклудятся какими-то скриптами, а именно которые запускаются первыми при запросе к серверу, которые из браузера запрашиваются) в одной папке - например в корне. И в них определять переменную $rootPath. Если скрипт лежит в корне, то путь к корневой папке сайта определится просто как $rootPath = dirname(__FILE__); Ну а дальше инклудь всё что надо. Определение этого пути тогда везде будет одинаковым. Переменная $rootPath будет видна и во всех остальных скриптах, которые ты будешь инклудить. Где бы они не находились
Можешь в .htaccess или php.ini ещё присвоить параметру include_path нужное значение (путь к папке design) и писать просто include('head.txt');
Но может не сработать - зависит от настроек хостинга. Если ip - динамический IP (меняется) - то не знаю, как сделать. Может кто-то ещё знает и посоветует.
как вариант - при запуске сервера использовать батник, который впишет текущий ип в htacces но что-то я указал строчку в htacces с текущим IP и ошибка: [sql]Warning: include(head.php) [function.include]: failed to open stream: No such file or directory in Z:\home\ИП\www\panel\index.php on line 6 Warning: include() [function.include]: Failed opening 'head.php' for inclusion (include_path='.:/ИП/www/design/') in Z:\home\ИП\www\panel\index.php on line 6[/sql] ИП - текущий ип
так и не вкурил, что конкретно надо, может быть поможет PHP: <?php set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT']); и помни что если используем include_path, имя подключаемого файла не должно содержать пути (никаких точек или слешей в начале).
Для Windows: php_value include_path .;Z:\home\ИП\www\design Кроме того, обработка файлов .htaccess должна быть разрешена в конфиге Apache. Я думал там на хостинге. Про $_SERVER['DOCUMENT_ROOT'] тоже как-то не подумал, забыл вообще о существовании такой переменной...