За последние 24 часа нас посетили 20603 программиста и 1104 робота. Сейчас ищут 543 программиста ...

Реализация произвольных ЧПУ. [Рассуждение, поиск алгоритма]

Тема в разделе "Решения, алгоритмы", создана пользователем Koc, 1 мар 2009.

  1. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    TheShock
    да, правильно. но "где_купить" я привел для примера, подобное тут не обсуждалось)
     
  2. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да хватит уже в каждом топике чирикать тема лебедев-тема лебедев.
    Как будто он там объясняет алгоритм реализации и куски кода раздает.

    Всякие простые url типа
    /company/about-us
    /products/stereo/samsung/sbh-400
    /products/microwave
    у меня можно сделать
    но вот
    /products/microwave/samsung - нельзя, можно
    /products/microwave;samsung или
    /products/microwave?man=samsung

    /products/microwave/page-2 - нельзя, можно
    /products/microwave;page:2 или
    /products/microwave?p=2 или
    /products/microwave/?p=2

    там, где я работаю ссылки выглядят вот так:
    http://www.shena.co.uk/news;news/id/37
     
  3. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    я упомянул о нем в двух темах с одинаковым смыслом)
    он объяснил КАК должно выглядеть
    у тебя нельзя именно то, как должно быть
     
  4. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    кстати кто тебе вообще сказал что нельзя /microwave/samsung, а можно создать новый разделить, хрен знает откуда вылезший - microwava;samsung
     
  5. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    SeregA
    я сказал. Как разработчик
    тогда становится невозможно распарсить по-нормальному запрос.
    Код (Text):
    1.  
    2. /products/microwave/                 прикреплен к модулю товаров, категории микроволновки
    3. /products/microwave/samsung    ни к чему не прикреплен. Samsung - производитель. Для него нет записи в таблице rewrites
    4. /products/microwave;samsung    мы отрезаем все что слева от ; и ищем соответствие в таблице rewrites. А то что справа - просто передаем в модуль товаров, который сам уже разберется что с ним делать.
     
  6. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    Koc
    ну и глупость ты сказал) такие урлы неприемлемы просто по логике. лучше юзать .../микровэйвс?самсунг

    я так понимаю, ты не можешь в мод_реврайте сделать реврайт по шаблону "/продукты/микроволновки/гнусмас"? насколько помню это очень просто. только строки в хтаццесс в определенном порядке надо держать - от большего к меньшему. дома у меня где то пример валяется, вечером могу кинуть ) там получается редирект на что то типа продуктс.пхп?категория=микроволновки&производитель=гнусмас
     
  7. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Koc, ты уж извини, но подход у тебя странный. Лучше переделай так, чтобы было /products/microwave/samsung
     
  8. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    содержимое моего .htaccess
    Код (Text):
    1. Options -Indexes
    2.  
    3. #
    4. # mod_rewrite rules for handling nice urls
    5. #
    6. <IfModule mod_rewrite.c>
    7.     RewriteEngine On
    8.     RewriteBase /
    9.    
    10.     # check if requested url is alias
    11.     RewriteCond %{REQUEST_FILENAME}  !-d
    12.     RewriteCond %{REQUEST_FILENAME}  !-f
    13.     RewriteRule .+              index.php     [L]
    14. </IfModule>
    Никакого products.php нету. Точка входа - одна (index.php). Еще есть admin.php, но то другая история.
    Мне не нужно делать по шаблону, так как URL'ы могут быть произвольными, типа
    /products/microwawe/kak-vibrat-microvolnovku
    /products/monitors/obzor-monitora-t220
     
  9. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    ну какая разница. "index.php?section=products&category=microwave&manufacturer=samsung" тогда
    у меня в .хтаццесс юзалось только RewriteBase и RewriteRule. используя только их можно добиться бесконечной глубины генерации директорий. я где то тут даже читал подробнее про это. погугли)
     
  10. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    и тут я (или тот, кто работает с каталогом) захочу разместить очки не в /products/glasses а просто в /glasses
    он не додумается, что нужно что-то добавить в .htaccess. У него даже доступа на ftp может не быть.

    SeregA
    как тогда отработает реврайт?
     
  11. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    RewriteRule .+ index.php [L]
    Имхо, у тебя самый правильный подход. Я еще люблю

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f

    Ну оставлять, а все дополнительные файлы выносить в отдельный поддомен. Получается .htaccess чтото типа

    Код (Text):
    1. RewriteEngine On
    2. RewriteRule .* index.php [L]
    а в files.example.com полностью отключено исполнение любых сценариев. и лешко потом будет поддомен со статикой полностью перенести на нгинкс, например.

    Тем не менее, я не понимаю, в чем проблема сделать полноценный Router, который бы одинаково удачно работал бы и с /products/microwave/samsung и с чем нибудь другим.
     
  12. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    Koc
    а в чем смысл размещать glasses вне products? это не логично :)
    блиин, я вечером или завтра кину образец, если не забуду :) я ж говорю от самого длинного (т.е. с указанием всех трех свойств) к меньшему....
     
  13. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ладно, переложим всю работу с mod_rewrite полностью на РНР.
    Мы передаём полный URL скрипту и там его уже разбираем.

    Всё, что идет далее, является исключительно моими мыслями и не претендует на идеальное решение и объективность.

    Для начала мы определим, как и что должно выглядеть, например, мы планируем навигацию как:
    http://example.com/2
    Навигацию по категориям как
    http://example.com/tv/samsung/2
    Просмотр модели
    http://example.com/tv/samsung/model.html
    Любая страница в версии для печати выглядит так:
    http://example.com/tv/samsung:print
    http://example.com/tv/samsung/model.html:print

    Переходим к реализации.
    Объявим массив вероятных адресов (название сайта не входит, только адрес):

    PHP:
    1. <?
    2.  
    3. $rewrite = array();
    4.  
    5. $rewrite[1] = '/([0-9]+)\/?$/s'; // Навигация
    6. $rewrite[2] = '/([^0-9]+?[a-z0-9\/]*?)\/?/s'; // Категория
    7.  
    8. // Находим print
    9. if(preg_match('/:print$/s', $url)) {
    10.     // Определение выражений выше
    11. }
    12.  
    13. ?>
    Дело всё как раз в том, что бы переложить всю основную работу на РНР.
    Теперь, нужно обязательно условиться с делиметрами, которые мы храним в конфигурационных файлах.
    Если посмотреть на регулярные выражения, можно заметить детекцию слешей.
    Дак вот, все эти элементы можно задавать именно конфигуративно, т.е не фиксировать.
    Тем не менее цель красивых URL — это не каша, смешанная с говном.
    Любой URL должен быть структурирован.
    Поэтому, если брать правило второе (массив $rewrite[2]), то мы должны понимать, что строку можно разбить на категории + конечный контент.
    Давай попробуем:

    PHP:
    1. <?
    2.  
    3. $sections = explode('/', trim($url, '/'));
    4.  
    5. ?>
    В результате мы получим URL, который дальше будем анализировать.
    Теперь нас интересует перебрать корреткность каждой категории:

    PHP:
    1. <?
    2.  
    3. for($i = 0; $i < count($sections); $i++) {
    4.    if($i == count($sections) - 1) {
    5.       // Проверяем содержание последней строки
    6.       // может там записана модель с .html
    7.    }
    8. }
    9.  
    10. ?>
    Суть всего этого в том, чтобы структурировать КАЖДЫЙ из элементов запроса.
    Каждый элемент мы можем представить в конфигурационном файле как разделитель или определитель для URL,
    тем самым в любой момент изменить его вид.
     
  14. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ну может и не логично, но такая ситуация тоже может быть.
     
  15. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А можно вопрос:
    Нафига нужна вероятность вложения модели в новость, например?
    Вполне естественно располагать категорию вне products как основную или на чем акцентируется внимание.
    Но ведь всё подчинено логике реврайтинга и спокойно ловится как подмножество.
     
  16. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Имхо, код должен подгоняться под пользовательскую историю, а не пользовательская история под код.
    Если пользователь сказал, что должно быть возможность сделать /glasses.html , или /products/microwave/samsung.html , значит должна быть возможность это сделать.
     
  17. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    TheShock
    пользователь указывает админам сайта, на то что ему не нравится урл в истории?) давайте напишем коллективное требование в лексмарк: http://www.lexmark.com/lexmark/sequenti ... 01DBC.html
    вот это - действительно только богу (и то не факт) понятный урл.


    а кто нибудь обращал внимание как решена проблема урлов (афигенно решена кстати) в битриксе?
     
  18. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    пользовательская история - это требования заказчика. если бы тот, кто заказывал программистам сайта www.lexmark.com сайт не был бы мудаком и хорошо бы делал свою работу, то он бы заставил их сделать нормальные урлы, а не это гавно, которое ты показал. Имхо
     
  19. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    ВООТ, ты понял меня.

    SeregA в данном случае пользователь - человек, который строит на основе системы себе сайт (заказчик).
     
  20. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    TheShock
    эт верно) делали мудаки)
    еще раз прошу внимание обратить на то как все решил битрикс!!
     
  21. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ты уж извини, лень лезть в код Битрикса. Не был бы ты так добр, в двух словах рассказать о решении Битрикса?
     
  22. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    TheShock
    http://www.1c-bitrix.ru/products/cms/usability.php - пример
    там нет никакого модреврайта, для раздела "prоducts" имеется дисковый каталог на сервере. в нем лежит index.php, который содержит примерно такой код:
    PHP:
    1.  
    2. <?include($_SERVER['DOCUMENT_ROOT']."/system/start.php");
    3. ShowTemplateBlock("header");
    4. ?>
    5. ---> PAGE BODY <---
    6. <?
    7. include($_SERVER['DOCUMENT_ROOT']."/system/stop.php");
    8. ?>
    9.  
    также в разделе лежит, предположим, section.php, в котором переменными задаются права доступа к этому разделу, название раздела для строки навигации и для заголовка окна

    взято из моей системы, но принцип я честно с 3.15здил с битрикса)
    а при редактировании страницы через админ панель, пхп код в начале и в конце просто не отображается.
     
  23. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    то есть, ты хочешь сказать, что все адреса там есть адресами к реальным файлам?
     
  24. SeregA

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

    С нами с:
    2 фев 2006
    Сообщения:
    269
    Симпатии:
    0
    Адрес:
    Saint Petersburg, Russia
    да. а если на странице надо вывести к примеру последние новости там юзается чтото типа ShowComponent($component_name,$parameter_1,$parameter_2,...); где component_name - имя компонента, parameter_1 - первое значение передаваемое функции (напр какой заголовок указать - "события" или "последние новости), parameter_2 - то же что и параметр_1 (например сколько новостей вывести в блок)
     
  25. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    фигня. Я могу сделать шаблон, из которого вызову последние новости, из такой-то категории, так-то отсортированные, и которые будут отрендерены в таком-то шаблоне.