我有一个名为 PageMetaData 的模型,其中包含标题和描述。这与任何其他模型相关联,并用作页面的标题标签和元描述。
所以我有一个名为Brand的模型。 Brand有一个名为page_meta_data_id的字段,而Brand belongsTo PageMetaData
现在在Brand的视图中我可以运行此代码:
if(!empty($data['PageMetaData']['title']))
{
$this->set('title_for_layout', $data['PageMetaData']['title']);
}
else if(!empty($data['Brand']['name']))
{
$this->set('title_for_layout', $data['Brand']['name']);
}
if(!empty($data['PageMetaData']['description']))
{
echo $this->Html->meta('description', $data['PageMetaData']['description'],array('inline'=>false));
}
else if(!empty($data['Brand']['description']))
{
echo $this->Html->meta('description', $data['Brand']['description'],array('inline'=>false));
}
如果PageMetaData已与当前品牌相关联并且具有title的值,则会将其设置为页面标题,否则如果品牌有一个名为name的字段,那么我们就是这样。同样的描述。
问题是我不想在每个使用PageMetaData的模型的每个视图中隐藏此代码。
我无法弄清楚我可以在哪里抽象代码,以避免重复。
我不能将它放在行为或助手中,因为你无法从中设置标题。我无法将其放在Component中,因为它无法访问从模型中找到的数据。
有什么地方我可以把这段代码重新使用吗?
答案 0 :(得分:1)
你可以使用元素。看看食谱链接:
答案 1 :(得分:0)
将方法放在AppModel
中。我假设该方法接受id
以返回适当的数据。
在AppController的beforeRender
方法中放置另一个方法。将id
传递给此方法;反过来会调用AppModel
中的方法;设置title_for_layout
,meta_description
和keywords
。
您也不应该回显这些值,而是将它们传递给视图并将其输出到那里(或在布局中)。
AppController和AppModels是应用程序范围内的;所以任何控制器/模型都可以访问这些方法。
我确定还有其他方法;这可能不起作用,因为我还没有测试过。