2013-05-02 97 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路線付費的代價。 :)