[英]CakePHP - How do i set the page title to an item name?
好的,所以我試圖自學CakePHP框架,並且試圖為自己創建一個簡單的演示應用程序。
我已經設置好了所有的控制器,視圖和模型並可以正常工作,但是我想做的事情比基本的在線幫助顯示的要多。
我有一個guitars_controller.php文件,如下所示...
<?php
class GuitarsController extends AppController {
var $name = 'Guitars';
function index() {
$this->set('Guitars', $this->Guitar->findAll());
$this->pageTitle = "All Guitars";
}
function view($id = null) {
$this->Guitar->id = $id;
$this->set('guitar', $this->Guitar->read());
// Want to set the title here.
}
}
?>
“吉他”對象包含一個名為“名稱”的屬性,我希望能夠將其設置為各個頁面視圖的pageTitle。
有人可以指出我該怎么做嗎?
注意 :我知道在應用程序中的何處設置此類數據存在普遍分歧,但對我而言,這與數據有關。
這些操作與模型無關,因此可以放在您的app / app_controller.php文件中
<?php
class AppController extends Controller {
function index() {
$this->set(Inflector::variable($this->name), $this->{$this->modelClass}->findAll());
$this->pageTitle = 'All '.Inflector::humanize($this->name);
}
function view($id = null) {
$data = $this->{$this->modelClass}->findById($id);
$this->set(Inflector::variable($this->modelClass), $data);
$this->pageTitle = $data[$this->modelClass][$this->{$this->modelClass}->displayField];
}
}
?>
將瀏覽器指向/ guitars將調用您的Guitars Controller索引動作,該動作不存在,因此將運行AppController中的那個(GuitarsController繼承自該動作)。 與視圖操作相同。 這也將適用於您的DrumsController,KeyboardsController等。
您可以在控制器中進行設置:
function view($id = null) {
$guitar = $this->Guitar->read(null, $id);
$this->set('guitar', $guitar);
$this->pageTitle = $guitar['Guitar']['name'];
}
或在視圖中:
<? $this->pageTitle = $guitar['Guitar']['name']; ?>
在視圖中設置的值將覆蓋控制器中可能已經設置的任何值。
為了安全起見,您必須確保顯示pageTitle的布局/視圖對這些任意數據進行html編碼,以避免注入攻擊和損壞的html。
<?php echo h( $title_for_layout ); ?>
回應您對oo范式的回答。 就像這樣 :
function view($id) {
$this->Guitar->id = $id;
$this->Guitar->read();
$this->pageTitle = $this->Guitar->data['Guitar']['name'];
$this->set('data', $this->Guitar->data);
}
順便說一句,您應該檢查id是否設置和有效等,因為這是url用戶輸入。
從CakePHP 1.3開始,設置頁面標題已更改。
$this->pageTitle = "Title"; //deprecated
$this->set("title_for_layout",Inflector::humanize($this->name)); // new way of setting title
注意:有關Inflector的更多信息: http ://api13.cakephp.org/class/inflector#method-Inflector
$this->pageTitle = $this->Guitar->Name;
它應該放在View中,但我不是PHP或cakePHP,但這就是視圖應該執行的操作,而不是控制器。
它應該放在控制器中。 看到這個
“但是我想做的事情比基本的在線幫助顯示的要多。”
難道不總是這樣嗎? 如此多的文檔旨在達到最低限度,實際上並沒有太大幫助。 您可以完成許多可用的教程,但是一旦您從混亂中撤離了保留,就可以輕松完成第一步。好吧,這是最低限度的要求,還是專業開發人員的最高要求,但很少能達到輕松,清晰和深度的最佳效果。
我目前正在簡單地重寫一些Zend Framework文檔供我自己使用,這樣我就可以消除不一致之處,弄清假設的局限性,並獲得理解它的核心“最佳實踐”方式。 我的口頭禪:輕松,清晰,深入。 輕松,清晰,深度。
嗯,答案不是很明顯如下...
$this->pageTitle = $this->viewVars['guitar']['Guitar']['Name'];
我通過在控制器中放置以下代碼發現了這一點(老實說,這是一個成功的回報)
echo "<pre>"; print_r($this);echo "</pre>";
感謝所有嘗試提供幫助的人。
好的,我真的很想在控制器中而不是在視圖中設置頁面標題。 所以這就是我所做的:
class CustomersController extends AppController {
var $name = 'Customers';
function beforeFilter() {
parent::beforeFilter();
$this->set('menu',$this->name);
switch ($this->action) {
case 'index':
$this->title = 'List Customer';
break;
case 'view':
$this->title = 'View Customer';
break;
case 'edit':
$this->title = 'Edit Customer';
break;
case 'add':
$this->title = 'Add New Customer';
break;
default:
$title = 'Welcome to '.$name;
break;
}
$this->set('title',$this->title);
}
訣竅是您不能在任何動作中設置$this->title
,它將無法工作。 在我看來,網頁在渲染后即會執行操作,但是您可以在beforeFilter
。
echo "<pre>"; print_r($this);echo "</pre>";
怎么樣
pr( $this );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.