簡體   English   中英

CakePHP-如何將頁面標題設置為商品名稱?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM