function savePlanning(&$model, $data, $time, $options = array()) { if (is_numeric($time)) { $format = $model->getDataSource()->columns['datetime']['format']; $time = date($format, $time); } $defaultOptions = array('stringOperators' => true, 'break' => true, 'absolute' => false, 'requery' => true, 'context' => null, 'dry' => false, 'validationExclude' => null); $options = array_merge($defaultOptions, (array) $options); //debug($options); if (!empty($data[$model->alias])) { $myData = $data[$model->alias]; } else { $myData = $data; } App::import('Lib', 'Operations'); if ($options['stringOperators']) { $myData = Operations::parseStringOperations($myData); } //debug($myData); $cacheData = $model->data; if (isset($myData['id'])) { $model->id = $myData['id']; } if (!empty($model->id)) { if ($options['requery']) { $model->Behaviors->attach('Containable'); $oldData = $model->findAt('first', array('conditions' => array($model->alias . '.id' => $model->id), 'time' => $time, 'contain' => array('Node'))); } else { $oldData = $cacheData; } //debug($oldData); if (isset($oldData['Node'])) { $node = $oldData['Node']; } else { $node = $model->node(null, false); $node = $node['Node']; } $newData = Operations::applyOperations($myData, $oldData[$model->alias]); //$model->validates(array('time'=>$time)); // à faire //debug($newData); $diffData = array_diff_assoc($newData, $oldData[$model->alias]); //debug($diffData); $plans = array(); $to_delete = array(); foreach ($diffData as $field => $val) { $solution = $model->getConflictSolution($val, $field, $time, null, array_merge($options, array('node' => $node))); if ($solution === false) { if ($options['break']) { return false; } else { continue; } } else { $plans = array_merge($plans, $solution['save']); $to_delete = array_merge($to_delete, $solution['delete']); } $plan = array('field' => $field, 'node_id' => $node['id'], 'active' => 1, 'value' => $val, 'date' => $time, 'absolute' => $options['absolute'], 'context' => $options['context']); if (is_array($myData[$field]) && !empty($myData[$field]['operator'])) { $plan['operation'] = $myData[$field]; } $plans[] = $plan; } //debug($this->buildPlanifiedFollowingLinks($model, $plans,$to_delete, array('dry'=>true))); if (!$options['dry']) { $this->savePlanningChanges($model, array('save' => $plans, 'delete' => $to_delete)); } else { return array('save' => $plans, 'delete' => $to_delete); } return true; } return false; }