如何在CakePHP 3中改变控制器中的视图块内容?

时间:2014-10-28 08:01:36

标签: cakephp cakephp-3.0

在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()

我从here

中阅读了文档

我得到了

  

当您想要转换a时,分配块的内容通常很有用   将变量查看到块中。例如,您可能想要使用块   对于页面标题,有时将标题指定为视图变量   在控制器

强调我的。

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

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

3 个答案:

答案 0 :(得分:4)

这要归功于irc频道#cakeph的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

中找到

附加图片以防万一链接腐烂

enter image description here

您可以看到它将默认为视图路径

答案 1 :(得分:1)

  

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

以上并不表示您应该在控制器中使用assign(注意粗体)。以上建议不要使用

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

您可以使用

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

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

如果你想从你的控制器以正确的方式进行,你必须写

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

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

echo $title;

答案 2 :(得分:0)

Cake 3(和2?)让您可以覆盖&#39; View&#39;类。这是调用assign()的好地方。

示例:

namespace App\View;

use Cake\View\View;

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

在Layout / default.ctp中:

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

如果你在我的情况下想要有一个&#39;默认&#39;块定义,上面的解决方案很有效。您可以在任何视图文件(.ctp)中覆盖默认块,如下所示:

$this->start('the_block_name');
    echo '<h4>Hello from current view!</h4>';
$this->end();