Esempio n. 1
0
 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;
 }