This behavior allow to limit selected and update rows of model with some scope.
Example of using if you want to scope articles with scope user_id then in beforeFiler of ArticlesController we place next code.
Value ‘User.id’ placed into session during login.
$this->Article->scopeSetup(array('user_id'=>$this->Session->read('User.id')));
$this->Article->scopeEnable();
After this all insert and read will scoped with user_id value.
Now for example possible to call $this->paginate() without any additional conditions.
Also before create and delete record behavior check that record from required scope.
<?php /*
* Scope behavior for cakePHP
* comments, bug reports are welcome skie AT mail DOT ru
* @author Yevgeny Tomenko aka SkieDr
* @version 1.0.0.1
configuration is
1) array (’scope’ => array(‘parent_id’=>$parentIdValue, ’secondParent’=> $secondParentValue), ’enabled’ => true);
2) array(‘parent_id’=>$parentIdValue, ’secondParent’=> $secondParentValue); 3) array (‘enabled’ => false);
*/
class ScopeBehavior extends ModelBehavior { var $settings = null
;
function setup(&$model, $config = array()) {
$this->scopeSetup(&$model, $config);
}
function scopeSetup(&$model, $config = array()) {
$settings = array(‘enabled’=>true);
if (isset($config['scope'])) {
$settings['scope']=$config['scope'];
} else{
$settings['scope']=$config;
}
if (isset($config['enabled'])) {
$settings['enabled']=$config['enabled'];
}
$this->settings[$model->name] = $settings;
}
function scopeEnable (&$model){
$this->settings[$model->name]['enabled'] = true;
} function scopeDisable (&$model){
$this->settings[$model->name]['enabled'] = false;
}
/**
* Before find method. Called before all find
*
* Set scope filer settings
*
* @param AppModel $model
* @return boolean True to continue, false to abort the save
*/
function beforeFind(&$model, $cond) {
if (!$this->settings[$model->name]['enabled']) return true;
if (!is_array($cond['conditions'])) {
$cond['conditions']=array($cond['conditions']);
}
foreach ($this->settings[$model->name]['scope'] as $key => $value) {
$cond['conditions'][$model->name.'.'.$key]=$value;
}
return $cond;
} function beforeSave(&$model
) {
if (!$this->settings[$model->name]['enabled']) return true;
if (empty($model->data[$model->name][$model->primaryKey])) { //add
foreach ($this->settings[$model->name]['scope'] as $key => $value) {
$model->data[$model->name][$key]=$value;
}
} else { //update
// now nothing to do
}
return true;
} function beforeDelete(&$model) {
if (!$this->settings[$model->name]['enabled']) return true;
if ($model->id!==false) {
$curr=$model->read(null,$model->id);
}
foreach ($this->settings[$model->name]['scope'] as $key => $value) {
if ($curr[$model->name][$key]!=$value) return false;
}
return true;
}
}
?>
September 18, 2007 at 1:40 am
Yevgeny-
I am experimenting with your image behaviour and have a question or 2. Could you please send me your email so we can correspond?
Thanks,
Mike
mike@jaxkayakfishing.com