我正在尝试使用Yii URL管理器重写URL,如/site/about?tab=value
到site/about/value
或site/value
。
我的规则/<tab:'w+>' => 'site/about
不起作用。以下是完整的URL管理器代码:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' =>
[
'/' => 'site/index',
'/deals' => '/deal/deals',
'/<tab:'w+>' => 'site/about', //my rule
'/about' => 'site/about',
'/<action:['-'w]+>' => 'site/<action>',
'/<module:'w+>' => '<module>/default/index',
'/<module:'w+>/<controller:'w+>/<id:'d+>' => '/<module>/<controller>/view',
'/<module:'w+>/<controller:'w+>/<id:'d+>/<action:['-'w]+>/<entity_id:'d+>' => '/<module>/<controller>/<action>',
'/<module:'w+>/<controller:'w+>/<id:'d+>/<action:['-'w]+>' => '/<module>/<controller>/<action>',
'/<controller:'w+>/<id:'d+>' => '<controller>/view',
'/<controller:'w+>/<id:'d+>/<action:['-'w]+>/<entity_id:'d+>' => '<controller>/<action>',
'/<controller:'w+>/<id:'d+>/<action:['-'w]+>' => '<controller>/<action>',
'/<controller:'w+>/<action:['-'w]+>' => '<controller>/<action>',
'/<module:'w+>/<action:['-'w]+>' => '<module>/default/<action>',
'/<module:'w+>/<controller:'w+>' => '<module>/<controller>/index',
],
小部件代码:
echo Nav::widget([
'items' => [
['label' => '1', 'url' => ['/site/about', 'tab' => '']],
['label' => '2', 'url' => ['/site/about', 'tab' => 'value']],
['label' => '3', 'url' => ['site/about', 'tab' => 'tariffs']],
['label' => '4', 'url' => ['site/about', 'tab' => 'team']],
['label' => '5', 'url' => ['site/about', 'tab' => 'documents']],
],
'options' => ['class' =>'nav-pills nav-stacked c-nav'],
]);
您应该使用命名参数,但您正在命名模块/控制器部分。
您只能使用以下3个保留字:
模块、控制器、动作
像文档的例子:
[
'<controller:(post|comment)>/<id:'d+>/<action:(create|update|delete)>' => '<controller>/<action>',
'<controller:(post|comment)>/<id:'d+>' => '<controller>/view',
'<controller:(post|comment)>s' => '<controller>/index',
]
但是你正在使用<tab:'w+>
,这对规则部分没有任何意义
也许你可以使用:
'/site/about/<tab:'w+>' => 'site/about',
捕获如下url:
web.com/site/about/bla
然后在控制器中你可以使用$tab
变量,比如
namespace app'controllers;
class SiteController extends 'yii'web'Controller {
public function actionAbout($tab)
{
return $this->renderContent("Hello $tab");
}
}
问题是/<controller:'w+>/<action:['-'w]+>' => '<controller>/<action>
和/<action:['-'w]+>' => 'site/<action>
等规则比我的更早被解析,所以我更改了它们。下面是我的解决方案:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' =>
[
'/' => 'site/index',
'<tab:(about)>' => 'site/about',
'/about/<tab:(about|value|documents|tariffs|team)>' => 'site/about',
'/<action:(index|login|logout|contact|signup|request-password-reset|reset-password|thank-for-register|connect-inviteduser)>' => 'site/<action>',
'/<controller:(deal)>/<action:'w>' => 'deal/<action>',
'/<module:(trades)>' => '<module>/default/index',
'/<module:(trades)>/<controller:'w+>/<id:'d+>' => '/<module>/<controller>/view',
'/<module:(trades)>/<controller:'w+>/<id:'d+>/<action:['-'w]+>/<entity_id:'d+>' => '/<module>/<controller>/<action>',
'/<module:(trades)>/<controller:'w+>/<id:'d+>/<action:['-'w]+>' => '/<module>/<controller>/<action>',
'/<controller:'w+>/<id:'d+>' => '<controller>/view',
'/<controller:'w+>/<id:'d+>/<action:['-'w]+>/<entity_id:'d+>' => '<controller>/<action>',
'/<controller:'w+>/<id:'d+>/<action:['-'w]+>' => '<controller>/<action>',
'/<module:(trades)>/<action:['-'w]+>' => '<module>/default/<action>',
'/<module:(trades)>/<controller:'w+>' => '<module>/<controller>/index',
],
],
小部件代码:
<?php
echo Nav::widget([
'items' => [
['label' => 'О проекте', 'url' => ['/site/about', 'tab' => 'about']],
['label' => '5 причин работать через портал', 'url' => ['/site/about', 'tab' => 'value']],
['label' => 'Продвижение и тарификация', 'url' => ['site/about', 'tab' => 'tariffs']],
['label' => 'Проектная команда', 'url' => ['site/about', 'tab' => 'team']],
['label' => 'Документы', 'url' => ['site/about', 'tab' => 'documents']],
],
'options' => ['class' =>'nav-pills nav-stacked c-nav'],
]);
?>
和动作代码:
public function actionAbout($tab = 'about')
{
$this->layout = '/about';
$tab = $tab == 'about' ? 'index' : $tab;
if (Yii::$app->request->isAjax)
return $this->renderPartial('about/' . $tab);
else
return $this->render('about/' .$tab);
}