CakePHP - 如何将页面标题设置为项目名称?

时间:2008-10-10 18:55:54

标签: php 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.
    }
}
?>

'Guitar'对象包含一个名为'Name'的属性,我希望能够将其设置为单个页面视图的pageTitle。

有谁可以指出我是怎么做的,拜托?

NB :我知道在应用程序中设置此类数据的位置存在普遍的分歧,但对我而言,它与数据相关。

10 个答案:

答案 0 :(得分:5)

这些操作与模型无关,因此可以放在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将调用您的吉他控制器索引操作,该操作不存在,因此将运行AppController中的一个(GuitarsController继承自的)。视图操作也是如此。这也适用于你的DrumsController,KeyboardsController等等。

答案 1 :(得分: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 ); ?>

答案 2 :(得分:1)

回应你自己对o范式的回答。它是这样的:

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用户输入。

答案 3 :(得分:1)

自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

答案 4 :(得分:0)

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

它应该在View中,但我不是PHP或者CakePHP,但那是一个视图应该做的事情,而不是控制器。

答案 5 :(得分:0)

它应该进入控制器。见this

答案 6 :(得分:0)

  

“但我想做一些比基本的在线帮助节目更多的事情。”

难道不总是这样吗?如此多的文档面向最低限度,它实际上没有多大帮助。您可以完成许多可用的教程,但只要您从预约中退出一步就会产生混乱。好吧,它可以是最低限度或专业开发人员最大值,但很少能达到轻松,清晰和深度的最佳位置。

我目前正在重写一些Zend Framework文档供我自己使用,因此我可以消除不一致性,澄清掩盖假设并获得理解它的核心“最佳实践”方式。我的口头禅:轻松,清晰,深度。轻松,清晰,深度。

答案 7 :(得分:0)

啊,不明显的答案如下......

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

我通过在控制器中放置以下代码来找到这一点(说实话,这是一个很好的回报)

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

感谢所有那些试图提供帮助的人。

答案 8 :(得分:0)

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

怎么样

pr( $this );

答案 9 :(得分:0)

好的,我真的想在控制器中设置页面标题,而不是在视图中。所以这就是我所做的:

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中完成。