Проблема с выводом ошибок и организацией физической структуры сайта

krafty

new Exception
Проблема с выводом ошибок и организацией физической структуры сайта

Всем доброго дня!
Попытаюсь объяснить суть проблемы.
Допустим есть сайт с такими каталогами:
PHP:
/
|___dir1
          |__script1.1.php
|
|___dir2
|         |__script2.1.php
|         |__script2.2.php
|
|___script1.php
|___script2.php
Предположим, что в скрипте script2.1.php произошло событие, которое нужно обработать. Например, доступ к скрипту script2.1.php из адресной строки. Т. е. нужно запретить доступ к этому скрипту, вывести сообщение пользователю и показать форму авторизации, которая находится в скрипте script1.php.
Вроде ничего сложного. Но вот одна загвоздка - в форму аворизации обрабатывает скрипт script2.php. Таким образом, если в script2.1.php просто напишем
PHP:
if (!isset($_SESSION['login'])) {
  echo "Access denied";
  include "./script1.php";
  die();
}
то выведется все правильно, но когда повторно начнем заполнять форму и нажмем на сабмит - то фигушки script2.php - не найден, он ищется в каталоге dir2. Первое, что приходит на ум - поиграться с экшеном формы. Но опять же все переменные окружения возращают именно ...../dir1/dir2.
Второе, что приходит на ум - делать локейшн на script1.php. А как же выводить сообщение? Можно через гет передать script1.php?msg=..... Да все красиво - месага есть, каталог изменен (т.е. мы сейчас в "настоящем" script1.php). Но ведь пользователь может набрать в адр. строке что угодно и это что угодно будет показано на страничке script1.php. Да и обработку сообщения нужно предусматривать в script1.php.

Натолкните на мысль плз. Может я че-то не досмотрел в переменных окружения. Грамотно сделать экшен формы - это мне кажется самый рациональный способ.
 

svetasmirnova

маленький монстрик
Натолкните на мысль плз. Может я че-то не досмотрел в переменных окружения. Грамотно сделать экшен формы - это мне кажется самый рациональный способ.
Это даже не мысль. А почему бы просто абсолютные пути везде не использовать? Да и в форме action руками не проставлять вместо ""?
 

krafty

new Exception
а это не помешает при переносе сайта?
если, не сложно, приведи свой вариант action, который бы ты использовала в этом случае.

>Да и в форме action руками не проставлять вместо ""?
там не пустая строка а имя скрипта, который обрабатывает форму
 

svetasmirnova

маленький монстрик
>а это не помешает при переносе сайта?
PHP:
dirname(__FILE__) . 'relative path from file';
только поможет. Где-то я приводила пример, почему это не одно и тоже, что:
PHP:
chdir('.');
include 'relative path from file';
И грабли в последнем случае.
Для action я определяю константу WWW_PATH, после чего
PHP:
action="<?=WWW_PATH . 'relative path'?>"
 

krafty

new Exception
WWW_PATH - тобишь документ рут?

а 'relative path from file' - это каталог, в котором находится скрипт с формой (напр. dir0)?

вобщем, если я все правильно понял, то в экшене пишем
$_SERVER['DOCUMENT_ROOT'].'dir0/script2.php'
т.е. в этом случае мы привязываемся к каталогу dir0, в котором лежит весь сайт.

Мда... теперь не пойму причем здесь dirname.
 

svetasmirnova

маленький монстрик
>вобщем, если я все правильно понял
да. Привязываемся к чему-то неизменному. Единственное, $_SERVER['DOCUMENT_ROOT'] может быть выше конкретного web-приложения.
>Мда... теперь не пойму причем здесь dirname.
[m]dirname[/m] читай что это такое.
Мы привязываемся к конкретному файлу и в случае инклюдов из заранее неизвестного места абсолютный путь будет всегда один и тот же. Можно ещё константу определить типа LOCAL_PATH определить и везде пути от неё прописывать.
 

krafty

new Exception
Простите за долгий перерыв. Если кто забыл, прошу вспомнить про проблемку.
Я сделал так (этот код инклудится во все скрипты):
PHP:
  define(WWW_PATH,$_SERVER['DOCUMENT_ROOT']);
  $str=dirname(__FILE__);
  $str=str_replace('\\','/',$str);
  $str=str_replace(WWW_PATH,'',$str);
  $str=str_replace('dir/inc','',$str); //каталог, в котором лежит этот файл
  define(LOCAL_PATH,$str); //определяем каталог, в котором лежит весь сайт, если он находится ниже документ рут
напр., если сайт находится в каталоге "док. рут/site/", то LOCAL_PATH='/site/'

используя эту константу можно добиться того, чтобы в экшене формы был абсолютный путь к скрипту:
с:/localhost/www/html/site/script.php.
Но вот прикол! Это не работает! Браузеры ругаются - неизвестный протокол "с:", тип адреса не поддерживается...
 

Nimous

Guest
в экшене формы был абсолютный путь к скрипту:
с:/localhost/www/html/site/script.php
Мда...
...
Слушай, а может проще в dir2 положить .htaccess с forbidden,
а в руте все 403 пересылать на форму, или что-то вроде того?
 

svetasmirnova

маленький монстрик
используя эту константу можно добиться того, чтобы в экшене формы был абсолютный путь к скрипту:
с:/localhost/www/html/site/script.php.
Но вот прикол! Это не работает! Браузеры ругаются - неизвестный протокол "с:", тип адреса не поддерживается...
конечно =) Читаем фак: PHP FAQ: Различие между абсолютными и относительными путями. В файловой системе и на сайте. Для этого и используются 2(!) константы
 

krafty

new Exception
svetasmirnova
т.е. нужно использовать систему путей виртаульного веб сервера, тобишь
http://localhost/dir/script.php - так конечно будет работать.
Вот какой я сделал вывод: в экшене, напр., можно писать относительные пути опер. системы (dir/index.php), а абсолютные нельзя (для винды точно!).

Можешь мне сформулировать одно золотое правило написания всех экшенов? У меня пока напрашивается одно: использовать абсолютные пути веб сервера. Ну а для инклудов можно использовать и абсолютные пути ОС, начинающиеся с документ рут.
 
Сверху