Пример #1
0
 function mergeFindOpt($opt)
 {
     $options = func_get_args();
     array_shift($options);
     App::import('Lib', 'Newsletter.SetMulti');
     foreach ($options as $opt2) {
         $opt = SetMulti::merge2($opt, $opt2);
     }
     return $opt;
 }
Пример #2
0
 function _preprocessUpdatePlanning($data)
 {
     $this->Character->Planning->recursive = -1;
     $format = $this->getDataSource()->columns['datetime']['format'];
     $existing = array();
     if (!empty($data['Path']['steps'])) {
         $steps = $data['Path']['steps'];
     }
     if (!empty($data['Path']['id'])) {
         if (empty($steps)) {
             $path = $this->find('first', array('conditions' => array('id' => $data['Path']['id']), 'recursive' => -1));
             if (!empty($path)) {
                 $steps = $path['Path']['steps'];
             }
         }
         $contextPrefix = 'Path' . $data['Path']['id'] . 'Step';
         $existing = $this->Character->Planning->find('all', array('conditions' => array('context Like' => $contextPrefix . '%')));
     } else {
         $contextPrefix = 'Path%pathId%Step';
     }
     $operations = array('save' => array(), 'delete' => $existing);
     App::import('Lib', 'SetMulti');
     foreach ($steps as $key => $step) {
         $op = $this->Character->savePlanning(array('tile_id' => $step['tile_id']), date($format, strtotime($data['Path']['start_time']) + $step['time']), array('dry' => true, 'context' => $contextPrefix . $key, 'validationExclude' => $existing));
         if ($op === false) {
             return false;
         }
         $operations = SetMulti::merge2($operations, $op);
     }
     //debug($operations);
     $linksModif = $this->Character->buildPlanifiedFollowingLinks($operations['save'], $operations['delete'], array("dry" => true));
     //debug($linksModif);
     if ($linksModif === false) {
         return false;
     }
     $operations['linksModif'] = $linksModif;
     return $operations;
 }
Пример #3
0
 function merge2($arr1, $arr2 = null)
 {
     $args = func_get_args();
     $r = (array) current($args);
     while (($arg = next($args)) !== false) {
         foreach ((array) $arg as $key => $val) {
             if (is_int($key)) {
                 $r[] = $val;
             } elseif (is_array($val) && isset($r[$key]) && is_array($r[$key])) {
                 $r[$key] = SetMulti::merge2($r[$key], $val);
             } else {
                 $r[$key] = $val;
             }
         }
     }
     return $r;
 }
Пример #4
0
 function getIneritedFields(&$model, $data, $options = array())
 {
     $defOpt = array('fields' => null, 'fetchAssociations' => true);
     $opt = array_merge($defOpt, $options);
     //debug($opt);
     if (!empty($this->settings[$model->alias]['fields']) && is_array($data)) {
         App::import('Lib', 'SetMulti');
         if (isset($data[$model->alias])) {
             $myData =& $data[$model->alias];
         } else {
             $myData =& $data;
         }
         $originalData = $myData;
         $fieldsOpt = $this->_formatFieldsOpt($this->settings[$model->alias]['fields']);
         if (!empty($opt['fields'])) {
             $fieldsOpt = array_intersect_key($fieldsOpt, array_flip($opt['fields']));
         }
         $fieldsOpt = array_intersect_key($fieldsOpt, array_merge(array_filter($myData, 'is_null'), array_filter($myData, 'is_array')));
         if (!empty($fieldsOpt)) {
             $fieldsOpt = SetMulti::group($fieldsOpt, 'alias');
             //debug($fieldsOpt);
             foreach ($fieldsOpt as $alias => $iopt) {
                 $hdata = null;
                 //debug($model->{$alias}->name ."==".$model->name);
                 if (isset($model->{$alias}) && $model->{$alias}->name == $model->name && $model->Behaviors->attached('Tree')) {
                     //tree inerit
                     $d = $myData;
                     if (!isset($d['lft']) || !isset($d['rght'])) {
                         $d = $model->read(null, $myData['id']);
                     }
                     $model->recursive = -1;
                     $tmp = $this->settings[$model->alias]['fetch'];
                     $this->settings[$model->alias]['fetch'] = false;
                     $res = $model->find('all', array('fields' => array_merge(array('id'), array_keys($iopt)), 'conditions' => array('lft' > $d['lft'], 'rght' < $d['rght']), 'order' => 'lft DESC'));
                     //debug($res);
                     $this->settings[$model->alias]['fetch'] = $tmp;
                     $hdata = array();
                     foreach ($res as $item) {
                         $hdata = array_merge($hdata, array_filter($item[$model->alias]));
                     }
                     //debug($hdata);
                 } else {
                     if (isset($data[$alias])) {
                         $hdata = $data[$alias];
                     } elseif (isset($data[$model->alias][$alias])) {
                         $hdata = $data[$model->alias][$alias];
                     }
                     //debug($hdata);
                     if (isset($model->{$alias}) && $model->{$alias}->Behaviors->attached('Inheritor') && !empty($hdata)) {
                         $hdata = $model->{$alias}->getIneritedFields($hdata, array('fields' => array_keys($iopt), 'fetchAssociations' => false));
                     }
                 }
                 foreach ($iopt as $key => $val) {
                     if (!isset($hdata[$key])) {
                         $myData[$key] = null;
                     } elseif (is_array($myData[$key])) {
                         if (!empty($hdata[$key])) {
                             $myData[$key] = SetMulti::merge2($myData[$key], $hdata[$key]);
                         }
                     } else {
                         $myData[$key] = $hdata[$key];
                     }
                 }
                 if ($opt['fetchAssociations']) {
                     if (!empty($model->lastAssociations['belongsTo'])) {
                         $associationFields = SetMulti::extractKeepKey('foreignKey', $model->lastAssociations['belongsTo']);
                         $toFetch = array_intersect($associationFields, array_keys($iopt));
                         foreach ($toFetch as $aalias => $field) {
                             if ($originalData[$field] != $myData[$field]) {
                                 $findOpt = $model->lastAssociations['belongsTo'][$aalias];
                                 if (isset($model->{$aalias})) {
                                     $amodel = $model->{$aalias};
                                 } else {
                                     $amodel = ClassRegistry::init($findOpt['className']);
                                 }
                                 unset($findOpt['className'], $findOpt['foreignKey']);
                                 $findOpt['conditions'][$amodel->alias . '.' . $amodel->primaryKey] = $myData[$field];
                                 //debug($findOpt);
                                 $res = $amodel->find('first', $findOpt);
                                 $amodel->Behaviors->attach('Util');
                                 $res = $amodel->dataToContainedRelations($res);
                                 $data[$aalias] = $res;
                             }
                         }
                     }
                 }
             }
         }
     }
     return $data;
 }
Пример #5
0
 function buildPlanifiedFollowingLinks(&$model, $add = array(), $delete = array(), $options = array())
 {
     $defaultOptions = array('dry' => false);
     $options = array_merge($defaultOptions, (array) $options);
     if ($model->Behaviors->attached('NodeLinked')) {
         $allModif = array();
         if (!empty($add)) {
             foreach ($add as $key => $plan) {
                 if (isset($plan['Planning'])) {
                     $plan = $plan['Planning'];
                 }
                 $allModif[] = array('Planning' => $plan, 'Action' => array('name' => 'Save', 'at' => $key));
             }
         }
         if (!empty($delete)) {
             foreach ($delete as $plan) {
                 if (!is_array($plan)) {
                     $plan = $model->Planning->read(null, $plan);
                     // aaaaaaaaaaarrrrrrrrrgggggggggggg, utilise probablement trop de ressources
                 }
                 if (isset($plan['Planning'])) {
                     $plan = $plan['Planning'];
                 }
                 $allModif[] = array('Planning' => $plan, 'Action' => 'Delete');
             }
         }
         $applicableModif = array();
         foreach ($allModif as $modif) {
             $field = $modif['Planning']['field'];
             $applicable = false;
             if (isset($applicableModif[$field])) {
                 $applicable = true;
             } else {
                 $opt = $model->getFieldFollowOptions($modif['Planning']['field']);
                 if (!empty($opt)) {
                     $applicableModif[$field]['Options'] = $opt;
                     $applicable = true;
                 }
             }
             if ($applicable) {
                 $modif['Options'] = $opt;
                 if ($opt['owner'] == 'both') {
                     $applicableModif[$field]['owner'][] = $modif;
                     $applicableModif[$field]['owned'][] = $modif;
                 } else {
                     $applicableModif[$field][$opt['owner']][] = $modif;
                 }
             }
         }
         //debug($applicableModif);
         unset($allModif, $modif, $opt, $plan, $add, $delete, $field, $applicable);
         // free ressources
         $operations = array();
         App::import('Lib', 'SetMulti');
         foreach ($applicableModif as $field => $fieldGroup) {
             foreach ($fieldGroup as $owner => $modifs) {
                 if ($owner != 'Options') {
                     $add = $this->_buildFollowLinksPlanGroup(&$model, $owner, $fieldGroup['Options'], $modifs);
                     if ($add === false) {
                         return false;
                     }
                     $operations = SetMulti::merge2($operations, $add);
                 }
             }
         }
         if (!$options['dry']) {
             if (!empty($operations['save'])) {
                 foreach ($operations['save'] as $link) {
                     $model->NodeLink->create();
                     if (!$model->NodeLink->save($link)) {
                         return false;
                     }
                 }
             }
             $deleteIds = array();
             if (!empty($operations['delete'])) {
                 foreach ($operations['delete'] as $link) {
                     $deleteIds[] = $link['id'];
                 }
                 $model->NodeLink->deleteAll(array('NodeLink.id' => $deleteIds));
             }
         } else {
             return $operations;
         }
     }
     return false;
 }
 function _boxSeparator($opt)
 {
     $defaultOpt = array('tr' => array('class' => array('nltr_sep')), 'td' => array(), 'content' => '&nbsp');
     if (!is_array($opt)) {
         $opt = array('content' => $opt);
     }
     App::import('Lib', 'Newsletter.SetMulti');
     $opt = SetMulti::merge2($defaultOpt, $opt);
     $result_html = '<tr' . $this->_parseAttributes($opt['tr']) . '>' . "\n";
     $result_html .= '	<td' . $this->_parseAttributes($opt['td']) . '>' . "\n";
     $result_html .= '		' . $opt['content'] . "\n";
     $result_html .= '	</td>' . "\n";
     $result_html .= '</tr>' . "\n";
     return $result_html;
 }
Пример #7
0
 function _updateTile($data, $x, $y, $zone_id, $tiles, $maxRange, $actions = null)
 {
     App::import('Lib', 'SetMulti');
     $modifs = array();
     $acts = $this->updateActions;
     if (!empty($actions)) {
         $acts = array_intersect_key($acts, set::normalize($actions));
     }
     foreach ($acts as $name => $act) {
         if ($act['range'] <= $maxRange) {
             if (SetMulti::testCond($act['target'], $data)) {
                 if (empty($act['callback'])) {
                     $callBack = array($this, 'update_' . $name);
                 } else {
                     $callBack = $act['callback'];
                 }
                 $modif = call_user_func($callBack, $data, $x, $y, $zone_id, $tiles);
                 $modifs = SetMulti::merge2($modifs, $modif);
             }
         }
     }
     return $modifs;
 }