3

在 Layouts/default.ctp 中,您将在第 39 行看到类似这样的内容:

        <div class="header-title">
            <span><?= $this->fetch('title') ?></span>
        </div>

fetch表明它是一个视图块。我在任何地方都找不到这个视图块。

目前它只显示控制器的大写复数形式。意思是说如果你在/users/addfetch('title');给你'Users'

我想改变它。所以我尝试了以下方法:

$this->set('title', 'Login');

/users/login控制器动作中。

不工作。

我也试过

$this->assign('title', 'Login');

/users/login控制器动作中。

我收到此错误消息:

Call to undefined method App\Controller\UsersController::assign()

我阅读了文档并从这里

我明白了

当您想将视图变量转换为块时,分配块的内容通常很有用。例如,您可能希望使用块作为页面标题,有时将标题分配为控制器中的视图变量:

强调我的。

这表明您可以使用assign内部控制器。我想我已经证明这是错误的。

也许文件中有错字。请告知我如何设置标题

4

3 回答 3

4

这要感谢 irc 频道#cakephp 的 dakota。

内部UsersController.php

$this->set('title', 'Login');

里面src/Template/Layouts/default.ctp

以上$this->fetch('title');

写:

if (isset($title)) {
    $this->assign('title', $title); 
}

问题是 cakephp 3 如何设置默认值?

答案在https://github.com/cakephp/cakephp/blob/3.0/src/View/View.php#L468

附加图片以防万一链接失效

在此处输入图像描述

在哪里可以看到会默认为视图路径

于 2014-10-28T08:27:18.303 回答
1

当您想将视图变量转换为块时,分配块的内容通常很有用。例如,您可能希望使用块作为页面标题,有时将标题分配为控制器中的视图变量

以上并不建议您应该在控制器中使用分配(注意粗体)。以上建议,而不是使用

$this->start('title');
echo $title;
$this->end()

您可以使用

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

并且$title应该从您的控制器设置变量。

如果您想从控制器以正确的方式进行操作,则必须编写

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

并从您的布局/视图文件中写入

echo $title;
于 2014-10-28T11:58:40.063 回答
0

Cake 3(和 2?)使您可以覆盖“视图”类。这是调用assign() 的好地方。

例子:

namespace App\View;

use Cake\View\View;

class AppView extends View
{
    public function initialize()
    {
        $this->assign('the_block_name', "Hello from AppView");
    }
}

在布局/default.ctp 中:

<?= $this->fetch('the_block_name') ?>

如果您像我一样想要定义一个“默认”块,那么上述解决方案效果很好。您可以像这样覆盖任何视图文件 (.ctp) 中的默认块:

$this->start('the_block_name');
    echo '<h4>Hello from current view!</h4>';
$this->end();
于 2016-01-24T14:29:02.087 回答