function action_instituer_forum_sujet_dist()
{
    static $statuts_sujet = array('verrou_on' => 'verrouille', 'verrou_off' => 'verrouille', 'resolu_on' => 'resolu', 'resolu_off' => 'resolu');
    $securiser_action = charger_fonction('securiser_action', 'inc');
    $args = $securiser_action();
    list($objet, $id_forum, $action) = explode('/', $args);
    if (!$action or !array_key_exists($action, $statuts_sujet)) {
        return;
    }
    if ($id_forum = intval($id_forum)) {
        $titre = sql_getfetsel('titre', 'spip_forum', 'id_forum=' . sql_quote($id_forum));
        $pattern = '_' . $statuts_sujet[$action] . '_';
        // On supprime systematique le statut demande. Ainsi si l'action demandee est d'enlever un
        // statut c'est fait sinon on evite de rajouter le meme statut
        $titre_modifie = trim(preg_replace(",{$pattern},UimsS", '', $titre));
        // Si l'action demandee est de positionner un nouveau statut on le rajoute au titre
        if ($action == 'verrou_on' or $action == 'resolu_on') {
            $titre_modifie .= $pattern;
        }
        sql_updateq('spip_forum', array('titre' => $titre_modifie), 'id_forum =' . sql_quote($id_forum));
        // Invalider les pages comportant ce forum
        include_spip('inc/invalideur');
        suivre_invalideur("id='id_forum/{$id_forum}'");
    }
}
function formulaires_editer_mot_article_traiter_dist($id_article = 'new', $id_groupe = '', $retour = '')
{
    $message = array('editable' => true, 'message_ok' => '');
    $id_mot_ancien = sql_getfetsel('mot.id_mot', 'spip_mots as mot left join spip_mots_liens as mots_liens ON (mot.id_mot=mots_liens.id_mot)', 'mots_liens.id_objet=' . intval($id_article) . ' AND mots_liens.objet = "article" AND mot.id_groupe=' . intval($id_groupe));
    include_spip('action/editer_liens');
    // si aucun mot selectionne on delie le mot de ce groupe
    if (!($id_mot = _request('id_mot'))) {
        objet_dissocier(array("mot" => $id_mot_ancien), array("article" => $id_article));
    } else {
        if ($id_mot_ancien != $id_mot) {
            // on delie l'ancien mot
            objet_dissocier(array("mot" => $id_mot_ancien), array("article" => $id_article));
            // on lie le nouveau
            objet_associer(array("mot" => $id_mot), array("article" => $id_article));
        }
    }
    // on invalide le cache
    include_spip('inc/invalideur');
    suivre_invalideur("id='id_article/{$id_article}'");
    if ($retour) {
        include_spip('inc/headers');
        $message .= redirige_formulaire($retour);
    }
    return $message;
}
示例#3
0
function formulaires_editer_balade_traiter_dist($id_collection = 'new', $retour = '')
{
    $message = array();
    // récupérer le rang des articles de la balade et le mettre à jour
    $rangs = _request('rang');
    foreach ($rangs as $rang => $id_article) {
        $rang = $rang + 1;
        $ok = sql_updateq('spip_collections_liens', array('rang' => intval($rang)), "objet='article' AND id_objet = {$id_article}");
    }
    // éditer le gis associé
    if ($action_editer = charger_fonction("editer_gis", 'action', true)) {
        list($id, $err) = $action_editer(_request('id_gis'));
    }
    // ne pas polluer l'url de retour avec des paramètres inutiles
    set_request('id_gis');
    set_request('id_objet');
    // invalider le cache
    include_spip('inc/invalideur');
    suivre_invalideur("id='gis/{$id}");
    // rediriger sur l'url de retour passée en paramètre
    if ($retour) {
        include_spip('inc/headers');
        $message['redirect'] = redirige_formulaire($retour);
    }
    return $message;
}
示例#4
0
function action_supprimer_rubrique($r)
{
	list(,,$id_rubrique) = $r;
	sql_delete("spip_rubriques", "id_rubrique=$id_rubrique");
	sql_delete("spip_mots_rubriques", "id_rubrique=$id_rubrique");
	// Les admin restreints qui n'administraient que cette rubrique
	// deviennent redacteurs
	// (il y a sans doute moyen de faire ca avec un having)

	$q = sql_select("id_auteur", "spip_auteurs_rubriques", "id_rubrique=$id_rubrique");

	while ($r = sql_fetch($q)) {
		$id_auteur = $r['id_auteur'];
		sql_delete("spip_auteurs_rubriques", "id_rubrique=$id_rubrique AND id_auteur=$id_auteur");
		$n = sql_countsel("spip_auteurs_rubriques", "id_auteur=$id_auteur");
		if (!$n)
			sql_updateq("spip_auteurs", array("statut" => '1comite'), "id_auteur=$id_auteur");
	}
	// menu_rubriques devra recalculer
	effacer_meta("date_calcul_rubriques");

	// Une rubrique supprimable n'avait pas le statut "publie"
	// donc rien de neuf pour la rubrique parente
	include_spip('inc/rubriques');
	calculer_langues_rubriques();

	// invalider les caches marques de cette rubrique
	include_spip('inc/invalideur');
	suivre_invalideur("id='id_rubrique/$id_rubrique'");
}
示例#5
0
/**
 * Effacer une rubrique
 *
 * http://doc.spip.org/@action_supprimer_dist
 *
 * @param null $id_rubrique
 * @return void
 */
function action_supprimer_rubrique_dist($id_rubrique = null)
{
    if (is_null($id_rubrique)) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $id_rubrique = $securiser_action();
    }
    if (intval($id_rubrique)) {
        sql_delete("spip_rubriques", "id_rubrique=" . intval($id_rubrique));
        // Les admin restreints qui n'administraient que cette rubrique
        // deviennent redacteurs
        // (il y a sans doute moyen de faire ca avec un having)
        $q = sql_select("id_auteur", "spip_auteurs_liens", "objet='rubrique' AND id_objet=" . intval($id_rubrique));
        while ($r = sql_fetch($q)) {
            $id_auteur = $r['id_auteur'];
            // degrader avant de supprimer la restriction d'admin
            // section critique sur les droits
            $n = sql_countsel("spip_auteurs_liens", "objet='rubrique' AND id_objet!=" . intval($id_rubrique) . " AND id_auteur=" . intval($id_auteur));
            if (!$n) {
                include_spip('action/editer_auteur');
                auteurs_set($id_auteur, array("statut" => '1comite'));
            }
            sql_delete("spip_auteurs_liens", "objet='rubrique' AND id_objet=" . intval($id_rubrique) . " AND id_auteur=" . intval($id_auteur));
        }
        // menu_rubriques devra recalculer
        effacer_meta("date_calcul_rubriques");
        // Une rubrique supprimable n'avait pas le statut "publie"
        // donc rien de neuf pour la rubrique parente
        include_spip('inc/rubriques');
        calculer_langues_rubriques();
        // invalider les caches marques de cette rubrique
        include_spip('inc/invalideur');
        suivre_invalideur("id='rubrique/{$id_rubrique}'");
    }
}
function formulaires_configurer_forums_participants_traiter_dist()
{
    include_spip('inc/config');
    include_spip('inc/meta');
    $purger_skel = false;
    if ($accepter_forum = _request('forums_publics') and $accepter_forum != $GLOBALS['meta']["forums_publics"]) {
        $purger_skel = true;
        $accepter_forum = substr($accepter_forum, 0, 3);
    }
    // Appliquer les changements de moderation forum
    // forums_publics_appliquer : futur, saufnon, tous
    if (in_array($appliquer = _request('forums_publics_appliquer'), array('tous', 'saufnon'))) {
        $sauf = $appliquer == 'saufnon' ? "accepter_forum != 'non'" : '';
        sql_updateq('spip_articles', array('accepter_forum' => $accepter_forum), $sauf);
    }
    if ($accepter_forum == 'abo') {
        ecrire_meta('accepter_visiteurs', 'oui');
    }
    appliquer_modifs_config();
    if ($purger_skel) {
        include_spip('inc/invalideur');
        suivre_invalideur("forum/*");
    }
    return array('message_ok' => _T('config_info_enregistree'));
}
function action_instituer_langue_rubrique_dist() {

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();
	$changer_lang = _request('changer_lang');

	list($id_rubrique, $id_parent) = preg_split('/\W/', $arg);

	if ($changer_lang
	AND $id_rubrique>0
	AND $GLOBALS['meta']['multi_rubriques'] == 'oui'
	AND ($GLOBALS['meta']['multi_secteurs'] == 'non' OR $id_parent == 0)) {
		if ($changer_lang != "herit")
			sql_updateq('spip_rubriques', array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "id_rubrique=$id_rubrique");
		else {
			if ($id_parent == 0)
				$langue_parent = $GLOBALS['meta']['langue_site'];
			else {
				$langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=$id_parent");
			}
			sql_updateq('spip_rubriques', array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "id_rubrique=$id_rubrique");
		}
		include_spip('inc/rubriques');
		calculer_langues_rubriques();

		// invalider les caches marques de cette rubrique
		include_spip('inc/invalideur');
		suivre_invalideur("id='id_rubrique/$id_rubrique'");
	}
}
示例#8
0
function instituer_un_forum($statut,$row){

	$id_forum = $row['id_forum'];
	$old = $row['statut'];
 // rien a faire si pas de changement de statut
 	if ($old==$statut)
		return;

	// changer le statut de toute l'arborescence dependant de ce message
	$id_messages = array($id_forum);
	while ($id_messages) {
		sql_updateq("spip_forum", array("statut" => $statut), sql_in("id_forum", $id_messages) ." AND statut = '$old'");

		$id_messages = array_map('reset',sql_allfetsel("id_forum", "spip_forum", sql_in("id_parent", $id_messages)));
	}

	// Notifier de la publication du message, s'il etait 'prop'
	if ($old=='prop' AND $statut=='publie') {
		if ($notifications = charger_fonction('notifications', 'inc')) {
			$notifications('forumvalide', $id_forum);
		}
	}

	// mettre a jour la date du thread
	// si publie, ou que tout le thread est prive,
	// mettre la date du thread a 'maintenant' (date de publi du message)
	// sinon prendre la date_heure du dernier message public
	// c'est imparfait dans le cas ou les crayons ont ete utilises pour modifier ce message entre temps
	// car la date_thread aurait cette derniere date alors que pas le message
	// mais c'est au mieux de ce que l'on peut faire quand on depublie un SPAM ou supprime un message
	if ($statut=='publie' OR $old=='publie') {
		if ($statut=='publie'
			OR !($date_thread = sql_getfetsel("date_heure", "spip_forum", "statut='publie' AND id_thread=".$row['id_thread'], "", "date_heure DESC","0,1"))){
			$date_thread = date('Y-m-d H:i:s');
		}
		sql_updateq("spip_forum", array("date_thread" => $date_thread), "id_thread=".$row['id_thread']);
	}

	// invalider les pages comportant ce forum
	include_spip('inc/invalideur');
	include_spip('inc/forum');
	$index_forum = calcul_index_forum($row['id_article'], $row['id_breve'], $row['id_rubrique'], $row['id_syndic']);
	suivre_invalideur("id='id_forum/$index_forum'");

	// Reindexation du thread (par exemple)
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_forum',
				'id_objet' => $id_forum,
				'action' => 'instituer',
			),
			'data' => null
		)
	);
}
示例#9
0
/**
 * Traiter
 *
 * @param int $id_objet
 * @param string $objet
 * @return array
 */
function formulaires_activer_forums_objet_traiter_dist($id_objet, $objet = 'article')
{
    include_spip('inc/autoriser');
    if ($objet == 'article' and autoriser('modererforum', $objet, $id_objet)) {
        $statut = _request('accepter_forum');
        include_spip('base/abstract_sql');
        sql_updateq("spip_articles", array("accepter_forum" => $statut), "id_article=" . intval($id_objet));
        if ($statut == 'abo') {
            ecrire_meta('accepter_visiteurs', 'oui');
        }
        include_spip('inc/invalideur');
        suivre_invalideur("id='{$objet}/{$id_objet}'");
    }
    return array('message_ok' => _T('config_info_enregistree'), 'editable' => true);
}
示例#10
0
function action_description_outil_post($index) {
	global $metas_vars;
	if(defined('_SPIP19300')) $connect_id_auteur = $GLOBALS['auteur_session']['id_auteur'];
		else global $connect_id_auteur;
cs_log("Debut : action_description_outil_post($index) - On modifie la(les) variable(s) dans la base");

	// on recupere dans le POST le nom des variables a modifier et le nom de l'outil correspondant
	$variables = unserialize(urldecode(corriger_caracteres(_request('variables'))));
	$outil = corriger_caracteres(_request('outil'));
//cs_log($variables, '$variables = ');
cs_log($metas_vars, 'metas_vars :');
	// besoin des outils pour l'autorisation de modifier les variables
	include_spip('cout_utils');
	include_spip('config_outils');
	global $outils, $cs_variables;
	// on traite chaque variable
	foreach($variables as $var) if(autoriser('configurer', 'variable', 0, NULL, array('nom'=>$var, 'outil'=>$outils[$outil]))) {
		// on recupere dans le POST la nouvelle valeur de la variable
		$final = corriger_caracteres(_request($var));
		if (in_array($var, $metas_vars['_nombres'])) $final = intval($final);
		spip_log("Outil du Couteau Suisse ($outil). Demande de modification sur une variable par l'auteur id=$connect_id_auteur : %$var% = $final");
		// et on modifie les metas !
		if(!isset($cs_variables[$var]['externe'])) $metas_vars[$var] = $final;
		if(isset($cs_variables[$var]['action'])) {
			$action = str_replace('%s', $final, $cs_variables[$var]['action']);
			spip_log("Outil du Couteau Suisse ($outil). Demande d'action sur cette variable : ".$action);
			eval($action);
		}
			
	} else 
		spip_log("Outil du Couteau Suisse n°$index. Modification interdite de la variable %$var% par l'auteur id=$connect_id_auteur !!");
//cs_log($metas_vars, " -- metas_vars = ");
	ecrire_meta('tweaks_variables', serialize($metas_vars));
	ecrire_metas();

cs_log(" -- donc, reinitialisation forcee !");
	// on reinitialise tout, au cas ou ...
	include_spip('inc/invalideur');
	suivre_invalideur("1"); # tout effacer
	purger_repertoire(_DIR_SKELS);
	purger_repertoire(_DIR_CACHE);
	include_spip('cout_utils');
	cs_initialisation(true);
cs_log(" FIN : action_description_outil_post(Array($index)) - Reinitialisation forcee terminee.");
}
示例#11
0
function formulaires_configurer_visiteurs_traiter_dist()
{
    $res = array('editable' => true);
    // Modification du reglage accepter_inscriptions => vider le cache
    // (pour repercuter la modif sur le panneau de login)
    if ($i = _request('accepter_visiteurs') and $i != $GLOBALS['meta']['accepter_visiteurs']) {
        include_spip('inc/invalideur');
        suivre_invalideur("1");
        # tout effacer
    }
    foreach (array("accepter_visiteurs") as $m) {
        if (!is_null($v = _request($m))) {
            ecrire_meta($m, $v == 'oui' ? 'oui' : 'non');
        }
    }
    $res['message_ok'] = _T('config_info_enregistree');
    return $res;
}
示例#12
0
function action_crayons_dist()
{
    include_spip('action/crayons_store');
    $r = crayons_store();
    // soit exit, soit un redirect gere par SPIP
    if (trim($r['$erreur'])) {
        include_spip('inc/minipres');
        echo minipres($r['$erreur']);
        exit;
    }
    // S'il n'y a pas de redirect, on est mal : eviter toutefois la page blanche
    if (!_request('redirect')) {
        die('OK');
    }
    // Invalider le cache parce que bon... a priori on est dans une
    // interface qui va avoir besoin de refresh
    include_spip('inc/invalideur');
    suivre_invalideur('1');
}
示例#13
0
function action_editer_signatures_post($r)
{
	$id = $id_article = intval($r[1]);
	if ($r[2] == 'A')
	  $id = 0;
	else $id_article = 0;

	if ($id < 0){
		$id = 0 - $id;
		sql_updateq("spip_signatures", array("statut" => 'poubelle'), "id_signature=$id");

	} elseif ($id > 0){
		$row = sql_fetsel('*', 'spip_signatures', "id_signature=$id"); 
		if ($row['statut']=='poubelle')
			sql_updateq("spip_signatures", array("statut" => 'publie'), "id_signature=$id");
		else {
			include_spip('formulaires/signature');
			include_spip('inc/texte');
			
			$id_article = $row['id_article'];
			
			$url = generer_url_entite_absolue($id_article, 'article','','',true);
			if (signature_a_confirmer($id_article, $url, $row['nom_email'], $row['ad_email'], $row['nom_site'], $row['url_site'], $row['message'], $row['lang'], $row['statut']))
				sql_updateq("spip_signatures", array("date_time" => date('Y-m-d H:i:s')), "id_signature=$id");
			$id = 0;
		}
	} elseif ($id_article) {
		action_editer_signatures_relance($id_article);
	}

	// Invalider les pages ayant trait aux petitions
	if (!$id_article AND $id) {
		$id_article = sql_getfetsel("id_article", "spip_signatures", "id_signature=$id");
		if ($id_article) {
			include_spip('inc/invalideur');
			suivre_invalideur("id='varia/pet$id_article'");
		}
	}

	# cette requete devrait figurer dans l'optimisation
	sql_delete("spip_signatures", "NOT (statut='publie' OR statut='poubelle') AND date_time<DATE_SUB(NOW(),INTERVAL 10 DAY)");
}
示例#14
0
function formulaires_lier_album_traiter($id_article)
{
    $id_collection = _request('pid_objet');
    include_spip('action/editer_liens');
    if (autoriser('lierobjet', 'collection', $id_collection)) {
        $rang = sql_countsel('spip_collections_liens', 'id_collection=' . intval($id_collection));
        $association = objet_associer(array('collection' => $id_collection), array('article' => $id_article), array('id_auteur' => $GLOBALS['visiteur_session']['id_auteur'] ? $GLOBALS['visiteur_session']['id_auteur'] : 0, 'rang' => $rang + 1));
    }
    if (!$association) {
        return $res['message_erreur'] = _T('collection:erreur_association_collection');
    } else {
        $organiser = charger_fonction('collection_organiser_rangs', 'inc');
        $organiser($id_collection);
        include_spip('inc/invalideur');
        suivre_invalideur('1');
    }
    $message['editable'] = true;
    $message['message_ok'] = '<script type="text/javascript">if (window.jQuery) ajaxReload("albums");</script>';
    return $message;
}
示例#15
0
/**
 * Fonction d'ajout des versions dans la file d'attente
 *
 * @param int $id_document l'id du document original
 * @param string $objet
 * @param int $id_objet
 */
function action_zencoder_notification()
{
    include_spip('inc/config');
    include_spip('inc/renseigner_document');
    $id_document = _request('id_document');
    $api_key = lire_config('zencoder/api_key');
    spip_log('notification start', 'zencoder');
    // Catch notification
    $notification = json_decode(trim(file_get_contents('php://input')), true);
    spip_log($notification, 'zencoder');
    // Check output/job state
    if ($notification['output']['state'] == 'finished') {
        spip_log('notification job finished', 'zencoder');
        $file = $notification['output']['url'];
        if ($file) {
            $ajouter_documents = charger_fonction('ajouter_documents', 'action');
            $copie_local = charger_fonction('copier_local', 'action');
            spip_log('notification job file' . $file, 'zencoder');
            set_request('joindre_distant', true);
            set_request('url', $file);
            include_spip('inc/joindre_document');
            $files = joindre_trouver_fichier_envoye();
            $nouveaux_doc = $ajouter_documents('new', $files, 'document', $id_document, 'conversion');
            $copie_local($nouveaux_doc[0]);
            /**
             * Invalidation du cache
             */
            include_spip('inc/invalideur');
            suivre_invalideur("0", true);
        }
    } elseif ($notification['output']['state'] == "cancelled") {
        spip_log('canceled' . print_r($notification), 'zencoder');
    } else {
        spip_log('error' . print_r($notification), 'zencoder');
    }
    return;
}
示例#16
0
function action_regler_moderation_dist()
{
	include_spip('inc/autoriser');

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	if (!preg_match(",^\W*(\d+)$,", $arg, $r)) {
		spip_log("action_regler_moderation_dist $arg pas compris");
		return;
	}

	$id_article = $r[1];
	if (!autoriser('modererforum', 'article', $id_article))
		return;

	$statut = _request('change_accepter_forum');
	sql_updateq("spip_articles", array("accepter_forum" => $statut), "id_article=". $id_article);
	if ($statut == 'abo') {
		ecrire_meta('accepter_visiteurs', 'oui');
	}
	include_spip('inc/invalideur');
	suivre_invalideur("id='id_forum/a$id_article'");
}
示例#17
0
function formulaires_upload_traiter_dist($objet, $id_objet, $fond_documents){
	$res = array('editable'=>' ', 'message_ok'=>'');

	$invalider = false;
	$type = objet_type($objet);
	$res['message_ok'] = "";
	$compteur=0;

	// titrer des documents ?
	if (is_array(_request('ref'))) {
		foreach (_request('ref') as $ref) {
		$ref = intval($ref);
			if ($titre = _request("titrer_$ref")) {
			if (formulaireupload_verifier_doc_liaison($ref,$id_objet,$type))
				sql_updateq('spip_documents', array('titre' => $titre) ,'id_document='.$ref);         
			}
		}     
	}

	// supprimer des documents ?   
	if (is_array(_request('supprimer'))) {
	foreach (_request('supprimer') as $supprimer) {
		if ($supprimer = intval($supprimer)) {
			include_spip('inc/autoriser');
		if (formulaireupload_verifier_doc_liaison($supprimer,$id_objet,$type)) {
			sql_delete('spip_documents_liens', 'id_document='.$supprimer);
				$supprimer_document = charger_fonction('supprimer_document','action');
				$supprimer_document($supprimer);
				$invalider = true;
				$compteur++; 			
			spip_log("supprimer document ($type)".$supprimer, 'upload');
		} 			
		}
  	}
	$res['message_ok'] .= _T("formupload:msg_doc_deleted",array("compteur"=>$compteur))."<br />";
	}

	// Ajouter un document (cf plugins-dist/medias)
	include_spip('inc/joindre_document');
	$files = joindre_trouver_fichier_envoye();

	if (is_array($files)) {     
	$compteur = 0; 

	// gestion des quotas ?
	$quota = intval(lire_config("formulaireupload/files_quota"));
	$quota_left = 100;
	if ($quota>0) {
			if ($res_nb_objet = sql_select('id_document', 'spip_documents_liens', array("objet = '$type'",'id_objet='.intval($id_objet))))
						$nb_objet = sql_count($res_nb_objet);
			$quota_left = $quota - $nb_objet;  
			if ($quota_left<1 OR $quota_left<count($files)) 
				$res['message_ok'] .=  _T("formupload:msg_doc_added_max",array("max"=>$quota))."<br />";

		// on reduit les fichiers proposés par le quota restant       
			array_splice($files, $quota_left); 
    }


	// upload des fichiers
	if ($quota_left>0) {
		$ajouter_documents = charger_fonction('ajouter_documents', 'action');
		$nouveaux_doc = $ajouter_documents($id_document,$files,$objet,$id_objet,'document');

		$compteur = count($nouveaux_doc);
	}
	/* A verifier:
		- securite : verifier les extenxions (si forcing)

	*/
		$invalider = true;
		if ($compteur>0)
		$res['message_ok'] .= _T("formupload:msg_doc_added",array("compteur"=>$compteur));
	}

	if ($invalider) {
		include_spip('inc/invalideur');
		suivre_invalideur("0",true);
		spip_log('invalider', 'upload');
	}

	return $res;
}
/**
 * Modifier une rubrique en base
 *
 * @param int $id_rubrique
 *     Identifiant de la rubrique modifiée
 * @param array|null $set
 *     Tableau qu'on peut proposer en lieu et place de _request()
 * @return bool|string
 *     - false  : Aucune modification, aucun champ n'est à modifier
 *     - chaîne vide : Vide si tout s'est bien passé
 *     - chaîne : Texte d'un message d'erreur
 */
function rubrique_modifier($id_rubrique, $set = null)
{
    include_spip('inc/autoriser');
    include_spip('inc/filtres');
    include_spip('inc/modifier');
    $c = collecter_requests(objet_info('rubrique', 'champs_editables'), array('id_parent', 'confirme_deplace'), $set);
    if ($err = objet_modifier_champs('rubrique', $id_rubrique, array('data' => $set, 'nonvide' => array('titre' => _T('titre_nouvelle_rubrique') . " " . _T('info_numero_abbreviation') . $id_rubrique)), $c)) {
        return $err;
    }
    $c = collecter_requests(array('id_parent', 'confirme_deplace'), array(), $set);
    // Deplacer la rubrique
    if (isset($c['id_parent'])) {
        $err = rubrique_instituer($id_rubrique, $c);
    }
    // invalider les caches marques de cette rubrique
    include_spip('inc/invalideur');
    suivre_invalideur("id='rubrique/{$id_rubrique}'");
    // et celui de menu_rubriques
    effacer_meta("date_calcul_rubriques");
    return $err;
}
/**
 * Enregistre les modifications sur une configuration
 * suite à un crayon sur une meta
 *
 * La colonne est toujours 'valeur' pour ces données.
 * La donnée à enregistrer peut-être une sous partie de configuration.
 * Si c'est le cas, on gère l'enregistrement via ecrire_config.
 * 
 * @param string $a
 *   Nom ou clé de la meta (descriptif_site ou demo__truc pour demo/truc)
 * @param bool|array $c
 *   Liste des champs modifiés
 *   Ici, 'valeur' normalement.
 * @return void
**/
function revision_meta($a, $c = false)
{
    if (isset($c['valeur'])) {
        // Certaines cles de configuration sont echapées ici (cf #EDIT_CONFIG{demo/truc})
        $a = str_replace('__', '/', $a);
        spip_log("meta '{$a}' = '{$c['valeur']}'", 'crayons');
        // eviter de planter les vieux SPIP
        if (false === strpos($a, '/')) {
            ecrire_meta($a, $c['valeur']);
            // SPIP 3 ou Bonux 2 ou CFG
        } else {
            include_spip('inc/config');
            ecrire_config($a, $c['valeur']);
        }
        include_spip('inc/invalideur');
        suivre_invalideur('meta');
    }
}
/**
 * Supprimer un lien entre un document et un objet
 *
 * @param int $id_document
 * @param string $objet
 * @param int $id_objet
 * @param bool $supprime
 *   si true, le document est supprime si plus lie a aucun objet
 * @param bool $check
 *   si true, on verifie les documents references dans le texte de l'objet
 *   et on les associe si pas deja fait
 * @return bool
 */
function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false)
{
    if (!($id_document = intval($id_document))) {
        return false;
    }
    // [TODO] le mettre en paramètre de la fonction ?
    $serveur = '';
    // D'abord on ne supprime pas, on dissocie
    include_spip('action/editer_liens');
    objet_dissocier(array('document' => $id_document), array($objet => $id_objet), array('role' => '*'));
    // Si c'est une vignette, l'eliminer du document auquel elle appartient
    // cas tordu peu probable
    sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=" . $id_document);
    // verifier son statut apres une suppression de lien
    include_spip('action/editer_document');
    document_instituer($id_document);
    // Invalider les caches
    include_spip('inc/invalideur');
    suivre_invalideur("id='id_document/{$id_document}'");
    pipeline('post_edition', array('args' => array('operation' => 'delier_document', 'action' => 'delier_document', 'table' => 'spip_documents', 'id_objet' => $id_document, 'objet' => $objet, 'id' => $id_objet), 'data' => null));
    if ($check) {
        // si demande, on verifie que ses documents vus sont bien lies !
        $spip_table_objet = table_objet_sql($objet);
        $table_objet = table_objet($objet);
        $id_table_objet = id_table_objet($objet, $serveur);
        $champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . "=" . intval($id_objet));
        $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
        $marquer_doublons_doc($champs, $id_objet, $objet, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur);
    }
    // On supprime ensuite s'il est orphelin
    // et si demande
    // ici on ne bloque pas la suppression d'un document rattache a un autre
    if ($supprime and !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=" . $id_document)) {
        $supprimer_document = charger_fonction('supprimer_document', 'action');
        return $supprimer_document($id_document);
    }
}
示例#21
0
	/**
	 * Gere le traitement du formulaire.
	 * 
	 * Si le chargement ou le controle n'ont pas ete fait,
	 * la fonction s'en occupe.
	 *
	 * @return boolean
	 */
	function traiter()
	{
		if (!$this->verifier) $this->verifier();
		
		if ($this->erreurs() || !$this->autoriser()) return false;
	
		if (!_request('_cfg_ok') && !_request('_cfg_delete')) return false;
		
		// les formulaires CVT ont deja leurs securites
		if (!$this->depuis_cvt) {
			$securiser_action = charger_fonction('securiser_action', 'inc');
			$securiser_action();
		}
		
		$this->actionner_extensions('pre_traiter');	
		
		if ($this->erreurs()) return false;		
			
		// suppression
		if (_request('_cfg_delete')) {
			$this->effacer();
		
		// sinon modification
		} else {
			$this->ecrire();
		}

		// pipeline 'cfg_post_edition' ? (quelqu'un utilise ??)
		$this->messages = pipeline('cfg_post_edition',array('args'=>array('nom_config'=>$this->nom_config()),'data'=>$this->messages));

		$this->actionner_extensions('post_traiter');

		// annuler le cache de SPIP
		include_spip('inc/invalideur');
		suivre_invalideur('cfg/' . $this->param['nom'] .
			($this->param['casier'] ? '/' . $this->param['casier'] : '') .
			($this->param['cfg_id'] ? '/' . $this->param['cfg_id'] : ''));		
	}
示例#22
0
/**
 * $c est un array ('id_article' = changement d'article)
 * il n'est pas autoriser de deplacer une petition
 *
 * @param  $id_petition
 * @param  $c
 * @param bool $calcul_rub
 * @return string
 */
function petition_instituer($id_petition, $c)
{
    include_spip('inc/autoriser');
    include_spip('inc/modifier');
    $row = sql_fetsel("id_article", "spip_petitions", "id_petition=" . intval($id_petition));
    $statut_ancien = $statut = $row['statut'];
    #$date_ancienne = $date = $row['date_time'];
    $champs = array();
    $s = isset($c['statut']) ? $c['statut'] : $statut;
    // cf autorisations dans inc/petition_instituer
    if ($s != $statut) {
        $statut = $champs['statut'] = $s;
        // En cas de publication, fixer la date a "maintenant"
        // sauf si $c commande autre chose
        // ou si l'petition est deja date dans le futur
        // En cas de proposition d'un petition (mais pas depublication), idem
        /*
        		if ($champs['statut'] == 'publie') {
        			if ($d)
        				$champs['date_time'] = $date = $d;
        			else
        				$champs['date_time'] = $date = date('Y-m-d H:i:s');
        		}*/
    }
    // Envoyer aux plugins
    $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_petitions', 'id_objet' => $id_petition, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs));
    if (!count($champs)) {
        return;
    }
    // Envoyer les modifs.
    sql_updateq('spip_petitions', $champs, 'id_petition=' . intval($id_petition));
    // Invalider les caches
    include_spip('inc/invalideur');
    suivre_invalideur("id='petition/{$id_petition}'");
    suivre_invalideur("id='article/" . $row['id_article'] . "'");
    // Pipeline
    pipeline('post_edition', array('args' => array('table' => 'spip_petitions', 'id_objet' => $id_petition, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs));
    // Notifications
    if ($notifications = charger_fonction('notifications', 'inc')) {
        $notifications('instituerpetition', $id_petition, array('statut' => $statut, 'statut_ancien' => $statut_ancien));
    }
    return '';
    // pas d'erreur
}
示例#23
0
function signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url, $msg, $lang, &$statut)
{
    include_spip('inc/texte');
    include_spip('inc/filtres');
    // Si on est deja connecte et que notre mail a ete valide d'une maniere
    // ou d'une autre, on entre directement la signature dans la base, sans
    // envoyer d'email. Sinon email de verification
    if (isset($GLOBALS['visiteur_session']['statut']) and $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email'] and strlen($GLOBALS['visiteur_session']['email']) or isset($GLOBALS['visiteur_session']['email_confirme']) and $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email_confirme'] and strlen($GLOBALS['visiteur_session']['session_email'])) {
        // Si on est en ajax on demande a reposter sans ajax, car il faut
        // recharger toute la page pour afficher la signature
        refuser_traiter_formulaire_ajax();
        $statut = 'publie';
        // invalider le cache !
        include_spip('inc/invalideur');
        suivre_invalideur("id='article/{$id_article}'");
        // message de reussite
        return _T('petitions:form_pet_signature_validee');
    }
    //
    // Cas normal : envoi d'une demande de confirmation
    //
    $row = sql_fetsel('titre,lang', 'spip_articles', "id_article=" . intval($id_article));
    $lang = lang_select($row['lang']);
    $titre = textebrut(typo($row['titre']));
    if ($lang) {
        lang_select();
    }
    if (!strlen($statut)) {
        $statut = signature_test_pass();
    }
    if ($lang != $GLOBALS['meta']['langue_site']) {
        $url_page = parametre_url($url_page, "lang", $lang, '&');
    }
    $url_page = parametre_url($url_page, 'var_confirm', $statut, '&') . "#sp{$id_article}";
    $r = _T('petitions:form_pet_mail_confirmation', array('titre' => $titre, 'nom_email' => $nom, 'nom_site' => $site, 'url_site' => $url, 'url' => $url_page, 'message' => $msg));
    $titre = _T('petitions:form_pet_confirmation') . " " . $titre;
    $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
    if ($envoyer_mail($mail, $titre, $r)) {
        return _T('petitions:form_pet_envoi_mail_confirmation', array('email' => $mail));
    }
    return false;
    # erreur d'envoi de l'email
}
示例#24
0
/**
 * Modifier le groupe parent d'un mot
 * @param  $id_mot
 * @param  $c
 * @return void
 */
function mot_instituer($id_mot, $c)
{
    $champs = array();
    // regler le groupe
    if (isset($c['id_groupe']) or isset($c['type'])) {
        $row = sql_fetsel("titre", "spip_groupes_mots", "id_groupe=" . intval($c['id_groupe']));
        if ($row) {
            $champs['id_groupe'] = $c['id_groupe'];
            $champs['type'] = $row['titre'];
        }
    }
    // Envoyer aux plugins
    $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_mots', 'id_objet' => $id_mot, 'action' => 'instituer'), 'data' => $champs));
    if (!$champs) {
        return;
    }
    sql_updateq('spip_mots', $champs, "id_mot=" . intval($id_mot));
    //
    // Post-modifications
    //
    // Invalider les caches
    include_spip('inc/invalideur');
    suivre_invalideur("id='mot/{$id_mot}'");
    // Pipeline
    pipeline('post_edition', array('args' => array('table' => 'spip_mots', 'id_objet' => $id_mot, 'action' => 'instituer'), 'data' => $champs));
    // Notifications
    if ($notifications = charger_fonction('notifications', 'inc')) {
        $notifications('instituermot', $id_mot, array('id_groupe' => $champs['id_groupe']));
    }
    return '';
    // pas d'erreur
}
示例#25
0
function revisions_breves ($id_breve, $c=false) {

	// champs normaux
	if ($c === false) {
		$c = array();
		foreach (array(
			'titre', 'texte', 'lien_titre', 'lien_url',
			'id_parent', 'statut'
		) as $champ)
			if (($a = _request($champ)) !== null)
				$c[$champ] = $a;
	}

	// Si la breve est publiee, invalider les caches et demander sa reindexation
	$t = sql_getfetsel("statut", "spip_breves", "id_breve=$id_breve");
	if ($t == 'publie') {
		$invalideur = "id='id_breve/$id_breve'";
		$indexation = true;
	}

	include_spip('inc/modifier');
	modifier_contenu('breve', $id_breve,
		array(
			'nonvide' => array('titre' => _T('info_sans_titre')),
			'invalideur' => $invalideur,
			'indexation' => $indexation
		),
		$c);


	// Changer le statut de la breve ?
	$row = sql_fetsel("statut, id_rubrique,lang, langue_choisie", "spip_breves", "id_breve=$id_breve");

	$id_rubrique = $row['id_rubrique'];
	$statut_ancien = $statut = $row['statut'];
	$langue_old = $row['lang'];
	$langue_choisie_old = $row['langue_choisie'];

	if (_request('statut', $c)
	AND _request('statut', $c) != $statut
	AND autoriser('publierdans', 'rubrique', $id_rubrique)) {
		$statut = $champs['statut'] = _request('statut', $c);
	}

	// Changer de rubrique ?
	// Verifier que la rubrique demandee est a la racine et differente
	// de la rubrique actuelle
	if ($id_parent = intval(_request('id_parent', $c))
	AND $id_parent != $id_rubrique
	AND (NULL !== ($lang=sql_getfetsel('lang', 'spip_rubriques', "id_parent=0 AND id_rubrique=$id_parent")))) {
		$champs['id_rubrique'] = $id_parent;
		// - changer sa langue (si heritee)
		if ($langue_choisie_old != "oui") {
			if ($lang != $langue_old)
				$champs['lang'] = $lang;
		}
		// si la breve est publiee
		// et que le demandeur n'est pas admin de la rubrique
		// repasser la breve en statut 'prop'.
		if ($statut == 'publie') {
			if (!autoriser('publierdans','rubrique',$id_parent))
				$champs['statut'] = $statut = 'prop';
		}
	}

	if (!$champs) return;

	sql_updateq('spip_breves', $champs, "id_breve=$id_breve");

	//
	// Post-modifications
	//

	// Invalider les caches
	include_spip('inc/invalideur');
	suivre_invalideur("id='id_breve/$id_breve'");

	// Au besoin, changer le statut des rubriques concernees 
	include_spip('inc/rubriques');
	calculer_rubriques_if($id_rubrique, $champs, $statut_ancien);

	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications('instituerbreve', $id_breve,
			array('statut' => $statut, 'statut_ancien' => $statut_ancien)
		);
	}

}
示例#26
0
/**
 * $c est un array ('statut', 'id_parent' = changement de rubrique)
 * statut et rubrique sont lies, car un admin restreint peut deplacer
 * un objet publie vers une rubrique qu'il n'administre pas
 *
 * @param string $objet
 * @param int $id
 * @param array $c
 * @param bool $calcul_rub
 * @return mixed|string
 */
function objet_instituer($objet, $id, $c, $calcul_rub = true)
{
    if (include_spip('action/editer_' . $objet) and function_exists($instituer = $objet . "_instituer")) {
        return $instituer($id, $c, $calcul_rub);
    }
    $table_sql = table_objet_sql($objet);
    $trouver_table = charger_fonction('trouver_table', 'base');
    $desc = $trouver_table($table_sql);
    if (!$desc or !isset($desc['field'])) {
        return _L("Impossible d'instituer {$objet} : non connu en base");
    }
    include_spip('inc/autoriser');
    include_spip('inc/rubriques');
    include_spip('inc/modifier');
    $sel = array();
    $sel[] = isset($desc['field']['statut']) ? "statut" : "'' as statut";
    $champ_date = '';
    if (isset($desc['date']) and $desc['date']) {
        $champ_date = $desc['date'];
    } elseif (isset($desc['field']['date'])) {
        $champ_date = 'date';
    }
    $sel[] = $champ_date ? "{$champ_date} as date" : "'' as date";
    $sel[] = isset($desc['field']['id_rubrique']) ? 'id_rubrique' : "0 as id_rubrique";
    $row = sql_fetsel($sel, $table_sql, id_table_objet($objet) . '=' . intval($id));
    $id_rubrique = $row['id_rubrique'];
    $statut_ancien = $statut = $row['statut'];
    $date_ancienne = $date = $row['date'];
    $champs = array();
    $d = ($date and isset($c[$champ_date])) ? $c[$champ_date] : null;
    $s = (isset($desc['field']['statut']) and isset($c['statut'])) ? $c['statut'] : $statut;
    // cf autorisations dans inc/instituer_objet
    if ($s != $statut or $d and $d != $date) {
        if ($id_rubrique ? autoriser('publierdans', 'rubrique', $id_rubrique) : autoriser('instituer', $objet, $id, null, array('statut' => $s))) {
            $statut = $champs['statut'] = $s;
        } else {
            if ($s != 'publie' and autoriser('modifier', $objet, $id)) {
                $statut = $champs['statut'] = $s;
            } else {
                spip_log("editer_objet {$id} refus " . join(' ', $c));
            }
        }
        // En cas de publication, fixer la date a "maintenant"
        // sauf si $c commande autre chose
        // ou si l'objet est deja date dans le futur
        // En cas de proposition d'un objet (mais pas depublication), idem
        if ($champ_date) {
            if ($champs['statut'] == 'publie' or $champs['statut'] == 'prop' and !in_array($statut_ancien, array('publie', 'prop')) or $d) {
                if ($d or strtotime($d = $date) > time()) {
                    $champs[$champ_date] = $date = $d;
                } else {
                    $champs[$champ_date] = $date = date('Y-m-d H:i:s');
                }
            }
        }
    }
    // Verifier que la rubrique demandee existe et est differente
    // de la rubrique actuelle
    if ($id_rubrique and $id_parent = $c['id_parent'] and $id_parent != $id_rubrique and sql_fetsel('1', "spip_rubriques", "id_rubrique=" . intval($id_parent))) {
        $champs['id_rubrique'] = $id_parent;
        // si l'objet etait publie
        // et que le demandeur n'est pas admin de la rubrique
        // repasser l'objet en statut 'propose'.
        if ($statut == 'publie' and !autoriser('publierdans', 'rubrique', $id_rubrique)) {
            $champs['statut'] = 'prop';
        }
    }
    // Envoyer aux plugins
    $champs = pipeline('pre_edition', array('args' => array('table' => $table_sql, 'id_objet' => $id, 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, 'id_parent_ancien' => $id_rubrique), 'data' => $champs));
    if (!count($champs)) {
        return '';
    }
    // Envoyer les modifs.
    objet_editer_heritage($objet, $id, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
    // Invalider les caches
    include_spip('inc/invalideur');
    suivre_invalideur("id='{$objet}/{$id}'");
    /*
    	if ($date) {
    		$t = strtotime($date);
    		$p = @$GLOBALS['meta']['date_prochain_postdate'];
    		if ($t > time() AND (!$p OR ($t < $p))) {
    			ecrire_meta('date_prochain_postdate', $t);
    		}
    	}*/
    // Pipeline
    pipeline('post_edition', array('args' => array('table' => $table_sql, 'id_objet' => $id, 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, 'id_parent_ancien' => $id_rubrique), 'data' => $champs));
    // Notifications
    if ($notifications = charger_fonction('notifications', 'inc')) {
        $notifications("instituer{$objet}", $id, array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne));
    }
    return '';
    // pas d'erreur
}
示例#27
0
文件: joindre.php 项目: rhertzog/lcs
function joindre_documents($files, $mode, $type, $id, $id_document, $hash, $redirect, &$actifs, $iframe_redirect)
{
	$ajouter_documents = charger_fonction('ajouter_documents', 'inc');

	if (function_exists('gzopen') 
	AND !($mode == 'distant')
	AND (count($files) == 1)
	AND (preg_match('/\.zip$/i', $files[0]['name'])
	     OR ($files[0]['type'] == 'application/zip'))) {
	
	  // on pose le fichier dans le repertoire zip 
	  // (nota : copier_document n'ecrase pas un fichier avec lui-meme
	  // ca autorise a boucler)
		$desc = $files[0];
		$zip = copier_document("zip",
					$desc['name'],
					$desc['tmp_name']
				);
		// Est-ce qu'on sait le lire ?
		include_spip('inc/pclzip');
		$archive = $zip ? new PclZip($zip) : '';
		if ($archive) {
			$valables = verifier_compactes($archive);
			if ($valables) {
				if (rename($zip, $tmp = _DIR_TMP.basename($zip))) {
					echo $ajouter_documents($valables, $tmp, $type, $id, $mode, $id_document, $actifs, $hash, $redirect, $iframe_redirect);
	// a tout de suite en joindre4, joindre5, ou joindre6
					exit;
				}
			}
		}
	}

	foreach ($files as $arg) {
		// verifier l'extension du fichier en fonction de son type mime
		list($extension,$arg['name']) = fixer_extension_document($arg);
		check_upload_error($arg['error']);
		$x = $ajouter_documents($arg['tmp_name'], $arg['name'], 
				    $type, $id, $mode, $id_document, $actifs);
	}
	// un invalideur a la hussarde qui doit marcher au moins pour article, breve, rubrique
	include_spip('inc/invalideur');
	suivre_invalideur("id='id_$type/$id'");
	return $x;
}
示例#28
0
/**
 * Traitement de l'upload d'un logo
 *
 * Il est affecte au site si la balise n'est pas dans une boucle,
 * sinon a l'objet concerne par la boucle ou indiquee par les parametres d'appel
 *
 * @param string $objet Objet SPIP auquel sera lie le document (ex. article)
 * @param int $id_objet Identifiant de l'objet
 * @param string $retour Url de redirection apres traitement
 * @param array $options Tableau d'option (exemple : image_reduire => 50)
 * @return array               Retour des traitements
 */
function formulaires_editer_logo_traiter_dist($objet, $id_objet, $retour = '', $options = array())
{
    $res = array('editable' => ' ');
    // pas dans une boucle ? formulaire pour le logo du site
    // dans ce cas, il faut chercher un 'siteon0.ext'
    if (!$objet) {
        $objet = 'site';
    }
    include_spip("action/editer_logo");
    // effectuer la suppression si demandee d'un logo
    $on = _request('supprimer_logo_on');
    if ($on or _request('supprimer_logo_off')) {
        logo_supprimer($objet, $id_objet, $on ? 'on' : 'off');
        $res['message_ok'] = '';
        // pas besoin de message : la validation est visuelle
        set_request('logo_up', ' ');
    } else {
        $sources = formulaire_editer_logo_get_sources();
        foreach ($sources as $etat => $file) {
            if ($file and $file['error'] == 0) {
                if ($err = logo_modifier($objet, $id_objet, $etat, $file)) {
                    $res['message_erreur'] = $err;
                } else {
                    $res['message_ok'] = '';
                }
                // pas besoin de message : la validation est visuelle
                set_request('logo_up', ' ');
            }
        }
    }
    // Invalider les caches de l'objet
    include_spip('inc/invalideur');
    suivre_invalideur("id='{$objet}/{$id_objet}'");
    if ($retour) {
        $res['redirect'] = $retour;
    }
    return $res;
}
示例#29
0
/**
 * Modifier le statut d'un auteur, ou son login/pass
 * 
 * @link http://doc.spip.org/@instituer_auteur
 * @param  $id_auteur
 * @param  $c
 * @param bool $force_webmestre
 * @return bool|string
 */
function auteur_instituer($id_auteur, $c, $force_webmestre = false)
{
    if (!($id_auteur = intval($id_auteur))) {
        return false;
    }
    $erreurs = array();
    // contiendra les differentes erreurs a traduire par _T()
    $champs = array();
    // les memoriser pour les faire passer dans le pipeline pre_edition
    if (isset($c['login']) and strlen($c['login'])) {
        $champs['login'] = $c['login'];
    }
    if (isset($c['pass']) and strlen($c['pass'])) {
        $champs['pass'] = $c['pass'];
    }
    $statut = $statut_ancien = sql_getfetsel('statut', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
    if (isset($c['statut']) and autoriser('modifier', 'auteur', $id_auteur, null, array('statut' => $c['statut']))) {
        $statut = $champs['statut'] = $c['statut'];
    }
    // Restreindre avant de declarer l'auteur
    // (section critique sur les droits)
    if ($c['id_parent']) {
        if (is_array($c['restreintes'])) {
            $c['restreintes'][] = $c['id_parent'];
        } else {
            $c['restreintes'] = array($c['id_parent']);
        }
    }
    if (isset($c['webmestre']) and ($force_webmestre or autoriser('modifier', 'auteur', $id_auteur, null, array('webmestre' => '?')))) {
        $champs['webmestre'] = $c['webmestre'] == 'oui' ? 'oui' : 'non';
    }
    // Envoyer aux plugins
    $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_auteurs', 'id_objet' => $id_auteur, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs));
    if (is_array($c['restreintes']) and autoriser('modifier', 'auteur', $id_auteur, NULL, array('restreint' => $c['restreintes']))) {
        $rubriques = array_map('intval', $c['restreintes']);
        $rubriques = array_unique($rubriques);
        $rubriques = array_diff($rubriques, array(0));
        auteur_dissocier($id_auteur, array('rubrique' => '*'));
        auteur_associer($id_auteur, array('rubrique' => $rubriques));
    }
    $flag_ecrire_acces = false;
    // commencer par traiter les cas particuliers des logins et pass
    // avant les autres ecritures en base
    if (isset($champs['login']) or isset($champs['pass'])) {
        $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
        include_spip('inc/auth');
        if (isset($champs['login']) and strlen($champs['login'])) {
            if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) {
                $erreurs[] = 'ecrire:impossible_modifier_login_auteur';
            }
        }
        if (isset($champs['pass']) and strlen($champs['pass'])) {
            $champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
            if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) {
                $erreurs[] = 'ecrire:impossible_modifier_pass_auteur';
            }
        }
        unset($champs['login']);
        unset($champs['pass']);
        $flag_ecrire_acces = true;
    }
    if (!count($champs)) {
        return implode(' ', array_map('_T', $erreurs));
    }
    sql_updateq('spip_auteurs', $champs, 'id_auteur=' . $id_auteur);
    // .. mettre a jour les fichiers .htpasswd et .htpasswd-admin
    if ($flag_ecrire_acces or isset($champs['statut'])) {
        include_spip('inc/acces');
        ecrire_acces();
    }
    // Invalider les caches
    include_spip('inc/invalideur');
    suivre_invalideur("id='auteur/{$id_auteur}'");
    // Pipeline
    pipeline('post_edition', array('args' => array('table' => 'spip_auteurs', 'id_objet' => $id_auteur, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs));
    // Notifications
    if ($notifications = charger_fonction('notifications', 'inc')) {
        $notifications('instituerauteur', $id_auteur, array('statut' => $statut, 'statut_ancien' => $statut_ancien));
    }
    return implode(' ', array_map('_T', $erreurs));
}
示例#30
0
function signature_instituer($id_signature, $c, $calcul_rub = true)
{
    include_spip('inc/autoriser');
    include_spip('inc/modifier');
    $row = sql_fetsel("S.statut, S.date_time, P.id_article", "spip_signatures AS S JOIN spip_petitions AS P ON S.id_petition=P.id_petition", "S.id_signature=" . intval($id_signature));
    $statut_ancien = $statut = $row['statut'];
    $date_ancienne = $date = $row['date_time'];
    $champs = array();
    $d = isset($c['date_time']) ? $c['date_time'] : null;
    $s = isset($c['statut']) ? $c['statut'] : $statut;
    // cf autorisations dans inc/signature_instituer
    if ($s != $statut or $d and $d != $date) {
        $statut = $champs['statut'] = $s;
        // En cas de publication, fixer la date a "maintenant"
        // sauf si $c commande autre chose
        // ou si l'signature est deja date dans le futur
        // En cas de proposition d'un signature (mais pas depublication), idem
        if ($champs['statut'] == 'publie') {
            if ($d) {
                $champs['date_time'] = $date = $d;
            } else {
                $champs['date_time'] = $date = date('Y-m-d H:i:s');
            }
        } elseif ($d) {
            $champs['date_time'] = $date = $d;
        }
    }
    // Envoyer aux plugins
    $champs = pipeline('pre_edition', array('args' => array('table' => 'spip_signatures', 'id_objet' => $id_signature, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs));
    if (!count($champs)) {
        return;
    }
    // Envoyer les modifs.
    sql_updateq('spip_signatures', $champs, 'id_signature=' . intval($id_signature));
    // Invalider les caches
    include_spip('inc/invalideur');
    suivre_invalideur("id='signature/{$id_signature}'");
    suivre_invalideur("id='article/" . $row['id_article'] . "'");
    // Pipeline
    pipeline('post_edition', array('args' => array('table' => 'spip_signatures', 'id_objet' => $id_signature, 'action' => 'instituer', 'statut_ancien' => $statut_ancien), 'data' => $champs));
    // Notifications
    if ($notifications = charger_fonction('notifications', 'inc')) {
        $notifications('instituersignature', $id_signature, array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date));
    }
    return '';
    // pas d'erreur
}