CakePHP 2访问视图中定义的变量

时间:2013-09-18 12:36:22

标签: php cakephp migration cakephp-2.0

中,我在head布局调用的名为blog的元素中使用了以下代码段:

$this->preMetaValues = array(
    'title' => __('SiteTitle', true).' '.$title_for_layout,
    'desc' => Configure::read('siteTitle').', '.Configure::read('siteSlogan'),
    'keywords' => Configure::read('keywords'),
    'type' => 'article',
    'site_name' => __('SiteTitle', true),
    'imageURL' => $html->url('/img/logo.png', true)
);
if(!isset($this->metaValues)){
  $this->metaValues = $this->preMetaValues;
}
else{
  $this->metaValues = array_merge($this->preMetaValues, $this->metaValues);
}

<?php echo $html->meta('description',$this->metaValues['desc']); ?>
<?php echo $html->meta('keywords', $this->metaValues['keywords']);?>

我使用上面的代码来定义或修改任何视图文件中的元标记值。 preMetaValues被视为默认值。如果视图中定义了metaValues,则此代码将对其进行修改并准备好使用metaValues

带有

现在,所描述的代码会产生以下错误:

  

无法找到辅助类metaValuesHelper。

     

错误:发生了内部错误。

确实,我不知道为什么CakePHP将此变量视为帮助器?我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:1)

您可以通过设置控制器操作中的变量来实现:

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

然后在视图中,使用以下命令打印:

<title><?php echo $title_for_layout?></title>

您在文档中有一个示例: http://book.cakephp.org/2.0/en/views.html#layouts

将它们视为任何其他变量。

答案 1 :(得分:0)

为什么你要使用$ this这个对象?你不能使用像这样的简单解决方案:

$preMetaValues = array(
    'title' => __('SiteTitle', true).' '.$title_for_layout,
    'desc' => Configure::read('siteTitle').', '.Configure::read('siteSlogan'),
    'keywords' => Configure::read('keywords'),
    'type' => 'article',
    'site_name' => __('SiteTitle', true),
    'imageURL' => $html->url('/img/logo.png', true)
);
if(!isset($metaValues)){
  $metaValues = $preMetaValues;
}
else{
  $metaValues = array_merge($preMetaValues, $metaValues);
}

<?php echo $html->meta('description',$metaValues['desc']); ?>
<?php echo $html->meta('keywords', $metaValues['keywords']);?>

答案 2 :(得分:0)

最后我找到了解决方案。它只是关于如何从视图为布局设置变量。似乎在的早期版本中,视图在布局之前处理,而现在在中首先处理布局,因此从视图中布局中定义的任何变量的任何覆盖都不会成功。

因此,解决方案将取决于set method of the view object如下:

//in some view such as index.ctp
    $this->set('metaValues', array(
                                   'title', 'The title string...',
                                   'desc' => 'The description string...'
                                   )
              );

同样在Alvaro的回答中,我必须在没有$ this的情况下访问那些变量,即作为局部变量。

这个答案的灵感来自:Pass a variable from view to layout in CakePHP - or where else to put this logic?