2011-02-24 42 views
5

我正在使用CakePHP 1.3。我有一個產品模型。在DB表中有idslug字段。CakePHP - 如何做與slu reverse反向路由?

如果我有一個產品,是id:37slug:My-Product-Title我想要的產品的網址是:

產品/ 37 /我 - 產品名稱

而不是標準的:

產品/視圖/ 37

我創建了一個看起來像這樣的路線:

Router::connect(
    '/products/:id/:slug', 
    array('controller' => 'products', 'action' => 'view'), 
    array('pass' => array('id'), 'id' => '[0-9]+') 
); 

現在我可以去http://server/products/37/My-Product-Title,它帶我到正確的地方。

但是,如何獲得反向路由以自動在$HtmlHelper->link中構建正確的URL?

當我使用:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37) 
); 

它仍然輸出標準products/view/37網址。

+0

我知道這不是直接相關的,但我建議看看pseudocoder的cakephp書中的slu section部分(http://www.pseudocoder.com/archives/free-cakephp-e-如果你還沒有看到它,那麼這本書就是超級棒的高級餅蛋糕。 – Tomba 2011-02-25 15:11:51

回答

5

我不認爲這是可能的自動神奇地完成。幫助者只是一個「助手」,他可以根據給定的參數建立鏈接。

所以,最簡單的方法是添加另一個參數在你的鏈接像這樣:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, $slug) 
); 

在$塞從塞字段中的數據。

也許它可以做你的想法,但你需要打破的MVC模式非常厲害:)

編輯:

讀了你的問題,我再次明白它做好。請參閱如何要做到:

在router.php添加以下規則:

Router::connect(
    '/product/*', 
    array('controller' => 'products', 'action' => 'view') 
); 

請注意,這是/產品/ *而不是/產品/ *

你的鏈接應該做的事像這樣:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, 'my-product-title') 
); 

和鏈接看起來像:

http://yourdomain.com/product/37/my-product-title 

對我來說,你的建議是不好的做法。此外,我不認爲從搜索引擎優化的角度來看,用戶總是重新定向。

+0

不幸的是,這會將URL構建爲'/ products/view/37/my-product-title',我不希望* view *在那裏。如果我傳遞'array('controller'=>'products','action'=> 37,'my-product-title')'但它感覺不對,它確實有效。 – 2011-02-25 14:07:03

+0

我已更新我的帖子。看看它。 – 2011-02-26 17:07:58

0

你應該看看關於自定義路線類的以下文章。

段塞數據根本不需要與數據庫有關 - 該字段是用於簡化邏輯和查找的假字段。該解決方案允許您反轉路由段落,而不需要模型表中的slug字段。

http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls

+0

與你一致認爲,如果網址是上面使用的格式,那麼這個網頁就是SEO。 – 2011-02-25 10:56:30

+0

如果你想要一種不同的格式,它足夠靈活,可以作爲基礎使用。事情是,一個slug總是一個計算的字段,因此不需要存儲,因爲它可以在飛行中計算。 – 2011-03-01 19:03:14

-1

我不知道有多麼糟糕,這是但在ProductsController的下面的代碼:

function view($id) 
{ 
    if(isset($_SERVER) && stristr($_SERVER["REQUEST_URI"],'view/')) 
    { 
     $this->Product->id = $id; 
     $slug = $this->Product->field('slug'); 
     $this->redirect($id.'/'.$slug); 
    } 
    $data = $this->Product->find('first', array('conditions' => array('Product.id' => $id))); 
    $this->set("data", $data); 
} 

如果該頁面通過/view/id訪問它自動將其重定向到使用/id/slug當前頁面

現在我可以使用默認鏈接方案:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37) 
); 

他們將被重定向到正確的URL。

唯一的問題是我不確定每次用戶訪問產品頁面時發生重定向有多糟糕?

3

對於路由:

Router::connect(
    '/products/:id/:slug', 
    array('controller' => 'products', 'action' => 'view'), 
    array('pass' => array('id'), 'id' => '[0-9]+') 
); 

你的鏈接應該是這樣的:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 'id' => 37, 'slug' => 'my-product-title') 
); 

你必須添加額外的(關鍵=>值)的陣列的每個:PARAM在你的路由。然後,魔法將起作用

+0

其實我不確定這是否是給定問題的答案,但它至少正是我正在尋找的=)謝謝! – flo 2012-06-13 19:24:20