2011-06-12 24 views
0

我已經爲我的投資組合下面的鏈接結構:CakePHP的視圖方法

<?php echo $this->Html->link($post['Portfolio']['title'], array('controller' => 'portfolio', 'action' => 'view', Inflector::slug($post['Portfolio']['title'])), array('title' => $post['Portfolio']['title'])); ?> 

其中給出的網址,如:http://driz.co.uk/portfolio/view/Paperview_Magazine

但是如何讓我的控制器,顯示基於項目在標題上?

到目前爲止,我有這個,但一直沒能得到它的工作,只是得到了一個空白頁面(所以我還需要檢查格式是否正確以及他們是相關項目)

function view ($title) 
{ 

    $posts = $this->Portfolio->find('first', array('conditions' => array('Portfolio.title' => $title) 
    )); 

    if (empty($title)) 
    { 
     $this->cakeError('error404'); 
    } 
    $this->set(compact('posts')); 
} 
+0

這是極有可能你的'$ title'是無效的(空格,無效字符等,您應該使用URL友好蛞蝓和傳遞到你的'view'函數代替 – Ross 2011-06-12 18:55:34

+0

來澄清 - 即使你在$ title上使用了'Inflector :: slug',你的'Portfolio.title'可能不會被當成一個slug來存儲,你需要搜索'Portfolio .slug'確保匹配! – Ross 2011-06-12 19:02:23

+0

Okies I follow。你能告訴我如何做到這一點嗎?例如在我的數據庫中,標題將被保存爲'Paperview Magazine' – Cameron 2011-06-12 19:08:24

回答

1

@Ross建議您搜索使用Portfolio.slug所以這裏是你如何能做到這一點:

  1. 一個字段添加到您的名爲塞數據庫表。你很可能需要一個足夠長的VARCHAR來容納slug。
  2. 當您創建或更新「Portfolio」記錄時,使用Inflector :: slug方法生成一個slug並將其保存到數據庫中。您始終可以在模型的beforeSave事件中執行此操作,或者如果您願意,可以在保存數據之前在控制器中執行此操作。
  3. 更新查找調用以查找Portfolio.slug而不是Portfolio.title。

不幸的是,有沒有辦法扭轉變形器::彈頭的功能,因爲它消除某些字符,如撇號,引號,括號,等,這就是爲什麼你需要蛞蝓保存到數據庫中,如果您想要搜索爲了它。

這裏是你如何可以在模型中使用BeforeSave事件:

public function beforeSave(array $options = array()) 
{ 
    // If the title is not empty, create/update the slug. 
    if (! empty($this->data[$this->alias]['title']) 
    $this->data[$this->alias]['slug'] = Inflector::slug($this->data[$this->alias]['title']); 

    // Returning true is important otherwise the save or saveAll call will fail. 
    return true; 
} 
+0

我可不只是在調節器以及他們比較他們(因爲他們會匹配),以獲得正確的職位? – Cameron 2011-06-12 19:49:01

+0

該方法的問題在於,您必須獲取整個投資組合記錄並循環瀏覽它們,直到找到合適的記錄爲止。這將是非常低效的,特別是隨着數據庫表的增長。 – 2011-06-12 19:51:13

+0

我是不是已經使用'find()'方法循環了它們? – Cameron 2011-06-12 19:54:30