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

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

  • artoodetoo

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

    Spritz 20 мая 2009 г. 8:13, спустя 5 минут 18 секунд

    так иди сука досыпай пока крышу не сорвало на
    ιιlllιlllι унц-унц
  • phpdude

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

    Spritz 20 мая 2009 г. 8:19, спустя 6 минут 49 секунд


    так иди сука досыпай пока крышу не сорвало на
    нянечка пришла, не могу же я при ней лечь спать )))))) некрасиво минимум …

    а ночью работать надо. ле сука полшестого, встал в 8.45 … пиздец жизнь, вчера вроде еще хуже поспал))))
    Сапожник без сапог
  • artoodetoo

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

    Spritz 20 мая 2009 г. 8:29, спустя 9 минут 46 секунд

    а ты с ней ложись. это будет прилично ;)
    ιιlllιlllι унц-унц
  • phpdude

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

    Spritz 20 мая 2009 г. 9:02, спустя 33 минуты 21 секунду


    а ты с ней ложись. это будет прилично ;)
    она мну в 2 раза старше)
    Сапожник без сапог
  • md5

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

    Spritz 20 мая 2009 г. 9:04, спустя 1 минуту 15 секунд



    а ты с ней ложись. это будет прилично ;)
    она мну в 2 раза старше)
    а ты её в 2 раза младше)
    все умрут, а я изумруд
  • phpdude

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

    Spritz 20 мая 2009 г. 9:06, спустя 2 минуты 2 секунды




    а ты с ней ложись. это будет прилично ;)
    она мну в 2 раза старше)
    а ты её в 2 раза младше)
    уху))
    Сапожник без сапог
  • artoodetoo

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

    Spritz 20 мая 2009 г. 9:26, спустя 20 минут 26 секунд

    другими словами, она возражать не будет :)
    женщины бальзаковского возраста способны на многое! ну и поспишь чутќа
    ιιlllιlllι унц-унц
  • phpdude

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

    Spritz 20 мая 2009 г. 9:27, спустя 51 секунду


    другими словами, она возражать не будет :)
    женщины бальзаковского возраста способны на многое! ну и поспишь чутќа
    жена дома))))
    Сапожник без сапог
  • phpdude

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

    Spritz 20 мая 2009 г. 9:27, спустя 6 секунд

    хм … в 3?)
    Сапожник без сапог
  • artoodetoo

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

    Spritz 22 мая 2009 г. 10:59, спустя 2 дня 1 час 31 минуту

    класс
    
    class QB_Url
    {
    // … … …
    	//
    	// Make reference for <a> html tag
    	//   first argument - route id
    	//   all others - route parameters in right order
    	//
    	public static function href()
    	{
    		$routeId = func_get_arg(0);
    		$route =& QB::$config['routes'][$routeId];
    		$tokens =&  QB::$config['route_tokens'];
    
    		$uri = $route[0];
    		for ($num =  func_num_args(), $i=1; $i < $num; ++$i)
    		{
    			$value = func_get_arg($i);
    			$varName = $route[$i];
    			if (isset($tokens[$varName][1]))
    			{
    				$modifier = $tokens[$varName][1];
    				$value = $modifier($value);
    			}
    			$uri = str_replace('%'.$varName.'%', $value, $uri);
    		}
    
    		return QB::$config['base_url'] . $uri;
    	}
    // … … …
    }
    


    шаблон
    
    <!– .IF rels –>
    	<p>Related topics:</p>
    	<ul>
    <!–	.FOREACH rels AS related –>
    	 	<li><a href="{#topic, related.id, related.date, related.subject}">{$related.subject}</a></li>
    <!–	.END –>
    	</ul>
    <!– .END –>
    

    по нему сгенерирован код ссылки
    
    <a href="<?php echo QB_Url::href('topic', $data['related']['id'], $data['related']['date'], $data['related']['subject'])?>"><?php echo $data['related']['subject']?></a>
    


    до кучи как выглядит пример таблицы маршрутов сейчас
    
    	'route_tokens' => array(
    		'date'	=> array('(\d{4}/\d{2}/\d{2})',	'urlDate'),
    		'month'	=> array('(\d{4}/\d{2})',		'urlMonth'),
    		'year'	=> array('(\d{4})',				'urlYear'),
    		'title'	=> array('([^\./]+)',			'urlTitle'),
    		'id'	=> array('(\d+)'),
    		'kind'	=> array('(forum|gallery|blog)')
    	),
    
    	'routes' => array(
    		'post_new'		=> array('/topic/%id%/new_post.html',
    						'id'),
    		'post_edit'		=> array('/post/%id%/edit.html',
    						'id'),
    		'topic'			=> array('/%date%/%id%/%title%.html',
    						'id', 'date', 'title'),
    		'archive:1'		=> array('/%date%/',
    						'date'),
    		'archive:2'		=> array('/%month%/',
    						'month'),
    		'archive:3'		=> array('/%year%/',
    						'year'),
    		'new_topic'		=> array('/%kind%/%id%/new_topic.html',
    						'id', 'kind'),
    		'board'			=> array('/%kind%/%id%.html',
    						'id', 'kind'),
    		'board_list'	=> array('/%kind%/',
    						'kind'),
    		'index'			=> array('/'),
    	)
    


    и скриншот

    тыц

    Исходники:
    http://cmf.org.ru/minimal-090522.zip
    ιιlllιlllι унц-унц
  • phpdude

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

    Spritz 22 мая 2009 г. 11:16, спустя 17 минут 4 секунды

    public static function href()
        {
            $routeId = func_get_arg(0);
            $route =& QB::$config['routes'][$routeId];
            $tokens =&  QB::$config['route_tokens'];
    
            $uri = $route[0];
            for ($num =  func_num_args(), $i=1; $i < $num; ++$i)
            {
                $value = func_get_arg($i);
                $varName = $route[$i];
                if (isset($tokens[$varName][1]))
                {
                    $modifier = $tokens[$varName][1];
                    $value = $modifier($value);
                }
                $uri = str_replace('%'.$varName.'%', $value, $uri);
            }
    
            return QB::$config['base_url'] . $uri;
        }


    я бы это порефакторил так.

    public static function href()
        {
    	$vars = func_get_args();
    
            $route = QB::$config['routes'][array_shift($vars)];
            $tokens = QB::$config['route_tokens'];
    
            $uri = $route[0];
            foreach ($vars as $i=>$value)
            {
                $varName = $route[$i];
                if (isset($tokens[$varName][1]))
                {
                    $modifier = $tokens[$varName][1];
                    $value = $modifier($value);
                }
                $uri = str_replace('%'.$varName.'%', $value, $uri);
            }
    
            return QB::$config['base_url'] . $uri;
        }
    Сапожник без сапог
  • phpdude

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

    Spritz 22 мая 2009 г. 11:17, спустя 28 секунд

    дело не в количестве строк, а в более прозрачном коде. имхо прозрачном конечно
    Сапожник без сапог
  • phpdude

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

    Spritz 22 мая 2009 г. 11:19, спустя 2 минуты 47 секунд

    я понимаю, что я доебусь, но!

    доеба вот в чем
                            'id', 'date', 'title'),
            'archive:1'        => array('/%date%/',
                            'date'),
            'archive:2'        => array('/%month%/',
                            'month'),
            'archive:3'        => array('/%year%/',
                            'year'),
            'new_topic'        => array('/%kind%/%id%/new_topic.html',
                            'id', 'kind'),


    нахуй такое ацкое дублирование?
    array('/%date%/','date')
    array('/%month%/','month'),
    array('/%year%/','year'),

    ??????? не кажется ли тебе это излишним? такие вещи обычно тянут за собой неочевидные ошибки в будущем
    Сапожник без сапог
  • phpdude

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

    Spritz 22 мая 2009 г. 11:32, спустя 12 минут 57 секунд

    добавил auto expand editor для быстрого ответа, заебало через очко в мир смотреть)))
    Сапожник без сапог
  • artoodetoo

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

    Spritz 22 мая 2009 г. 12:08, спустя 35 минут 24 секунды

    про array_shift я бы согласился, но мои "переменные" начинаются с индекса 1, а array_shift() сдвинет индексы
    $varName = $route[$i]; будет возвращать не то. надо $i+1 — это уже НЕ красиво

    про ацкое дублирование. его нет. или я тебя не понял.
    идентификаторы в массиве $routes задают порядок следования агрументов при вызове QB_Url::href(), он может совпадать с порядком следования этих идов в маршруте, а может не совпадать. ид может упоминаться в адресе более одного раза. типа "/forum/topic/2392.msg46902#msg46902"
    более того, в маршруте могут использоваться не все иды! например я могу решить, что title в адресе 'topic' лишний и при этом не хочу переделывать все шаблоны где есть вызовы 'topic'!
    помоему самый простой способ решить это — перечислить их в нужном порядке.

    update:
    кажется дошло. хуеваты не иды, а три варианта маршрута для даты?
    так у них разный модификатор для вывода. см. 'route_tokens'

    ιιlllιlllι унц-унц

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