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

CakePHP-如何将页面标题设置为项目名称?,php,cakephp,Php,Cakephp,好的,我试着自学CakePHP框架,我试着为自己制作一个简单的演示应用程序 我已经设置好了控制器、视图和模型,并且可以正常工作,但是我想做的事情比基本的在线帮助显示稍微多一些 我有一个guitars\u controller.php文件,如下所示 <?php class GuitarsController extends AppController { var $name = 'Guitars'; function index() { $this->s

好的,我试着自学CakePHP框架,我试着为自己制作一个简单的演示应用程序

我已经设置好了控制器、视图和模型,并且可以正常工作,但是我想做的事情比基本的在线帮助显示稍微多一些

我有一个guitars\u 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.
    }
}
?>
$this->pageTitle = $this->viewVars['guitar']['Guitar']['Name'];

“吉他”对象包含一个名为“Name”的属性,我希望能够将其设置为各个页面视图的页面标题

谁能告诉我怎么做

NB:我知道在应用程序中的何处设置此类数据存在普遍分歧,但对我来说,这是与数据相关的

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

它应该放在视图中,我不知道PHP或cakePHP,但这是视图应该做的,而不是控制器。

它应该放在控制器中。请参见,您可以在控制器中设置:

function view($id = null) {
    $guitar = $this->Guitar->read(null, $id);
    $this->set('guitar', $guitar);
    $this->pageTitle = $guitar['Guitar']['name'];
}
或者在视图中:

<? $this->pageTitle = $guitar['Guitar']['name']; ?>

视图中设置的值将覆盖控制器中可能已设置的任何值

为了安全起见,必须确保显示页面标题html的布局/视图对这些任意数据进行编码,以避免注入攻击和破坏html

<?php echo h( $title_for_layout ); ?>

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

这不总是麻烦吗?如此多的文档都是为了达到最低限度而编写的,以至于它实际上没有多大帮助。您可以完成许多可用的教程,但一旦您离开预订区一步,就会出现混淆。好吧,它要么是纯最小值,要么是专业开发人员最大值,但很少达到轻松、清晰和深度的最佳点


我目前正在重写一些Zend框架文档供我自己使用,这样我就可以消除不一致之处,澄清掩盖的假设,并获得理解它的核心“最佳实践”方式。我的咒语:轻松、清晰、深刻。轻松、清晰、深入。

啊,不明显的答案如下

<?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.
    }
}
?>
$this->pageTitle = $this->viewVars['guitar']['Guitar']['Name'];
我通过在控制器中放置以下代码发现了这一点(老实说,这是一个很长的成功机会)

echo”“;打印(本);回声“;

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

这些操作与模型无关,因此可以放在app/app\u controller.php文件中

function view($id) {
    $this->Guitar->id = $id;
    $this->Guitar->read();
    $this->pageTitle = $this->Guitar->data['Guitar']['name'];
    $this->set('data', $this->Guitar->data);
}


将浏览器指向/guitars将调用guitars控制器索引操作,该操作不存在,因此将运行AppController中的操作(GuitarController继承自该操作)。查看操作也是如此。这也适用于您的DrumController、键盘控制器等。

以回应您自己关于oo范式的回答。它是这样的:

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

顺便说一句,您应该检查id是否已设置且有效,等等,因为这是url用户输入。

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


诀窍在于,你不能在任何动作中设置
$this->title
,它不会起作用。在我看来,网页在呈现后会执行操作,但是您可以在
beforeFilter
中执行此操作

从CakePHP 1.3开始,设置页面标题已更改


注意:关于拐点的更多信息:

在imho中,这并不是很有用,因为在大多数现实世界设置中,您需要比这更多的事情发生。它也回答了这个问题,但也使问题复杂化了,因为这样的问题不仅有助于解决问题,而且会使问题变得更加模糊。至少给出了OP的基本理解。你需要做的任何额外的事情都应该在这个类的子类中完成。这是分解常见代码的一个很好的例子。语法稍微复杂一些,但这种复杂性是合理的,因为删除了重复的代码。虽然这种方法工作得很好,但对于初学者来说可能有点过于通用和混乱。为此,cake有一个名为debug()的优秀函数。在控制器或视图中:debug($variable,true);布尔HTMLENCODE对调试数据进行编码。此外,您不应该阅读viewVars。检查保罗的答案,这是目前投票最多的。谢谢你的宝贵信息。下次我会尽量记住用这个。:)您也可以在视图$this->pageTitle=$this->guist->Name中设置它;我也是这么想的,但没用。它在面向对象的范例中非常有意义,但在CakePHP中显然没有。重要的是要理解,与Rails不同,CakePHP不会将模型数据作为对象生成。app/model中的模型类几乎就是dao。数据始终以关联数组的形式提供。也可以在视图中进行设置。但是,CakePHP将数据公开为关联数组,而不是对象$此->页面标题=$guitar['guitar']['name']
pr( $this );
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->pageTitle = "Title"; //deprecated

$this->set("title_for_layout",Inflector::humanize($this->name)); // new way of setting title