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; }
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; }
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; }
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; }
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' => ' '); 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; }
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; }