За последние 24 часа нас посетили 20378 программистов и 1089 роботов. Сейчас ищут 826 программистов ...

ЧПУ, mod_rewrite, MVC

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

  1. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Почему он остальные представления игнорирует теперь?
     
  2. Alex_1984

    Alex_1984 Новичок

    С нами с:
    10 дек 2014
    Сообщения:
    133
    Симпатии:
    0
    Остальные это какие? и какие не игнорирует?
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    не нужно ничего передавать и запоминать.
    Код (Text):
    1. RewriteRule .* index.php [L,QSA]
    Более чем достаточно. А внутри пхп распарсить $_SERVER['REQUEST_URI'].

    Добавлено спустя 43 секунды:
    и не нужно

    Добавлено спустя 3 минуты 41 секунду:
    вот моя поделка. Работает хорошо

    Код (PHP):
    1.     $url = parse_url($_SERVER['REQUEST_URI']);
    2.     self::$document = self::getDocument($url['path']);
    3.     if (self::$document === false) {
    4.       //requested url not found
    5.       http_response_code(404);
    6.       self::$document = trim(CFG::$pinpie['page not found'], DS);
    7.     } 
    Код (PHP):
    1.   private static function getDocument($url) {
    2.     self::$getDocumentRecur++;
    3.     if (self::$getDocumentRecur > CFG::$pinpie['route to parent']) {
    4.       return false;
    5.     }
    6.     if (empty($url)) {
    7.       return false;
    8.     }
    9.     $doc = false;
    10.     /////////////////////////////////////////////////////////
    11.     if (is_array($url)) {
    12.       $surl = implode(DS, $url);
    13.     } else {
    14.       $url = trim((string)$url, '/');
    15.       $surl = $url;
    16.       $url = explode('/', $url);
    17.     }
    18.     //if $surl is "ololo/ajaja":
    19.     //First step. Look for "/pages/ololo/ajaja.php".
    20.     $path = CFG::$pinpie['pages folder'] . DS . $surl . '.php';
    21.     if (file_exists($path)) {
    22.       $doc = $surl . '.php';
    23.     } else {
    24.       //Second step. If it is directory, look for "/pages/ololo/ajaja/index.php".
    25.       $path = CFG::$pinpie['pages folder'] . DS . $surl;
    26.       if (is_dir($path) AND file_exists($path . DS . 'index.php')) {
    27.         $doc = $surl . DS . 'index.php';
    28.       } else {
    29.         //Third step. If CFG::$route_to_parent is set greather than zero, will look for nearest parent. Mean "/pages/ololo/ajaja/index.php" if not exist, goes to"/pages/ololo.php" or "/pages/ololo/index.php". (BUT NOT "/pages/index.php" anyway)
    30.         if (CFG::$pinpie['route to parent'] > 0) {
    31.           unset($url[count($url) - 1]);
    32.           $doc = self::getDocument($url);
    33.         }
    34.       }
    35.     }
    36.     return $doc;
    37.   } 
    может поможет в качестве примера
     
  4. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Он только index не игнорит. Получается сейчас, что на всех страницах представление только index.

    Добавлено спустя 4 минуты 12 секунд:
    Попробую внедрить в свой=)
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    не надо внедрять, оно у меня под моё заточено. Ты посмотри код, обрати внимание на функцию parse_url(), рекурсия вся эта тебе не нужна скорее всего. Не забывай отдавать http_response_code(404); если страницы нет, а то есть гадости, связанные с ответом 200 на ссылку, которой нет и так делать нельзя (как минимум говноссылки и до недавнего времени статистика яндекса).
     
  6. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Хорошо=))Спасибо=)
     
  7. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Так сделал, движок стал определять представления=)
    Код (PHP):
    1. $request = parse_url($_SERVER['REQUEST_URI']);
    2.         $routes = explode('/', array_shift($request));
    3.         if ($routes === false) {
    4.         //requested url not found
    5.         Route::ErrorPage404();
    6.         } 
    А, ну и htaccess также выставил=) Огромное Всем Спасибо!!!=)
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    это надежда на то что завтра будет как вчера, а это не всегда так
     
  9. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Эмм...не понял тебя=)
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    $routes = explode('/', array_shift($request));
    опиши своими словами максимально подробно, что по-твоему тут происходит.
     
  11. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Разбиваем строку слешем(/) и array_shift($request) - сама строка.
    index?lang=rus/&id=1
    так что ли получается?=))
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    блин, это не подробно. Это ты код скопировал =) Ты скажи, что тут происходит человеческими словами.
     
  13. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    итак, записываем в переменную $request результат разбора функцией parse_url - $_SERVER['REQUEST_URI']
    получаем такой массив array(2) { ["path"]=> string(8) "/index" ["query"]=> string(10) "lang=rus&id=2" }
    Далее разбиваем строку:
    Delimiter = слеш(/).
    String = array_shift($request) - извлекаем 1-ое значение массива, откидываем 1-ый элемент - а это полностью вся строка, что косяк походу=)))
    и записываем результат работы функции explode в $routes.
    получаем такой массив array(2) { [0]=> string(0) "" [1]=> string(4) "index" }
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Короче к членам ассоциативного массива обращайся через ключ, ибо порядок может быть однажды другим.
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    ты мне запретил конечно писать в твоих темах но я-то блин нервы тратил на попытки помощи тебе. так что я болт поклал на твою просьбу и продолжу навязывать тебе свою помощь :D
    у тебя строка запроса содержит и путь к ресурсу и параметры. чтоб роутер успешно работал - нужно сначала из этого ури вытащить путь и параметры, а потом уже эксплодить и шифтить путь. первое решается через parse_url. но вот только дальше ты вместо того чтоб эксплодить путь - эксплодишь шифт от результата разбора адреса. а там ведь не факт что путь лежит.
     
  16. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Ахахах. Точно вылитый социопат=)))
    Так ты имеешь ввиду?
    Код (PHP):
    1. $request = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    2. $routes = explode('/', $request);
     
  17. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    нет, не так. смотри код Игоря. он тебе дал готовый кусок кода, а ты вместо того чтоб завардампить этот кусок кода и понять как он работает и как его применять - сломал всё нафиг и как обычно получил никакой результат.
     
  18. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Ахахаха, не я вардамп-то делаю=)
     
  19. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    не важно кто вардамп делает. важно что ты его не делаешь. ты не знаешь что у тебя хранится в переменных. поэтому понятия не имеешь во-первых какое там значение (если код твой. а особенное - если не твой) и во-вторых верное ли там значение (ну это если твой код). у тебя какое-то слепое программирование получается.
     
  20. Qumo

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

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Посмотри посты выше, я вардампом массив давал в сообщении. Ты видимо не понял тот пост из-за отсутствия запятой после частицы "НЕ"=) Там я имел ввиду, что я вадмап делаю=))
     
  21. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    я не про какой-то конкретный пост. я про вообще. ты не отлаживаешь. ну да ладно. сейчас ок наступило или не наступило?
     
  22. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Прочитай про массивы срочно.