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;
}
Example #2
0
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;
}