function crayons_store_set_modifs($modifs, $return) { // sinon on bosse : toutes les modifs ont ete acceptees // verifier qu'on a tout ce qu'il faut pour mettre a jour la base // et regrouper les mises a jour par type/id foreach ($modifs as $modif) { list($type, $modele, $id, $content, $wid) = $modif; $fun = ''; // si le crayon est un MODELE avec une fonction xxx_revision associee // cas ou une fonction xxx_revision existe if (function_exists($f = $type . '_' . $modele . "_revision") or function_exists($f = $modele . "_revision") or function_exists($f = $type . "_revision")) { $fun = $f; } elseif (function_exists('lister_tables_objets_sql') and $tables_objet = lister_tables_objets_sql() and isset($tables_objet[table_objet_sql($type)])) { $fun = 'crayons_objet_modifier'; } else { switch ($type) { case 'article': $fun = 'crayons_update_article'; break; case 'breve': include_spip('action/editer_breve'); $fun = 'revisions_breves'; break; case 'forum': include_spip('inc/forum'); $fun = 'enregistre_et_modifie_forum'; break; case 'rubrique': include_spip('action/editer_rubrique'); $fun = 'revisions_rubriques'; break; case 'syndic': case 'site': include_spip('action/editer_site'); $fun = 'revisions_sites'; break; case 'document': include_spip('plugins/installer'); include_spip('inc/plugin'); if (spip_version_compare($GLOBALS['spip_version_branche'], '3.0.0alpha', '>=')) { include_spip('action/editer_document'); $fun = 'document_modifier'; } else { include_spip('inc/modifier'); $fun = 'revision_document'; } break; // cas geres de la maniere la plus standard // cas geres de la maniere la plus standard case 'auteur': case 'mot': case 'signature': case 'petition': default: include_spip('inc/modifier'); $fun = 'revision_' . $type; break; } } // si on a pas reussi on passe par crayons_update() qui fera un update sql brutal if (!$fun or !function_exists($fun)) { $fun = 'crayons_update'; // $return['$erreur'] = "$type: " . _U('crayons:non_implemente'); // break; } if (!isset($updates[$type][$fun])) { $updates[$type][$fun] = array(); } if (!isset($updates[$type][$fun][$id])) { $updates[$type][$fun][$id] = array('wdg' => array(), 'chval' => array()); } // pour reaffecter le retour d'erreur sql au cas ou $updates[$type][$fun][$id]['wdg'][] = $wid; foreach ($content as $champtable => $val) { $updates[$type][$fun][$id]['chval'][$champtable] = $val; } } // il manque une fonction de mise a jour ==> on ne fait rien ! if ($return['$erreur']) { return $return; } // hop ! mises a jour table par table et id par id foreach ($updates as $type => $idschamps) { foreach ($idschamps as $fun => $ids) { foreach ($ids as $id => $champsvaleurs) { /* cas particulier du logo dans un crayon complexe : ce n'est pas un champ de la table */ if (isset($champsvaleurs['chval']['logo'])) { spip_log('revision logo', 'crayons'); logo_revision($id, $champsvaleurs['chval'], $type, $champsvaleurs['wdg']); unset($champsvaleurs['chval']['logo']); } if (count($champsvaleurs['chval'])) { // -- revisions_articles($id_article, $c) -- spip_log("{$fun}({$id} ...)", 'crayons'); $updok = $fun($id, $champsvaleurs['chval'], $type, $champsvaleurs['wdg']); // Renvoyer erreur si update base distante echoue, on ne regarde pas les updates base local car ils ne renvoient rien list($distant, $table) = distant_table($type); if ($distant and !$updok) { $return['$erreur'] = "{$type}: " . _U('crayons:update_impossible'); } } } } } return $return; }
function crayons_store_set_modifs($modifs, $return) { // sinon on bosse : toutes les modifs ont ete acceptees // verifier qu'on a tout ce qu'il faut pour mettre a jour la base // et regrouper les mises a jour par type/id foreach ($modifs as $modif) { list($type, $modele, $id, $content, $wid) = $modif; // MODELE $fun = ''; if (function_exists($f = $type.'_'. $modele . "_revision") OR function_exists($f = $modele . "_revision") OR function_exists($f = $type . "_revision")) $fun = $f; else switch($type) { case 'article': $fun = 'crayons_update_article'; break; case 'breve': include_spip('action/editer_breve'); $fun = 'revisions_breves'; break; case 'forum': include_spip('inc/forum'); $fun = 'enregistre_et_modifie_forum'; break; case 'rubrique': include_spip('action/editer_rubrique'); $fun = 'revisions_rubriques'; break; case 'syndic': case 'site': include_spip('action/editer_site'); $fun = 'revisions_sites'; break; // cas geres de la maniere la plus standard case 'auteur': case 'document': case 'mot': case 'signature': case 'petition': default: include_spip('inc/modifier'); $fun = 'revision_'.$type; break; } if (!$fun or !function_exists($fun)) { $fun = 'crayons_update'; // $return['$erreur'] = "$type: " . _U('crayons:non_implemente'); // break; } if (!isset($updates[$type][$fun])) { $updates[$type][$fun] = array(); } if (!isset($updates[$type][$fun][$id])) { $updates[$type][$fun][$id] = array('wdg'=>array(), 'chval'=>array()); } // pour reaffecter le retour d'erreur sql au cas ou $updates[$type][$fun][$id]['wdg'][] = $wid; foreach ($content as $champtable => $val) { $updates[$type][$fun][$id]['chval'][$champtable] = $val; } } // il manque une fonction de mise a jour ==> on ne fait rien ! if ($return['$erreur']) return $return; // hop ! mises a jour table par table et id par id foreach ($updates as $type => $idschamps) foreach ($idschamps as $fun => $ids) { foreach ($ids as $id => $champsvaleurs) { /* cas particulier du logo dans un crayon complexe : ce n'est pas un champ de la table */ if (isset($champsvaleurs['chval']['logo'])) { spip_log('revision logo', 'crayons'); logo_revision($id, $champsvaleurs['chval'], $type, $champsvaleurs['wdg']); unset($champsvaleurs['chval']['logo']); } if (count($champsvaleurs['chval'])) { // -- revisions_articles($id_article, $c) -- spip_log("$fun($id ...)", 'crayons'); $updok = $fun($id, $champsvaleurs['chval'], $type, $champsvaleurs['wdg']); // Renvoyer erreur si update base distante echoue, on ne regarde pas les updates base local car ils ne renvoient rien list($distant,$table) = distant_table($type); if ($distant AND !$updok) $return['$erreur'] = "$type: " . _U('crayons:update_impossible'); } } } return $return; }