1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
<?php
/*-----8<--------------------------------------------------------------------
*
* BEdita - a semantic content management framework
*
* Copyright 2008 ChannelWeb Srl, Chialab Srl
*
* This file is part of BEdita: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* BEdita is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with BEdita (see LICENSE.LGPL).
* If not, see <http://gnu.org/licenses/lgpl-3.0.html>.
*
*------------------------------------------------------------------->8-----
*/
/**
*
*
* @version $Revision$
* @modifiedby $LastChangedBy$
* @lastmodified $LastChangedDate$
*
* $Id$
*/
/**
*
* Foreign key dependencies on save management
* Models names to manage passed through Configure
*
*/
class ForeignDependenceSaveBehavior extends ModelBehavior {
var $config = array();
function setup(&$model, $config = array()) {
$this->config[$model->name] = $config ;
}
/**
* If some model/s has to be saved before current, related data is passed and saving is performed
*
* @param object $model
* @return boolean
*/
function beforeSave(&$model) {
$first = true ; // true, first model processing (if necessary, new id is created)
$id = null ; // If present, a new element has been created
$firstModel = null ; // First model name
foreach ($this->config[$model->name] as $name) {
$data = array($name => $model->data[$model->name]);
// if model has relationships hasAndBelongsToMany, format data array
if(count($model->$name->hasAndBelongsToMany)) {
foreach ($model->$name->hasAndBelongsToMany as $k => $assoc) {
if(isset($data[$name][$k])) {
$data[$k] = array($k => &$data[$name][$k]);
}
}
}
// save parent/s
$run = true ;
if (empty($model->data[$model->name]['id'])) {
$model->$name->create();
} else {
// Avoid default values.
$model->$name->create(null);
}
if(!$res = $model->$name->save($data)) {
$model->validationErrors = $model->$name->validationErrors ;
// If first element has been created already, performe delete and return
if(!$first) {
$model->$firstModel->delete($id) ;
}
return false ;
}
// If it's first model on the list, get ID inserted
if($first) {
$firstModel = $name ;
if(empty($model->data[$model->name]['id'])) {
$id = $model->$name->getInsertID() ;
$model->data[$model->name]['id'] = $id;
}
if ($firstModel == "BEObject" && !empty($res["BEObject"]["user_modified"]))
$model->data[$model->name]["user_modified"] = $res["BEObject"]["user_modified"];
$first = false ;
}
}
return true ;
}
}
?>