【问题标题】:$this->set('title', 'Title Name'); not working in CakePHP 3.x$this->set('title', '标题名称');在 CakePHP 3.x 中不工作
【发布时间】:2015-05-11 14:56:26
【问题描述】:

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

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

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

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

但它什么也不做,它仍然显示控制器名称(Jobs,控制器全名os JobsController.ctp)

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

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

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

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

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

    <?php echo $title; ?>
    

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

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

    然后在布局模板中:-

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

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

    【讨论】:

    【解决方案2】:

    你可以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()它,只需使用它。
    • 代替php echo,可以使用更短的ctp表达式= $title ?>
    【解决方案3】:

    在 CakePHP 3 布局模板中,确保将标题设置为如下。

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

    那么在你看来:

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

    这就是 CakePHP 将使用其内置的 View 类来处理页面标题(视图块)呈现场景的方式。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          我已经这样做了,在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');?>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-15
            • 1970-01-01
            相关资源
            最近更新 更多