2013-05-02 124 views
0

我想在Yii框架中创建友好的网址。Yii自定义网址路由

一个例子:

mysitename.com/country/city/travelling-type 

mysitename.com/country/city/travelling-type/price 
mysitename.com/city/price 

的问题是,它混淆的参数。 所以我试着用下面的代码来解决它,但它不够好:

'urlManager' => array(
     'urlFormat' => 'path', 
     'appendParams' => true, 
     'showScriptName' => false, 
     'useStrictParsing' => FALSE, 
     'rules' => array(
      '<country:\w+>/<city:\w+>/<travelling_type:\w+>/<accommodation:\w+>/<caftering:\w+>/<price_from:\d+/<price_to:\d+>' => 'Travels/list' 
     ), 
    ), 
+0

你的方法的问题是,你只有位置确定的参数,所以它是不是真的可以确定哪些参数是哪个。您可以改为使用命名参数。 – 2013-05-02 16:09:20

+0

我该如何解决? – sodey 2013-05-03 07:16:58

回答

2

它不是很容易做到这一点,因为Yii的不知道这两个网址之间的区别:

mysitename.com/{city}/{price} 
mysitename.com/{city}/{accommodation} 

你能虽然做的是改变路线到这个系统:

'<param1:\w+>/<param2:\w+>/<param3:\w+>/<param4:\w+>/<param5:\w+>/<param6:\d+/<param7:\d+>' => 'Travels/list' 

你的行动必须确定哪些查询参数代表了搜索查询其参数。在系统中的某些情况下,这应该很容易。例如,有国家数量有限,可能有旅行类型数量有限等

mysitename.com/{city}/{accommodation} 

系统的情况下,将查询“参数1”(=城市)与国家,城市,旅游类型,住宿类型和餐饮类型列表进行比较,以确定参数1确实是一个城市。然后它会继续执行param2来确定它定义了住宿。

价格比较容易识别,因为它们是不同的数据类型(在旅行搜索引擎的情况下,整数可能足够好),因此您可以通过简单地检查价格是否为整数(或类似)来轻松识别价格。 为了区分price_from和price_to,我建议你假设如果只有一个价格,它是price_from;如果有两个价格,第一个是price_from,第二个是price_to。 如果您只想设置price_to,则将price_from设置为0.

我希望涵盖您想要做的事情。设置起来可能相当复杂,但这就是你必须为这种URL路线付费的代价。 :)