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