2013-03-05 109 views
0

我有自己设定的路径的各种产品。例如:YII完全自定义路径?

  1. 电子/ MP3播放器/索尼hg122
  2. 健身/设备/ gymboss

如果希望能够访问此网址格式。例如:

http://www.mysite.com/fitness/devices/gymboss 
http://www.mysite.com/electronics/mp3-players/sony-hg122 

我的策略是覆盖SiteController的“初始化”功能,以赶路径,然后直接到我自己的实现渲染功能。但是,这不能让我抓住路径。

我对此有错吗?这样做的正确策略是什么?

**编辑**

我想,我必须利用URL manager的。但是,如果它们都是在数据库中定制的,我该如何动态添加路径格式?

回答

2

爱斯基摩人的设置是对于大多数系统的Yii了良好稳固的做法发表评论。但是,对于你的,我建议创建一个自定义的UrlRule来查询你的数据库: http://www.yiiframework.com/doc/guide/1.1/en/topics.url#using-custom-url-rule-classes

注意:URL规则在每个Yii请求上都被解析,所以要小心。如果你效率不高,你可以迅速减慢你的网站。默认情况下,规则被缓存(如果你有一个缓存设置),但我不知道这是否适用于动态DB规则(我不认为)。

+0

不错的答案,很高兴看到不同的方法。 Upvoted – 2013-03-05 22:54:58

+0

愚蠢的问题,但在这个例子中,你会在哪里放置文件?新的CarUrlRule类文件? – coderama 2013-03-07 19:09:09

+0

可能在你的组件文件夹中 – acorncom 2013-03-07 19:51:38

1

在您的网址经理(保护/配置/ main.php),设置urlFormatpath(和toptionally设置showScriptNamefalse(这个隐藏URL的index.php的一部分))

'urlManager' => array(
    'urlFormat' => 'path', 
    'showScriptName'=>false, 

接下来,在你的规则,你可以设置类似:

catalogue/<category_url:.+>/<product_url:.+> => product/view, 

所以这样做是什么路线,并要求与像目录/ EL的结构ectronics/ipodsProductController actionView。然后,您可以访问URL的category_urlproduct_url部分,像这样:

$_GET['category_url']; 
$_GET['product_url']; 

这个规则是如何工作的,它与字目录(你的域名后直接)开头的URL后面是另一个词( category_url)和另一个词(product_url)将被引导至该控制器/动作。

你会注意到,在我的例子中,我在类别和产品的单词目录之前。显然你可以用你喜欢的任何东西来代替它,或者把它全部放在一起。我已经把它的原因,请考虑以下网址:

http://mywebsite.com/site/about 

如果你离开了URL的“目录”部分,并定义了规则只为:

<category_url:.+>/<product_url:.+> => product/view, 

的URL经理会将URL的网站部分看作category_url值,将大约部分看作product_url。为了防止这种情况,你可以有网址的目录protion,或定义的非目录页的规则(即,定义规则网站/约

规则解释从上到下,只有第一规则匹配。很明显,您可以根据需要为尽可能多的不同网址结构添加尽可能多的规则。

我希望这可以让你在正确的道路上,随时与任何疑问或说明你需要