在Layouts / default.ctp中,你会在第39行看到类似的内容:
<div class="header-title">
<span><?= $this->fetch('title') ?></span>
</div>
fetch
表明它是一个视图块。我无法在任何地方找到这个视图块。
目前它只显示大写的复数形式的控制器。意思是说如果你在/users/add
,fetch('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
。我想我已经证明这是错误的。
也许文件中有拼写错误。请告知我如何设置标题
答案 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
中找到附加图片以防万一链接腐烂
您可以看到它将默认为视图路径
答案 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();