Настройка кодового указателя пользовательского маршрута - PullRequest
1 голос
/ 13 марта 2012

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

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

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

Но безуспешно, я делаю это неправильно?

Мои маршруты. 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']  = '';

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

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

$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.

1 голос
/ 13 марта 2012

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

$route['^(en|es|ro)\/tag\/(:any)'] 
0 голосов
/ 13 марта 2012

У меня что-то похожее, и выглядит как

$route['(:any)/something/(:any)'] = "real/$2/path/$1";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...