Yii urlManager检查缺少的字符串

时间:2015-12-09 10:03:49

标签: regex yii routing url-routing

我正在使用URL管理器,并且所有网址似乎都在yii中正常路由。但有一件事。如果国家/地区名称在一组国家/地区中丢失,我想在网址中插入国家/地区名称。

'/' to '/uae'
'/ar' to 'ar/uae'
'/ar/bla/bla' to 'ar/uae/bla/bla'

在所有情况下,'uae'或'bahrain'或'qatar'都应该出现。

现在写我的网址设置如下:

    '<lang:ar>/<country:uae | bahrain>/'=>'categories', //DONE
    '<lang:ar>/<country:uae | bahrain>/<make:\w+>'=>'categories/view', //DONE
    '<lang:ar>/<country:uae | bahrain>/<make:\w+>/<model:\w+>'=>'subcategories/view/',
    '<lang:ar>/<country:uae | bahrain>/<make:\w+>/<model:\w+>/<year:\w+>'=>'items/view/',

    '<lang:ar>/'=>'categories', //DONE
    '<lang:ar>/<make:\w+>'=>'categories/view', //DONE
    '<lang:ar>/<make:\w+>/<model:\w+>'=>'subcategories/view/',
    '<lang:ar>/<make:\w+>/<model:\w+>/<year:\w+>'=>'items/view/',

    '<country:uae | bahrain>/'=>'categories', //DONE
    '<country:uae | bahrain>>/<make:\w+>'=>'categories/view', //DONE
    '<country:uae | bahrain>>/<make:\w+>/<model:\w+>'=>'subcategories/view/',
    '<country:uae | bahrain>>/<make:\w+>/<model:\w+>/<year:\w+>'=>'items/view/',


    '/'=>'categories', //DONE
    '<make:\w+>'=>'categories/view', //DONE
    '<make:\w+>/<model:\w+>'=>'subcategories/view/',
    '<make:\w+>/<model:\w+>/<year:\w+>'=>'items/view/',

所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您应该尝试更好地解释您尝试实现的结果。

了解这是否会影响您的所有网址或只是一些网页也很重要,因为通常在使用语言和国家/地区时,它应该是影响整个网站的一般方法。

所以我可以看到你有两个参数,语言和国家,他们会一直在那里吗?

您是否会始终使用这些参数为应用程序的网址添加前缀?或者你想让网址没有语言和国家在内部会采取一些默认值?

例如,在HeavyDots,我们有英语网址,没有任何前缀,其余的语言,西班牙语和罗马尼亚语,都以自己的文件夹esro为前缀:

http://heavydots.com/about/
http://heavydots.com/es/about/
http://heavydots.com/ro/about/

因此,如果您总是以语言和国家为前缀,我建议您只保留一个路线列表,例如:

'<lang:(lang1|lang2|lang3)>/<country:(country1|country2|country3)>/'=>'categories', //DONE
'<lang:(lang1|lang2|lang3)>/<country:(country1|country2|country3)>/<make:\w+>'=>'categories/view', //DONE
'<lang:(lang1|lang2|lang3)>/<country:(country1|country2|country3)>/<make:\w+>/<model:\w+>'=>'subcategories/view/',
'<lang:(lang1|lang2|lang3)>/<country:(country1|country2|country3)>/<make:\w+>/<model:\w+>/<year:\w+>'=>'items/view/',

至于用户首次访问该网站时,如果网址中未找到任何语言和国家/地区,您可以从默认的SiteController::index操作重定向,并将其重定向到categories默认lang和country params。

if (!isset($_GET['lang']) || !isset($_GET['country'])) {
    $this->redirect(array('categories','lang'=>'lang1','country'=>'country1'));
}

或者您可以将根网址的规则保留为categories

'/'=>'categories',

如果$_GET中没有任何内容,只需将一些默认值设置为lang和国家/地区内部变量。

更多提示..

1)你是如何应用语言的?您是在应用程序级别还是在每个控制器上手动执行此操作?

快速执行此操作的方法是使用components/Controller.php,例如:

public function init() {
    parent::init();
    if (isset($_GET['lang'])) {
      Yii::app()->language=$_GET['lang'];
    }
}

2)使用语言支持为所有路径添加前缀并获得更动态结果和更清晰的规则定义的更​​快方法可以是扩展CUrlManager,并在其init方法内循环所有规则并大量修改/乘以

3)生成URL的更简洁/更快的方法,而不必总是在每个url创建命令中传递lang参数,将扩展CUrlManager并修改其createUrl方法,如果没有创建url时会找到lang参数,它会使用活动语言的值定义此参数。因此,当您需要更改语言时,您只会传递lang参数,但对于其余的网址创建,您可以跳过该参数并自动添加。

如果您需要更多关于任何提示的示例,请通知我。希望它有所帮助。