在cakephp-1.2和cakephp-1.3中,我在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将此变量视为帮助器?我该如何解决这个问题呢?
答案 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)
最后我找到了解决方案。它只是关于如何从视图为布局设置变量。似乎在cakephp的早期版本中,视图在布局之前处理,而现在在cakephp-2.4中首先处理布局,因此从视图中布局中定义的任何变量的任何覆盖都不会成功。
因此,解决方案将取决于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?