2013-06-20 46 views
1

我配置了Codeigniter 2.1和i18n和擴展控制器。Codeigniter通過擴展控制器和多語言來最小化URL

我隱藏了主控制器「主」,我保持可見的「管理員」和「博客」控制器。

該網址工作正常:

www.mysite.com/ EN/functionname

www.mysite.com/ EN/博客/

這是我的問題: www.mysite.com/ it/博客/functionname

與主控制器 「博客」 一切 「/」 被忽略了。

可以做到這一點嗎?

我routes.php文件文件:

$default_controller = "main"; 
$language_alias = array('it','en'); 
// exceptions 
$controller_exceptions = array('admin','blog'); 
// route 
$route['default_controller'] = $default_controller; 
$route["^(".implode('|', $language_alias).")/(".implode('|', $controller_exceptions).")(.*)"] = '$2'; 
$route["^(".implode('|', $language_alias).")?/(.*)"] = $default_controller.'/$2'; 
$route["^((?!\b".implode('\b|\b', $controller_exceptions)."\b).*)$"] = $default_controller.'/$1'; 

foreach($language_alias as $language) { 
    $route[$language] = $default_controller.'/index'; 
} 

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

// URI like '/en/about' -> use controller 'about' 
$route['^(it|en)/(.+)$'] = "$2"; 

// '/it', '/en' URIs -> use default controller 
$route['^(it|en)$'] = $route['default_controller']; 

如果我刪除郎在我的網址,一切工作正常:

www.mysite.com/ 博客/functionname

回答

1

我認爲在路由中需要另一個段來訪問控制器功能。

所以你需要一個下聯:

// '/it', '/en' URIs -> use default controller 
$route['^(it|en)$'] = $route['default_controller']; 
// URI like '/en/about' -> use controller 'about' 
$route['^(it|en)/(.+)$'] = "$2"; 
// URI like '/en/about/test' -> use controller 'about' with function 'test' 
$route['^(it|en)/(.+)/(.+)$'] = "$2/$3"; 

我不使用國際化或支持任何項目ATM多語言,所以我無法測試,但這應該做的伎倆。

+0

謝謝您的回覆,但它似乎不起作用。 我認爲問題在這裏: '$ route ['default_controller'] = $ default_controller;' '$ route [「^',$ language_alias)。」)/(「。implode ('|',$ controller_exceptions)。「)(。*)」] ='$ 2';' '$ route [「^',$ language_alias)。」)?/(。* )「] = $ default_controller。'/ $ 2';' '$ route [」^((?!\ b「.implode('\ b | \ b',$ controller_exceptions)。」\ b)。*)$ 「] = $ default_controller。'/ $ 1';' – simo

+0

我改變了我的答案,我將默認設置移至頂部。它將永遠不會與底部的默認值一起工作。 – bottleboot

+0

謝謝你的作品!我欠你一杯啤酒! – simo