CakePHP在哪里可以将此代码重用?

时间:2011-08-18 15:47:52

标签: cakephp cakephp-1.3

我有一个名为 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中,因为它无法访问从模型中找到的数据。

有什么地方我可以把这段代码重新使用吗?

2 个答案:

答案 0 :(得分:1)

你可以使用元素。看看食谱链接:

http://book.cakephp.org/view/1081/Elements

答案 1 :(得分:0)

将方法放在AppModel中。我假设该方法接受id以返回适当的数据。

在AppController的beforeRender方法中放置另一个方法。将id传递给此方法;反过来会调用AppModel中的方法;设置title_for_layoutmeta_descriptionkeywords

您也不应该回显这些值,而是将它们传递给视图并将其输出到那里(或在布局中)。

AppController和AppModels是应用程序范围内的;所以任何控制器/模型都可以访问这些方法。

我确定还有其他方法;这可能不起作用,因为我还没有测试过。