2010-09-28 49 views
5

我剛剛開始使用cakePHP,並且目前情況並不如此順利。從cakePHP中的控制器輸出超鏈接

我有一個處理確認用戶電子郵件的控制器。在註冊時,用戶在鏈接中發送帶有確認碼的電子郵件。根據他們給出的確認碼,控制器給出不同的文本響應。其中一個響應包括一個超鏈接,以便登錄。

我試圖使用Html幫助程序,但儘管我已將它加載到類頂部的$ helpers中,但我只能使其工作如果我然後使用App :: import,然後實例化它。

這一切似乎矯枉過正,只是做一個超鏈接!我需要加載多少次同一班?

無論從網絡上看,它總是告訴我在控制器中使用助手是一個糟糕的主意,但我還應該如何獲得鏈接?

所以不得不

var $helpers = array('Html'); 

在控制器的頂部,和:

if (isset($this->User->id)) { // Check the user's entered it right 
    // Do some stuff to remember the user has confirmed 
    // This is to load the html helper - supposedly bad form, but how else do I make the link? 
    App::import('Helper', 'Html'); 
    $html = new HtmlHelper(); 
    $this->set('message', __("Your email address has been confirmed.", TRUE)." ".$html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login"))); 
} else { 
    $this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE)); 
} 

在控制器的確認方法和

<div> 
    <?php echo $message;?> 
</div> 
在視圖中輸出

所得消息

當然我會在某個地方出錯 - 任何人都可以解釋一下嗎?

回答

3

這個想法是,你需要渲染頁面的所有數據都通過set發送到視圖,然後用helpers在視圖中完成任何條件邏輯或格式化,因此在適當的時候發送整個查詢結果(假設你需要要改變一個鏈接以包含用戶的屏幕名稱,你會得心應手)。

在控制器動作

$this->set('user', $this->User); 

鑑於(這是稍有不同,這取決於你是否在< = 1.2或1.3

if ($user->id) //available because of Controller->set 
{ 
    //1.2 
    $link = $html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login")); 
    //1.3 
    $link = $this->Html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login")); 
    echo __("Your email address has been confirmed.", TRUE)." $link"; 
} 
else 
{ 
    $this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE)); 
} 

+0

Aaah,好的!這更有意義。這是將全部用戶數據傳遞給我沒有得到的觀點的想法。我認爲這個看法更加「愚蠢」。感謝您的清晰插圖。 – Hippyjim 2010-09-28 07:09:39

+0

我認爲$ this-> User是查詢結果而不是模型。你的權利,你應該做$ user = $ this-> User-> find()然後$ this-> set('user',$ user),因此用戶將是視圖中的結果數組。 – 2010-09-29 06:57:31

+0

是的,我理解它是數據,而不是模型 - 通過模型可能會冒各種令人討厭的循環引用的風險,對吧? (更不用說打破MVC) – Hippyjim 2010-09-30 12:40:22

15

你不應該使用在助手正如@Lincoln所指出的,你應該在視圖中構建鏈接,你可以在Controller中構造URL,因爲URL i基本上是數據,但鏈接是一個非常特定於媒體(HTML)的URL實現。

無論採用哪種方式,您都需要創建一個完整的 URL(包括主機),如果您想通過電子郵件發送。最普遍的方法是使用Router::url

$fullUrl = Router::url(array('controller' => ...), true); // 'true' for full URL 

在控制器或視圖中執行此操作。要創建一個鏈接,請在視圖中使用它:

echo $html->link('Title', $fullUrl); 
0

你要做的事情應該用SessionComponent完成。$ this-> Session-> setFlash('your message here');

並在佈局中用會話幫助器放置$ this-> Session-> flash();

關於你想在控制器中的URL,路由器:: url是正確的,因爲deceze說,但沒有用,因爲你不應該在控制器中構建HTML。

你想這樣做,使用會話:: setFlash()方法上面,然後重定向他們使用

$這個 - >重定向(陣列(「控制器」 =>「用戶」,「動作」什麼= >「login」));

+0

感謝指針 - 但在這種情況下,閃光是不夠的,因爲不僅僅是一個單獨的「div」填充 - 我只是有點削減代碼的例子。無論哪種方式,讓視圖處理顯示邏輯對我來說更有意義,並且我已經獲得了代碼的工作。 – Hippyjim 2010-09-30 12:38:32