似乎没有人有这个问题,所以要么我做错了,要么没有人试过:
我有一个模型“信息中心”,它有许多“InfocenterArticle”。为了获取包含相关内容的数据,我将Containable行为附加到两者。
到目前为止,我一直运用自己实施的“HasImageAttachment”行为。问题是在包含的模型中,我的行为的回调不会被调用。
我的模特:
class Infocenter extends AppModel {
...
$actsAs = array('HasImageAttachment', 'Containable');
$hasMany = array('InfocenterArticle');
...
}
class InfocenterArticle extends AppModel {
...
$actsAs = array('Containable');
$belongsTo = array('Infocenter');
...
}
在我的控制器中,我打电话:
$conditions = array('InfocenterArticle.id' => $id);
if ($this->notLoggedIn()) $conditions['InfocenterArticle.freigabe'] = 1;
$article = $this->InfocenterArticle->find('first', array(
'contain' => array(
'Infocenter',
'Infocenter.InfocenterArticle' => array(
'fields' => array('id', 'title', 'freigabe'),
'order' => array(
'InfocenterArticle.order_index' => 'desc',
'InfocenterArticle.created' => 'desc',
'InfocenterArticle.title' => 'asc'
),
'conditions' => array(
'InfocenterArticle.infocenter_id' => 'Infocenter.id'
),
),
),
'conditions' => $conditions,
));
我可以看到我的HasImageAttachmentBehavior :: setup()方法被调用但是HasImageAttachmentBehavior :: afterFind()(以及beforeFind())却没有。虽然调用了Infocenter :: afterFind(),这使我能够做一些肮脏的黑客攻击,现在还不错,但我讨厌它。
我做错了什么?
编辑:回复RichardAtHome评论的其他信息。
1)我的行为适用于没有附着可包含的模型。
2)我确保通过放置一个简单的die()来调用afterFind();在第一行。脚本不会死()。
3)签名应该没问题,我再仔细检查。
4)我正在使用CakePHP 1.3。
感谢您的帮助。
答案 0 :(得分:0)
目前我不相信CakePHP核心支持Contained模型中的行为。
可能是由于可能的递归,如果你有奇怪的包含数组,行为可能会被错误地调用。
CakePHP Lighthouse项目中有一篇关于通过关联模型调用行为的文章,并提供了一些解决方法建议。
答案 1 :(得分:0)
答案 2 :(得分:0)
显然这是一个刻意的设计点(??!?)。因此,如果您希望关联模型的行为与模型完全相同,则必须一直升级到3.0。叹息。
以下是一个广泛的讨论:https://github.com/cakephp/cakephp/issues/1730 以及最简单的食谱修复:https://schneimi.wordpress.com/2009/09/06/behavior-afterfind-on-model-associations/