ФорумСообществоПрофессиональная деятельностьВзаимопомощь → Нужен разбор URL как в WP

Нужен разбор URL как в WP

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 10:25

    Вот о чём я:


    Залез в WordPress чтобы скопипастить. Ёманарод! Офигел от объемов. Есть готовое лаконичное решение?
    ιιlllιlllι унц-унц
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2009 г. 11:11, спустя 46 минут 30 секунд

    artoodetoo, дык, откудава ж готовое, если каждый проект имеет свою структуру страниц. Да и откудава знать есть у тебя БД или у тебя все на файлах. При последнем варианте негде хранить название-урл страницы (то, что по типу "huynia_na_postnom_masle"). Вернее можно придумать, но это уже как прикручивать яйца к розовому Мерседесу, чтоб он выглядел мужицкой машинкой.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 11:36, спустя 24 минуты 27 секунд

    rewriterule .* index.php?$1 ;)

    а дальше пляши
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 11:39, спустя 3 минуты 2 секунды

    Givi, ты неправ. ЧПУ придумана какраз чтобы адрес не зависел от реальной структуры файлов и тем более от БД. мысли абстрактно!

    Чтобы упростить понимание, предположим что уже есть скрипты-точки_входа с get-параметрами типа
    huynia.php?category=xxx
    huynia.php?postid=xxx


    phpdude, я уже пляшу. не совсем я кретин. задача в написании функции, раскладывающей URL по заданному админом шаблону/шаблонам
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 11:44, спустя 5 минут 2 секунды


    Givi, ты неправ. ЧПУ придумана какраз чтобы адрес не зависел от реальной структуры файлов и тем более от БД. мысли абстрактно!

    Чтобы упростить понимание, предположим что уже есть скрипты-точки_входа с get-параметрами типа
    huynia.php?category=xxx
    huynia.php?postid=xxx


    phpdude, я уже пляшу. не совсем я кретин. задача в написании функции, раскладывающей URL по заданному админом шаблону/шаблонам
    так а в чем проблема? :) имхо все просто делается :) хочешь расскажу каг?
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 11:56, спустя 12 минут 18 секунд

    да, хочу.
    ιιlllιlllι унц-унц
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2009 г. 12:45, спустя 49 минут 6 секунд

    artoodetoo, ты в пример привел ВП. А у него ЧПУ заточена именно под его структуру. Да, там есть возможность задать самому вид адреса, но работает это не так, как хотелось бы. То есть, можно заюзать один из стандартных вариантов, или же задать свой, который будет все равно не идентичен задуманному (например, если ты хочешь в ВП сделать "домен/это_страница_1" и "домен/это_страница_2" (вторая страница дочерняя к первой), то ты получишь адрес "домен/это_страница_!/это_страница_2", даже в том случае, если тебе связка "родитель-потомок" нужна для совсем другой задачи (например, вывести в левой колонке определенные страницы, которые только для этой цели привязаны к странице-родителю).
    Проще говоря ВП - это не идеал.

    А так, то тебе Дуд правильно подсказал (ну ты и сам вродь так делаешь). А универсально ты не сделаешь. Хотя бы потому что:
    1. Ты, например, делаешь определение "category", "page", "id". А в движке, к которому ты хочешь это прикрутить, нет таких параметров как category, page и id вообще. И что тогда ?!
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 12:54, спустя 8 минут 23 секунды

    <?
    $url = "/archive/2009/27/08/256/buy viagra";
    $pattern = "/archive/%date%/%id%/%title%";

    class WPUrls
    {
    private $_pattern;
    private $_regex;
    private $_groups;

    function __construct($pattern)
    {
    $this->_pattern = $pattern;
    $this->compileRegexp();
    }

    public function parse($url)
    {
    if(!preg_match($this->_regex,$url,$m))
    {
    return false;
    }

    $return = array();
    foreach($this->_groups as $i=>$group)
    {
    $return[$group] = $m[$i+1];
    }
    return $return;
    }

    private function compileRegexp()
    {
    $this->_regex = "#^".preg_replace_callback("#%(.*?)%#",array($this,"embedRegex"),$this->_pattern)."#ism";
    }

    private function embedRegex($s)
    {
    $regex = "";
    $this->_groups[] = $s[1];
    switch($s[1])
    {
    case "date":
    $regex = '(\d{4}/\d{2}/\d{2})';

    break;
    case "id":
    $regex = '(\d+)';
    break;
    case "title":
    $regex = '(.*)(?:\.html)?$';
    break;
    }

    return $regex;
    }

    }

    $wpurls = new WPUrls($pattern);
    print_r($wpurls->parse($url));


    я ахуенен (с) дуд
    Сапожник без сапог
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 13:09, спустя 15 минут 47 секунд

    я не слышу воплей "УРА! СПАСИБО!" (((
    Сапожник без сапог
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 13:10, спустя 24 секунды

    :-D
    Сапожник без сапог
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 13:12, спустя 2 минуты 40 секунд

    похуй. пошел в варкрафт поиграю тогда)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 13:15, спустя 2 минуты 39 секунд

    ты охуенен!
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 13:18, спустя 2 минуты 26 секунд


    ты охуенен!

    можно на обертках написать типа WPUrl->addRewriteParam("date","function_parser"); че нить такое :) чтобы можно было расширять :)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 13:19, спустя 1 минуту 33 секунды

    разреши доебаться? спасибо!

    в ТС видно, что правил > 1, а URL по-определению только один на одну страницу. твой класс построен так, как будто все наоборот: в конструкторе задается одно правило, а тестов url может быть сколько угодно



    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 29 апреля 2009 г. 13:22, спустя 2 минуты 37 секунд


    разреши доебаться? спасибо!

    в ТС видно, что правил > 1, а URL по-определению только один на одну страницу. твой класс построен так, как будто все наоборот: в конструкторе задается одно правило, а тестов url может быть сколько угодно




    ну смотри я же тебе дал пример, а не готовую реализацию. допиши в функцию parse параметром - паттерн и транслируй его на лету, никто же не запрещает ;)

    я думаю заметно что в ПОЛНЫЕ условия ТС я никогда не вчитываюсь)
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!