如何从控制器向 CakePHP 3.x 中的元素发送变量,并在不同视图中使用元素时保留变量?

How to send variables to an element in CakePHP 3.x from a controller and keep variables when using element in a different view?

我创建了一个允许管理员将滑块内容保存到数据库的应用程序,现在我想在主页上包含滑块。我有一个带有滑块功能的幻灯片控制器,它只将幻灯片内容发送到滑块视图。

这是控制器函数:

public function slider()
{
    $slides = $this->Slides->find('all');
    $this->set('slides', $slides);
    $this->set('_serialize', ['slides']);
}

该函数的视图中只有以下内容:

<?= $this->element('slider'); ?>

然后我创建了一个名为 slider 的元素文件并在那里处理幻灯片。当我转到 url /slides/slider 时,滑块正常工作,但当我转到根目录或主页时,滑块是空的。它似乎没有在元素中保留 $slides 变量。

主页上:

<?= $this->element('slider'); ?> // then the rest of the home page follows this.

那么我该如何保留或创建变量,以便主页上也能显示滑块视图?

您的最佳做法是使用 Cells:

View cells are small mini-controllers that can invoke view logic and render out templates. They provide a light-weight modular replacement to requestAction().

  1. 来自基本应用程序目录 运行 cd bin 来自控制台
  2. 然后 运行 cake bake cell Slider 来自控制台
  3. 转到src/View/Cell/SliderCell.php
  4. 编辑显示函数,

如下

public function display()
{
    $this->loadModel('Slides');
    $slides= $this->Slides->find('all');
    $this->set('slides', $slides);
}
  1. 现在转到 src/Template/Cell/Slides/display.ctp,并在模板中使用 $slides
  2. 要在任何地方渲染 Cell,只需使用这个:<?= $this->cell('Slider') ?>

变量不是从控制器发送到元素,而是从视图发送。

您可以像这样在控制器中设置变量:

$this->set('myvariable','any value');

并且,根据 cakephp 3 文档,在视图中您可以像这样传递参数:

echo $this->element('helpbox', [
    "varToElement" => $myvariable
]);

来源:https://book.cakephp.org/3.0/en/views.html#passing-variables-into-an-element