За последние 24 часа нас посетили 19306 программистов и 1606 роботов. Сейчас ищут 918 программистов ...

Как писать ссылки с учётом действий в MVC? [Решено]

Тема в разделе "PHP для новичков", создана пользователем TrogWar, 15 фев 2013.

  1. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Доброго времени суток!

    Есть сайт на самописной MVC (для себя – через велосипед понять проще).
    .htaccess в корне выглядит так:
    Код (Text):
    1.  
    2. <IfModule mod_rewrite.c>
    3.     RewriteEngine on
    4.     RewriteCond %{REQUEST_FILENAME} !-f
    5.     RewriteCond %{REQUEST_FILENAME} !-d
    6.     RewriteRule .* index.php [L]
    7. </IfModule>
    Router.php примерно так:
    Код (Text):
    1.  
    2.     class Router {
    3.         static function run() {
    4.             // parse URI
    5.             $routes = explode('/', $_SERVER['REQUEST_URI']);
    6.  
    7.             // get mvc values or default
    8.             $name = $model_name = $view_name = $controller_name = (!empty($routes['2'])) ? $routes['2'] : 'Main';
    9.             $action_name = (!empty($routes['3'])) ? $routes['3'] : 'index';
    10.             $name = strtolower($name);
    11.  
    12.             // set mvc classnames
    13.             $model_name = 'Model_'.$model_name;
    14.             $controller_name = 'Controller_'.$controller_name;
    15.             $action_name = 'action_'.$action_name;
    16.             $view_name = 'View_'.$view_name;
    17.  
    18.             // set mvc filenames
    19.             $model_file = strtolower('core/model/'.$model_name.'.php');
    20.             $controller_file = strtolower('core/controller/'.$controller_name.'.php');
    21.             $view_file = strtolower('core/view/'.$view_name);
    22.  
    23.             // including files
    24.             if (file_exists($model_file)) require_once $model_file;
    25.             else self::err404();
    26.             if (file_exists($view_file.'.php')) require_once $view_file.'.php';
    27.             else self::err404();
    28.             if (file_exists($controller_file)) require_once $controller_file;
    29.             else self::err404();
    30.  
    31.             // create controller
    32.             $controller = new $controller_name($name);
    33.             if (method_exists($controller, $action_name)) $controller->$action_name($name);
    34.             else self::err404();
    35.         }
    36.         static function err404() {
    37.             header('HTTP/1.1 404 Not Found');
    38.             header(' ', true, 404);
    39.             header('Location: http://'.$_SERVER['HTTP_HOST'].'/example/404.html');
    40.             die();
    41.         }
    42.     }
    А все остальные элементы прописаны относительными путями:
    Код (Text):
    1. <link rel="stylesheet" href="css/normalize.min.css"/>
    Всё хорошо пока я брожу по ссылкам http://localhost:8888/example и http://localhost:8888/example/page/.
    Но когда перехожу на http://localhost:8888/example/page/action, то эти относительные ссылки ломаются (становятся вида http://localhost:8888/example/page/css/normalize.min.css, а мне нужно всё то же http://localhost:8888/example/css/normalize.min.css).

    Если вставлять ссылки вот так:
    Код (Text):
    1. <link rel="stylesheet" href="<?php echo 'http://'.$_SERVER['HTTP_HOST'].'/example/'; ?>css/normalize.min.css"/>
    , то всё работает, но есть ли какой-нибудь более адекватный способ?
    Или хотя бы как автоматизировать добавление к каждой ссылке этого кода чтобы не писать вручную?

    Спасибо!

    UPD (решение): использую
    Код (Text):
    1. <base href="http://<?php echo $_SERVER['HTTP_HOST'] ?>">
    .
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    указывайте всегда относительную ссылку и все дела.
     
  3. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    Я и указывал относительную, но косячит.
    В коде так:
    Код (Text):
    1. <link href="css/style.css"/>
    Пример №1:
    Страница: http://localhost:8888/example/page
    Стиль грузится отсюда: http://localhost:8888/example/css/style.css

    Пример №2:
    Страница: http://localhost:8888/example/page/action
    Стиль пытается загрузиться отсюда: http://localhost:8888/example/page/css/style.css

    То бишь, несмотря на то, что точка входа у меня одна (http://localhost:8888/example/index.php), при переходе "вглубь" изменяется и путь к текущей директории (которой, кстати, даже не существует).
    Как это исправить? Как сделать так, чтобы даже при переходе, например, сюда http://localhost:8888/example/page/subpage/action/someaction/smthgelse относительные ссылки были относительно index.php в корне?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    относительную от корня сайта а не текущего документа
     
  5. r3l0c

    r3l0c Активный пользователь

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    Столкнулся с подобной проблемой при индексацией дядкой гуглом своего блога =). допустим есть раздел http://site/coding/
    Все ссылки, которые начинались не с / индексировались как подпапки к coding/ в итоге имея ссылку coding/ололо гугл шел на http://site/coding/coding/ололо
     
  6. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    На хостинге: http://example.com/index.php
    На ноуте: http://localhost:8888/example/index.php
    То бишь, если писать href="/css/style.css", то оно будет работать только на хосте. А как работать с одним и тем же сайтом без тотального изменения "/css/style.css" на "/example/css/style.css"?
    Переносить всё в корень локалхоста очень неудобно ибо там ведь несколько сайтов могут быть.
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    можно еще base указать, раз такие сложности с относительными ссылками от корня сайта
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    Я лично для этого делаю отдельную константу и делаю путь до папки с шаблонами и шаблоном который выбран в данный момент...
    После этого уже использую константу...
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    Можешь виртуальные хосты для сайтов делать. И в файле hosts прописывать для этих адресов IP локалхоста.
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    бинду не проще один разок поставить?
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    А что такое "бинда"?
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    ISC Bind, сервер доменных имен
     
  13. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    Про тег base даже и не знал, спасибо за новую информацию!
    Сервер ставить, честно говоря, лениво ради такой задачи – в hosts напишу путь, да, спасибо!
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    один-два раза прописать в hosts - прописывайте. больше - dns как раз была изобретена для распространения изменения в файлах hosts. все от задачи зависит. у кого не один клиент - задумается о том как удобно доставлять инфу до них. не каждый бухгалтер имеет разрешение на редактирование hosts. у кого не один сервер - dns проще делегирование организует. у кого еще и несколько подсетей... короче, все от задачи зависит, да
     
  15. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Re: Как писать ссылки с учётом действий в MVC? (подробнее вн

    Спасибо за подробное объяснение!
    Видимо, это не для моей задачи - мне нужно просто редактировать сайт на локалхосте и заливать на хостер с минимальными усилиями поэтому hosts вполне подойдёт.