$this->set('title', 'Title Name');无法在 CakePHP 中工作 3.x

$this->set('title', 'Title Name'); not working in CakePHP 3.x

基本上在 default.ctp 我的标题是这样的:

<title>
  <?= $this->fetch('title') ?>
</title>

在控制器内部我有这一行:

$this->set('title', 'Test-Title');

但是它什么都不做,它仍然显示控制器名称(Jobs, controllers full name os JobsController.ctp)

但是如果我把它放在我的视图文件中:

$this->assign('title', 'Test-Title');

它改变了标题。那么 $this->set('title', $title) 有什么问题?

您可以 set() 控制器中的变量:

// View or Controller
$this->set('title', 'Test-title');

然后将其用作布局或视图中的标准变量:

<!-- Layout or View -->
<title>
    <?php echo $title; ?>
</title>

详情在这里:http://book.cakephp.org/3.0/en/views.html#setting-view-variables

使用 assign() 是不同的,这就是它与 fetch() 一起使用的原因。 assign() 与视图块一起使用:http://book.cakephp.org/3.0/en/views.html#using-view-blocks

fetch() returns 块的内容不是变量。在您的控制器中使用 set() 设置一个变量,该变量可以通过回显变量在您的视图模板中输出:-

<?php echo $title; ?>

如果要使用 fetch(),则需要在视图模板中将其与 assign() 结合使用以定义块。例如在您的视图模板中使用:-

<?php $this->assign('title', $title); ?>

然后在布局模板中:-

<title><?php echo $this->fetch('title'); ?></title>

在 CakePHP 3 中,想法是通过在视图中分配页面标题来设置页面标题,因为它与页面的呈现相关。这与 CakePHP 2 中最初的处理方式不同,在 CakePHP 2 中,您将在控制器中定义 title_for_layout,然后在布局模板中回显 $title_for_layout 变量(不赞成使用 CakePHP 3 方法Cake 2 的更高版本)。

只是为了完成,我遇到了一种情况,其中在 <head></head> 之间引用了未定义变量的格式错误的 .js 脚本导致 <title></title> 标记被发布到 DOM(显示在页面源代码)但是 Chrome、Firefox 和(从记忆中)MSIE all 未能再次从内存中将标题内容传送到 APP UI - iOS 移动设备 未受影响。

如果你想坚持你的代码,在设置 "title" 变量后只需简单地写这个:

    <?= __('Main Project Name') ?>
    <?php if( isset($title)) $this->assign('title', $title); ?>
    <?= ' - ' . $this->fetch('title') ?>

我在default.ctp

中这样做过
<?php
    $cakeDescription = __d('cake_dev', 'Your Title');
?>

<title>
    <?php echo $cakeDescription ?>: <?php echo $title_for_layout; ?>
</title>

在我的视图文件中,我已经这样做了。

<?php $this->assign('title', 'Your Title');?>

在 CakePHP 3 布局模板中,确保按如下方式设置标题。

<title>
    <?= $this->fetch('title') ?>    
</title>

那么在你看来:

<?php $this->assign('title', 'Title Name'); ?>

这是 CakePHP 使用其 built-in 视图 类 处理页面标题(视图块)呈现方案的方式。