CakePHP在视图中设置变量以用于布局

时间:2013-04-27 03:19:32

标签: php cakephp layout cakephp-2.1

我有一个CRUD应用程序,在我看来,有各种控制器的动作链接,例如。

<?php echo $this->Html->link(__('List Docs'), array('controller' => 'docs', 'action' => 'index')); ?>
<?php echo $this->Html->link(__('Add Doc'), array('controller' => 'docs', 'action' => 'add')); ?>
<?php echo $this->Html->link(__('List Images'), array('controller' => 'images', 'action' => 'index')); ?>
<?php echo $this->Html->link(__('Add Image'), array('controller' => 'images', 'action' => 'add')); ?>

//etc..

现在,我还有一个带有侧边栏的default.ctp布局,我想用每个正在渲染的视图动态填充动态链接。我知道我可以将操作从我的控制器移动到各自的模型,并在控制器内的beforeRender()回调中设置变量,但是我想将我的操作保留在控制器中,而是在视图中设置一个数组,将它传递给default.ctp布局。这是我到目前为止所做的:

文档/ index.ctp

$links_array = array(
    'list_docs' => array('controller' => 'docs', 'action' => 'index'),
    'add_doc' => array('controller' => 'docs', 'action' => 'add'),
    'list_images' => array('controller' => 'images', 'action' => 'index'),
    'add_image' => array('controller' => 'images', 'action' => 'add')
    );
$this->set('links', $links_array);

布局/ default.thtml中

print_r($links);

这会返回Notice (8): Undefined variable: links [APP\View\Layouts\default.ctp, line 93]我猜是因为布局是在视图之前呈现的。

在不将动作移动到模型的情况下,最好的方法是什么?

3 个答案:

答案 0 :(得分:4)

$links_array = array(
'list_docs' => array('controller' => 'docs', 'action' => 'index'),
'add_doc' => array('controller' => 'docs', 'action' => 'add'),
'list_images' => array('controller' => 'images', 'action' => 'index'),
'add_image' => array('controller' => 'images', 'action' => 'add')
);
$this->set('links', $links_array);

...应该在控制器中。

布局将看到视图中可用的任何变量。因此$links将在布局中可见。 (如果你真的必须从视图而不是控制器设置变量,你不需要在视图中使用$this->set(),只需使用$links = ...)。

答案 1 :(得分:3)

您是否考虑过使用View块?本手册甚至使用侧边栏作为其使用示例; Using View Blocks

// In a view file.
// Create a navbar block
$this->startIfEmpty('navbar');
echo $this->element('navbar', array('links' => $links_array));
$this->end();

// In a parent view/layout
echo $this->fetch('navbar');

答案 2 :(得分:0)

这更好:using blocks for script and css files

您可以定义块名称,例如 scriptBottom 将内容附加到它并显示在布局或其他视图的正确位置。

// In your view
$this->Html->script('carousel', ['block' => 'scriptBottom']);
$this->Html->script('custom', ['block' => 'scriptBottom']);

//or
$this->startIfEmpty('scriptBottom');
$this->append('scriptBottom', $this->script('custom2'));

// In your layout or another view
<?= $this->fetch('scriptBottom') ?>