0

我有各种具有自己设定路径的产品。例如:

  1. 电子产品/mp3 播放器/sony-hg122
  2. 健身/设备/健身房

如果希望能够访问这种格式的 URL。例如:

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

我的策略是重写 SiteController 的“init”函数,以便捕获路径,然后将其定向到我自己的渲染函数实现。但是,这不允许我赶上这条路。

我是不是走错了路?这样做的正确策略是什么?

** 编辑 **

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

4

2 回答 2

2

Eskimo 的设置对于大多数 Yii 系统来说是一个很好的可靠方法。但是,对于您的,我建议创建一个自定义 UrlRule 来查询您的数据库: http ://www.yiiframework.com/doc/guide/1.1/en/topics.url#using-custom-url-rule-classes

注意:每个 Yii 请求都会解析 URL 规则,所以要小心。如果您的效率不高,您可能会迅速降低您的网站速度。默认情况下,规则是缓存的(如果您有缓存设置),但我不知道这是否适用于动态数据库规则(我认为不会)。

于 2013-03-05T13:11:52.987 回答
1

在您的 URL 管理器 ( protected/config/main.php ) 中,设置urlFormatpath(并且顶部设置showScriptNamefalse(这会隐藏 URL 的 index.php 部分))

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

接下来,在您的规则中,您可以设置如下内容:

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

因此,它的作用是使用目录/电子产品/ ipods 之类的结构向ProductController actionView路由和请求。然后,您可以像这样访问 URL 的category_urlproduct_url部分:

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

此规则的工作原理是,任何以单词 catalog(紧跟在您的域名之后)、后跟另一个单词 ( category_url) 和另一个单词 ( product_url) 的 URL 都将被定向到该控制器/操作。

您会注意到,在我的示例中,我在类别和产品前面加上了目录一词。显然,您可以将其替换为您喜欢的任何内容,或者将其全部省略。我将其放入的原因是,请考虑以下 URL:

http://mywebsite.com/site/about

如果您遗漏了 URL 的“目录”部分并将您的规则定义为:

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

URL 管理器会将 URL 的站点部分视为category_url值,将 about 部分视为product_url. 为了防止这种情况,您可以使用 URL 的目录部分,或者为非目录页面定义规则(即;为site/about定义规则)

规则从上到下解释,并且只有第一个规则匹配。显然,您可以根据需要为尽可能多的不同 URL 结构添加尽可能多的规则。

我希望这能让您走上正确的道路,请随时对您需要的任何问题或说明发表评论

于 2013-03-05T07:57:16.270 回答