2011-01-22 4 views
0

Я хотел бы настроить иерархическую маршрутизацию в Kohana 3.0.9. Маршрутизации должны поддерживать страниц и подстраниц, которые могли бы выглядеть примерно так:Иерархические маршруты Kohana с подстраницами

URL называется: http://example.com/company/contact/

Возможный маршрут: <page>(/<subpage>(/<action>))

Проблема с упомянутой выше маршрута является то, что он поддерживает только иерархию с двумя уровнями. Если сайт должен иметь возможность обрабатывать «под-подстраницы», например http://example.com/company/contact/sub, мне пришлось бы изменить маршрут.

Кроме того, я хотел бы, чтобы один контроллер страницы обрабатывал запрос. Он мог бы, например, принять company/contact/sub как строковый параметр. Я знаю ключ <directory>, и я не планирую использовать его.

Есть ли способ сделать маршрут «совместимым» с неограниченными вложенными страницами?

Заранее благодарим за ответы.

ответ

1

Если вы посмотрите раздел ROUTING, вы можете создать собственные шаблоны REGEX. (читайте здесь) http://kohanaframework.org/guide/kohana/routing

По умолчанию «параметры» маршрутизации удаляют пунктуацию.

Вы можете настроить регулярное выражение, чтобы принять «/».

Затем вы можете взять последний параметр и взорвать его с помощью $ pieces = explode ("/", $ pizza);

Пример: http://example.com/company/contact/subpage/subsubpage/action

Route::set('multilevel', '(<controller>(/<page_levels>/<action>))' 
, array('page_levels' => '.*')) 
    ->defaults(array(
     'controller' => 'page_controller', 
     'action'  => 'index', 
    )); 

DoubleCheck регулярное выражение, но в основном она захватывает все "/", за исключением самого последнего (который должен быть ваш Сепаратор параметр ACTION

В вашем ACTION_ [. действие] функция (в Controller_Contact для этого примера), вы бы позвонили

$page_levels = Request::instance()->param('page_levels'); 
$page_array = explode("/",$page_levels); 

Это вы должны получить

$page_array = array ([1] => 'contact', 
         [2] => 'subpage', 
         [3] => 'subsubpage') 
+0

Выглядит хорошо, однако Regex не работает. Я изменил его на '(. *)', Но, к сожалению, действие отключается. 'page_levels' будет содержать' bonjour/sub/doublelesub/index' для http: // localhost/kohana/page/bonjour/sub/doublelesub/index. – Daniel

+1

@ daniel, вы можете либо попробовать (. *)/OR hardcode ACTION вставить маршрут в ( (/ /my_action)), а затем установить «action» => 'my_action' в hardcode в параметре действия. Я не уверен, сколько у вас разных действий. – zerojarvis

+0

@ daniel измените свой ROUTE следующим образом. Route :: набор ('многоуровневый', '( (/ /))' , массив ('page_levels' =>)». * ') -> по умолчанию (массив ( 'контроллер'=>' welcome ', ' action '=>' index ', )); – zerojarvis

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