2011-08-18 75 views
1

我有一个名为PageMetaData模型包含标题描述。这将被绑定到任何其他模型,并被用作页面的标题标签和元描述。CakePHP我可以把这段代码重用吗?

所以我有一个名为品牌的模型。品牌有一个字段名为page_meta_data_id和品牌属于关联 PageMetaData

现在的看法品牌,我可以运行此代码:

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已经被关联到最新的品牌和具有价值对于标题,它会将其设置为页面标题,否则,如果品牌有一个名为字段的字段,它将为我们提供该字段。描述相同。

问题是我不想在每个使用PageMetaData的模型的每个视图中重复使用此代码。

我不知道我可以在哪里抽象代码,以避免重复。

我不能将它放在行为或助手中,因为您无法设置标题。我无法将它放入组件中,因为它无法访问从模型中找到的数据。

有什么地方我可以把这个代码重用?

回答

0

将在AppModel的方法。我假设该方法接受一个id为它返回适当的数据。

将另一种方法放在您的AppController的beforeRender方法中。将id传递给此方法;这又将调用AppModel中的方法;设置为title_for_layoutmeta_descriptionkeywords

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

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

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