Disabling a Behavior from inside its setup() method
06 Aug 2010Sometime you write a nice Behavior, that will automate a lot of stuff that almost all your models will need. But, unfortunatly, a couple of models won't need it. Actually, attaching it to them will even break your code.
So what do you do ? Do you resort to manually fill the $actsAs
variable of each model, except for the two lonely loosers, or defining the $actsAs
of your main AppModel
really seems more appaling ?
Lazyness to the rescue
If, like me, you prefer writing less code, you'd probably go with the AppModel
approach. All you have to do is define a setup()
method in your Behavior and check if it is applied to the right or wrong type of model. Fortunatly for us, the $model
is passed as first argument.
Once you've identified the faulty models, you just have to disable the behavior for them. The BehaviorCollection
that comes bundle into $model->Behaviors
has a nice couple of enable
/disable
methods. Unfortunatly, they won't work from inside the setup()
method because the Behavior is not yet correctly instanciated.
What you can do, however, is to hack inside the BehaviorCollection
to update the inner _disabled
key to add your own Behavior to the list.
function setup(&$model, $config = array()) {
[...]
if ($faultyModel) {
$model->Behaviors->_disabled[] = 'MyBehavior';
}
}
This is more than a bit hacky, I have to admit that. But it does the trick. Enjoy.
Want to add something ? Feel free to get in touch on Twitter : @pixelastic