Сделав это в моем собственном фреймворке, решение может быть немного усложняющим для доступа и не очень хорошо задокументированным многими другими в сети. На самом деле вам нужно учесть 3 проблемы:
- Где находится корень WEB и где расположен код вашего движка / фреймворка соответственно
- Где находится корень файлов PHP для вашего движка / фреймворка и включает / требует соответственно
- Расчет правильного пути для CSS / JS / Images / etc ...
Если предположить несколько мелких деталей, то все это можно легко обойти. Сначала сделаем предположение, что ваш фреймворк будет находиться в известной папке (назовите его framework) и у него будет известное имя файла (опять же, framework.php). Затем, чтобы найти путь к структуре в вашем обработчике index.php, вы можете использовать:
// in index.php
$frameworkPath = './';
while((is_dir($frameworkPath))&&(!file_exists($frameworkPath.'framework/framework.php'))){
$frameworkPath = ($frameworkPath!='./')?'../'.$frameworkPath:'../';
}
if(!file_exists($frameworkPath.'framework/framework.php')){
// some type of error handler here
}else require_once($frameworkPath.'framework/framework.php');
// in framework.php
if(!defined('FRAMEWORK_PATH')){
$frameworkpath = str_replace("\\", '/', dirname(__file__));
if(substr($frameworkpath, -1)!='/') $frameworkpath .= '/';
define('FRAMEWORK_PATH', $frameworkpath);
}
// now your requires become require_once(FRAMEWORK_PATH.'filename/relative/framework.php');
Затем нам нужно вычислить установленный путь к сайту. Мы можем сделать это, используя DOCUMENT_ROOT и путь к «текущему доступному файлу». Нечто похожее на следующее:
$serverPath = $_SERVER['DOCUMENT_ROOT'];
$thisPath = @realpath(dirname('./'));
$thisPathLength = strlen($thisPath);
$SitePath = '/'.str_replace('\\','/', substr($thisPath, strlen($serverPath), $thisPathLength)).'/';
Это также дает нам абсолютный путь к файлам сайтов PHP, и мы можем воспользоваться тем, что система включения PHP позволяет нам указывать абсолютные пути к файлам, а не только относительные, для включения пользовательских скриптов. thisPath - это то, что используется для пользовательских скриптов, включает и требует. Например, если вы хотите включить файл в /path/to/site/user_script.php, вы можете сделать следующее:
require_once($thisPath.'user_script.php');
SitePath теперь можно использовать для настройки включений, связанных с файлами CSS / JS / etc. Таким образом, вместо того, чтобы заявить
<img src="img.jpg" />
вы говорите
<img src="<?php echo $SitePath;?>img.jpg" />.
Если вас заинтересовало, я довел мою текущую платформу до такой степени, что она стала общедоступной, в конце концов я собираюсь выпустить ее с открытым исходным кодом, но я не выполнил документацию, поэтому ее можно прочитать на свой страх и риск: ). Я расширил это, чтобы использовать SIMPLE_HTML_DOM_PARSER, чтобы он обновлял теги в исходном HTML для дизайнера, и им не нужно было беспокоиться об атрибутах src, action, href и т. Д. Для тегов. Конечно, это немного замедляет рендеринг, но делает жизнь дизайнеров намного проще:)