2012-03-12 3 views
1

Я пытаюсь установить пользовательский маршрут для дружественного URL при загрузке тега, я имею в виду, что я хочу, чтобы преобразовать это: http://test.com/en/results?search_query=data&search=tag к этому http://test.com/en/tag/dataУстановка CodeIgniter пользовательского маршрут

Пытался сделать это, установив это в мой routes.php:

$route['^(en|es|ro)/tag/(:any)'] = "fetch/results?search_query=$1&search=tag";

Но нет успеха, я делаю это не так?

Мой routes.php:

$route['default_controller'] = "home"; 

// URI like '/en/about' -> use controller 'about' 
$route['^(en|es|ro)/video/(.+)$'] = "video/id/$2"; 
$route['^(en|es|ro)/results$']  = "fetch/results$2"; 
$route['(en|es|ro)/tag/(:any)'] = "fetch/results?search_query=$2&search=tag"; 
$route['^(en|es|ro)/(.+)$']  = "$2"; 

// '/en', '/de', '/fr' and '/nl' URIs -> use default controller 
$route['^(en|es|ro)$'] = $route['default_controller']; 

$route['404_override'] = ''; 
+0

^заставляет матч в начале строки, но я не вижу, что картина в этом вопросе в любом месте, то/ен/часть происходит в середине. – sweaver2112

+0

это 'en /', и как он работает, что 'en' является совпадением в начале строки. Так работает библиотека. Это не проблема, но tnx в любом случае – Alex

ответ

3

Я довольно уверен, что ^ не является необходимым. Попробуйте без него:

$route['(en|es|ro)/tag/(:any)'] = "fetch/results?search_query=$1&search=tag"; 

В этом контексте ^ будет рассматриваться как текстовая строка. Если вы хотели сверху использовать регулярное выражение, я полагаю, вы бы обернуть сам регулярное выражение в скобках, например:

$route['(^(en|es|ro))/tag/(:any)'] = "fetch/results?search_query=$1&search=tag"; 

Я не 100% уверен в том, что, но если я правильно и должен Работа. Тем не менее, маршруты всегда предполагают, что первая часть шаблона - это то, с чего должна начинаться строка, поэтому ^ не обязательно должен быть необходим.

Еще одна вещь: Вы не используете второй матч, но первый. Я считаю, что вы хотите заменить $1$2 на вашем маршруте.

$route['(en|es|ro)/tag/(:any)'] = "fetch/results?search_query=$2&search=tag"; 
//  ^^^1^^^^  ^^^2^^         ^^ 

EDIT: После дальнейших исследований и испытаний, кажется, что Codeigniter не может правильно обрабатывать маршруты, которые используют строку запроса, как ?key=value. Если вы используете слэш перед знаком ? вопрос, вы можете по крайней мере, получить его маршрут к правильному контроллеру и способу:

$route['(en|es|ro)/tag/(:any)'] = "fetch/results/?search_query=$2&search=tag"; 

URL-адрес, как это:

http://example.com/es/tag/Codeigniter's Router

...будет направлен к методу results с этой строкой в ​​качестве аргумента, но $_GET будет пустым:

?search_query=Codeigniter%27s%20Router&search=tag

Таким образом, вы можете выбрать обособленно аргумент с parse_str():

function results($request) 
{ 
    $request = ltrim($request, '?'); 
    parse_str($request, $get); 
    // echo $get['search_query'] 
} 

Конечно, вы всегда можете использовать .htaccess, но я понимаю желание сохранить всю логику маршрутизации в одном месте. Извините, если это не тот ответ, на который вы надеялись, но я боюсь, что без написания настраиваемого маршрутизатора это невозможно сделать в Codeigniter. Мое предложение, вероятно, было бы найти другой способ обработки вашей маршрутизации и способ доступа к данным из URL-адреса.

+0

tnx за информацию и предлагаемое решение Madmartigan, я попробую завтра ... сейчас самое время спать. :) – Alex

+0

он не работает, не знаю почему ... Я не могу понять, почему нет. Проверьте редактирование – Alex

+0

Скажите, работает ли этот тест: '$ route ['(en | es | ro)/(: any)'] =" fetch/results/$ 1/$ 2 ";' Использовать URL-адрес,/en/something' и в контроллере 'fetch', сделайте' print_r ($ this-> uri-> rsegment-> array()) ' –

1

Вам может понадобиться, чтобы избежать forwardslashes вокруг тега. Так оно и должно выглядеть следующим образом:

$route['^(en|es|ro)\/tag\/(:any)'] 
+0

tnx, я попробую это завтра. – Alex

+0

Не нужно избегать косой черты, это своего рода извращенное регулярное выражение, которое они используют, шаблон не просто передается как есть. И я знаю, что я задираю, но это не обратные косые черты, которые вы избегаете. –

+0

Ах, скорби исправил спасибо. – Tim

0

У меня есть что-то подобное, и это выглядит как

$route['(:any)/something/(:any)'] = "real/$2/path/$1"; 
+0

Похоже, что OP хочет ограничить первый сегмент 'en',' es' или 'ro', иначе - не направлять запрос. –

Смежные вопросы