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

时间:2015-12-06 05:44:17

标签: cakephp cakephp-3.0 cakephp-3.1 cakephp-3.x

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

这是控制器功能:

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.

那么如何保留变量或使其变为可以在主页上显示滑块视图呢?

2 个答案:

答案 0 :(得分:3)

您的最佳做法是使用Cells

  

查看单元格是可以调用视图逻辑的小型迷你控制器   渲染出模板。它们提供轻量级模块化替代品   requestAction()。

  1. 从基础App目录运行cd bin从控制台
  2. 然后从控制台
  3. 运行cake bake cell Slider
  4. 转到src/View/Cell/SliderCell.php
  5. 编辑显示功能,
  6. 如下

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

答案 1 :(得分:1)

变量不是从Controller发送到元素,而是从视图发送。

您可以做的是在控制器中设置变量,如下所示:

$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