【问题标题】:How to alter view blocks content from controller in CakePHP 3?如何更改 CakePHP 3 中控制器的视图块内容?
【发布时间】:2014-10-28 08:01:36
【问题描述】:

在 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

我明白了

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

强调我的。

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

文档中可能有错字。请告诉我如何设置标题

【问题讨论】:

  • 我指出这是针对 CakePHP 3.x 的。所以我不同意重复的标志。
  • 但两者都使用相同的功能,stackoverflow 不是一个问题,即如何为每个 php 版本按值排序数组的问题!
  • 我同意。那么在这种情况下,您还应该将该 2.5 问题标记为该问题的重复 stackoverflow.com/questions/2628963/…

标签: cakephp cakephp-3.0


【解决方案1】:

感谢 irc 频道#cakephp 的 dakota,这是如何做到的。

内部UsersController.php

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

内部src/Template/Layouts/default.ctp

$this-&gt;fetch('title');上方

写:

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

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

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

附加图片以防链接失效

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

【讨论】:

  • 什么意思?我需要分配一个默认参数“page_header_image”(在我的模板中呈现),并且在某些情况下,覆盖特定页面的 page_header_image。我可以写 $this->assign('page_header_image', '...');在具体的视图中,但是默认的 page_header_image 值呢?
【解决方案2】:

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

以上内容并不建议您在控制器中使用 assign(注意粗体字)。以上建议不要使用

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

你可以使用

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

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

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

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

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

echo $title;

【讨论】:

  • 文档使用了一种繁琐的方式来表达这个想法。这对初学者来说并不是很明显。
【解决方案3】:

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");
    }
}

在 Layout/default.ctp 中:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多