2008-10-10 108 views
4

好的,所以我試圖自學CakePHP框架,我正在嘗試爲自己敲一個簡單的演示應用程序。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爲單個頁面查看。

任何人都可以指出我該怎麼做,請嗎?

NB:我知道在設置這種數據的應用程序的哪個位置存在一般意見分歧,但對我而言,它與數據有關。

回答

5

這些行爲模型無關,從而可以把你的應用程序/文件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]; 
    } 
} 
?> 

瀏覽器指向/吉他將調用你的吉他控制器的索引行爲,不存在這樣的一個在AppController(GuitarsController從中繼承)將會運行。視圖操作相同。這也適用於你的DrumsController,KeyboardsController等等。

0
$this->pageTitle = $this->Guitar->Name; 

它應該在視圖中,雖然我不PHP或CakePHP,但這是一個視圖應該做的事情,而不是控制器。

+0

它可以* *也可以在視圖中設置。 但是,CakePHP將數據公開爲關聯數組而不是對象。 $ this-> pageTitle = $ guitar ['Guitar'] ['name'] – Cheekysoft 2008-10-14 14:50:32

+0

$ this-> pageTitle = $ this-> Guitar-> Name;這也是我的想法,但它不起作用。它在面向對象的範例中非常有意義,但顯然不在CakePHP中。 – ZombieSheep 2008-10-10 19:01:52

+0

重要的是要明白,與Rails不同,CakePHP不會將模型數據生成爲對象。應用/模型中的模型類幾乎只是DAO。數據始終可用作關聯數組。 – Cheekysoft 2008-10-14 14:09:29

0

它應該放在控制器中。見this

+0

你也可以在視圖中設置 – Cheekysoft 2008-10-14 14:31:52

4

您可以在控制器中設置這樣的:

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); ?> 
0

「,但我想要做的事稍比基本的在線幫助節目。「

難道那不是總是擦嗎?這麼多的文檔都是針對最低限度的,它確實沒有什麼幫助。您可以完成許多教程,但是隻要您離開預留一步,就會產生混淆。但是,它不是最低限度就是最低限度,或者最低限度是專業開發人員,但很少有輕鬆,清晰和深度的甜點。

我目前正在爲我自己的使用重寫一些Zend Framework文檔,以便我可以消除這些不一致之處,澄清對假設的掩飾並獲取理解它的核心「最佳實踐」方式。我的口號:輕鬆,清晰,深度。易用性,清晰度,深度。

0

啊,沒有明顯的答案如下...

$this->pageTitle = $this->viewVars['guitar']['Guitar']['Name']; 

我發現這個通過將以下代碼控制器(是一個長鏡頭是還清了,說實話)

echo "<pre>"; print_r($this);echo "</pre>"; 

感謝所有那些試圖幫助。

1

迴應你自己對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用戶輸入。

0
echo "<pre>"; print_r($this);echo "</pre>"; 

怎麼樣

pr($this); 
0

OK,我真的要設置在控制器中的網頁標題中,而不是視圖。因此,這裏是我所做的:

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中執行此操作。

相關問題