我在每個頁面上都有一個名爲userbar
的元素 - 它告訴用戶他/她是否已登錄。我創建了這個元素,並在默認情況下回顯它.ctp:在CakePHP中更改元素的文本
<?php echo $this->element('userbar', array('text' => 'You are not logged in.')); ?>
現在它顯示在每一頁上。但是,我can't find anywhere如何改變這個文字。例如,我想從某個控制器訪問此元素並對其進行更改。怎麼樣?
我在每個頁面上都有一個名爲userbar
的元素 - 它告訴用戶他/她是否已登錄。我創建了這個元素,並在默認情況下回顯它.ctp:在CakePHP中更改元素的文本
<?php echo $this->element('userbar', array('text' => 'You are not logged in.')); ?>
現在它顯示在每一頁上。但是,我can't find anywhere如何改變這個文字。例如,我想從某個控制器訪問此元素並對其進行更改。怎麼樣?
您設置了一個視圖變量,然後使用它。
<?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。但是,如果您在控制器中渲染元素,則仍然需要設置視圖變量並在視圖中回顯該元素。
希望這會有所幫助。
我認爲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
正是我需要的,謝謝。我想這會幫助很多未來的用戶。 –