2013-01-13 107 views
0

我在每個頁面上都有一個名爲userbar的元素 - 它告訴用戶他/她是否已登錄。我創建了這個元素,並在默認情況下回顯它.ctp:在CakePHP中更改元素的文本

<?php echo $this->element('userbar', array('text' => 'You are not logged in.')); ?> 

現在它顯示在每一頁上。但是,我can't find anywhere如何改變這個文字。例如,我想從某個控制器訪問此元素並對其進行更改。怎麼樣?

回答

1

您設置了一個視圖變量,然後使用它。

<?php 
class MyController extends AppController 
{ 
    function myaction() { 
     $this->set ('my_var', 'You are not logged in'); 
    } 
} 
?> 

然後在視圖:

<?php echo $this->element ('userbar', array ('text' => $my_var)); ?> 

考慮到這是東西,你會在每一個頁面請求其做最好把它在AppController::beforeFilter()

There are other ways to do this。但是,如果您在控制器中渲染元素,則​​仍然需要設置視圖變量並在視圖中回顯該元素。

希望這會有所幫助。

+0

正是我需要的,謝謝。我想這會幫助很多未來的用戶。 –

1

我認爲vanneto在回答這個問題時表現得非常出色。但根據我的看法,這裏發生的是設計缺陷。這就是爲什麼我添加這個答案給你如何解決這個問題的另一個選擇。因爲我看到了這種解決方案,而且從長遠來看它們會導致問題。

這種情況是登錄或註銷的文本。

假設你使用的驗證組件:

http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

我們將在控制器開始,可能你在AppController中是這樣的:

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->set('userIsLoggedIn', AuthComponent:: loggedIn()); 
    $this->set('loggedInUser', AuthComponent::user()); 
} 

那麼這是什麼呢:在每次請求時,都會將登錄用戶發送到視圖。現在你可以說控制器可以有一個if語句來檢測哪些文本應該被髮送出去,但這並不是必須的。

在你的元素,你也可以做到這一點。

所以在你的元素放像:

if($userIsLoggedIn) { 
    echo 'User is logged in.'; 
}else{ 
    echo 'You are not logged in!'; 
} 

一般我們移動一點,以幫手來實現這樣的邏輯,因爲它們是有良好的編碼風格更多的選擇類。但它也可以簡單地使用元素。

所以,現在你得到了正確的文字。那麼你會發現:靜態文本是否屬於該元素?不,不是的。那麼,什麼將提高它實現它,如:

if($userIsLoggedIn) { 
    echo __('User is logged in'); 
}else{ 
    echo __('User is not logged in'); 
} 

這樣,你可以把靜態文本到你的.po文件。如果你不知道它們是什麼:

http://book.cakephp.org/2.0/en/core-libraries/internationalization-and-localization.html

元素現在可以也使用,如果你的網站變得如多國語言。或者你可以讓你的textwriter編輯文本而不用觸摸源代碼。

正如你所看到的,它是一種不同的方法,但我認爲它會給你更清晰的代碼。它將代碼解耦,控制器完成他的任務,元素完成他的任務,文本也被分離出來,因爲它不屬於視圖中的硬編碼。

就代碼而言,它並不多,所以我強烈建議一些看起來像這樣的解決方案。也可以用幫手完成。

對這種做法有些來源:

http://en.wikipedia.org/wiki/Object-oriented_programming#Decoupling

http://en.wikipedia.org/wiki/Single_responsibility_principle