Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • spip/spip
  • Roman/spip
  • g0uZ/spip_puce_changement_statut_rapide_sans_JS_inline
  • erational/issue_4450
  • cy.altern/spip_core
  • fa_b/spip
  • glopglop/spip
  • MathieuAlphamosa/spip
  • taffit/spip
  • claffont/spip
  • RealET/spip
  • alexis.pellicier/spip
  • syl20/spip
  • cpol/spip_cpol0
  • franck_r/spip
  • JLuc/spip
  • JLuc/jluc-spip
  • bricebou/spip
  • Jack31/spip-issue-5919
  • Plumf/spip
  • jo/spip
  • pierretux/spip
  • placido/spip
  • touti/spip
  • florent.tri/spip
25 résultats
Afficher les modifications
Affichage de
avec 0 ajout et 2509 suppressions
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// Cette action permet de basculer du mode image au mode document et vice versa
// http://doc.spip.org/@action_changer_mode_document_dist
function action_changer_mode_document_dist()
{
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(",^(\d+)\W(\w+)$,", $arg, $r))
spip_log("action_changer_mode_document $arg pas compris");
else action_changer_mode_document_post($r);
}
// http://doc.spip.org/@action_changer_mode_document_post
function action_changer_mode_document_post($r)
{
// - id_document le doc a modifier
// - mode le mode a lui donner
list(, $id_document, $mode) = $r;
if ($id_document = intval($id_document)
AND in_array($mode, array('vignette', 'image', 'document'))) {
sql_updateq('spip_documents', array('mode'=>$mode), 'id_document='.$id_document);
}
if ($case = _request('afficher_case')){
$case = explode('-',$case);
list($id,$type,$script) = $case;
include_spip('inc/presentation');
include_spip('inc/documents');
include_spip('inc/actions');
// vilain hack pour ne pas recharger un script js
affiche_raccourci_doc('doc', $id_document, 'left');
// voila
ajax_retour(afficher_case_document($id_document, $id, $script, $type, true));
exit();
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/*
* Ce fichier est extrait du plugin charge : action charger decompresser
*
* Auteur : bertrand@toggg.com
* © 2007 - Distribue sous licence LGPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_charger_plugin_dist
function action_charger_plugin_dist() {
global $spip_lang_left;
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
include_spip('inc/minipres');
include_spip('inc/charger_plugin');
// droits : il faut avoir le droit de choisir les plugins,
// mais aussi d'en ajouter -- a voir
include_spip('inc/autoriser');
if (!autoriser('configurer', 'plugins')) {
echo minipres();
exit;
}
if ($arg == 'update_flux') {
if (is_array($syndic_plug = @unserialize($GLOBALS['meta']['syndic_plug'])))
foreach ($syndic_plug as $url => $c)
essaie_ajouter_liste_plugins($url);
}
elseif ($arg == 'supprimer_flux' AND $url = _request('supprimer_flux')) {
$syndic_plug = @unserialize($GLOBALS['meta']['syndic_plug']);
unset($syndic_plug[$url]);
ecrire_meta('syndic_plug', serialize($syndic_plug));
}
elseif (in_array($arg,array('charger_zip','lib','plugins'))) {
// la verification que c'est bien un zip sera faite apres
$zip = _request('url_zip_plugin');
}
elseif (strlen($arg)) {
// la verification que c'est bien un zip sera faite apres
$zip = $arg;
}
else {
// indetermine : c'est un zip ou une liste
$arg = 'charger_liste_ou_zip';
$zip = _request('url_zip_plugin2');
}
# si premiere lecture, destination temporaire des fichiers
$tmp = sous_repertoire(_DIR_CACHE, 'chargeur');
# on ne se contenten pas du basename qui peut etre un simple v1
# exemple de l'url http://nodeload.github.com/kbjr/Git.php/zipball/v0.1.1-rc
$fichier = (_request('fichier')?
_request('fichier')
:"h".substr(md5($zip),0,8)."-".basename($zip)
);
# basename par securite notamment dans le cas ou $fichier viens de l'exterieur
$fichier = $tmp.basename($fichier);
$extension = ""; // a verifier
# au second tour, le zip designe directement le fichier au lieu de l'url
# initiale
if (!file_exists($fichier)) {
# si on ne dispose pas encore du fichier
# verifier que le zip en est bien un (sans se fier a son extension)
# en chargeant son entete car l'url initiale peut etre une simple
# redirection et ne pas comporter d'extension .zip
include_spip('inc/distant');
$head = recuperer_page($zip, false, true, 0);
if (preg_match(",^Content-Type:\s*application/zip$,Uims",$head))
$extension = "zip";
// au cas ou, si le content-type n'est pas la
// mais que l'extension est explicite
elseif(pathinfo($zip, PATHINFO_EXTENSION)=="zip")
$extension = "zip";
# si ce n'est pas un zip dans un format connu,
# c'est sans doute une liste de plugins
# si on est dans le bon scenario
if (!$extension) {
if ($arg == 'charger_liste_ou_zip') {
essaie_ajouter_liste_plugins($zip);
}
}
}
else {
$extension = pathinfo($zip, PATHINFO_EXTENSION);
}
# format de fichier inconnu
if (!$extension) {
include_spip('inc/headers');
redirige_url_ecrire('charger_plugin');
}
# Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes
# facons jamais pu venir ici avec toutes les securisations faites :^)
if (!_DIR_PLUGINS_AUTO) die('jamais');
# dispose-t-on du fichier ?
$status = null;
# forcer l'extension du fichier par securite
$fichier = $tmp.basename($fichier,".$extension").".$extension";
if (!@file_exists($fichier)) {
include_spip('inc/distant');
$contenu = recuperer_page($zip, $fichier, false,_COPIE_LOCALE_MAX_SIZE);
if (!$contenu) {
spip_log('charger_decompresser impossible de charger '.$zip);
$status = -1;
}
}
if ($status === null) {
$status = chargeur_charger_zip(
array(
'zip' => $zip,
'arg' => $arg,
'fichier' => $fichier,
'tmp' => $tmp,
'extract' => _request('extract')
)
);
if (_request('extract')) {
spip_unlink($fichier);
}
}
// Vers quoi pointe le bouton "suite"
$suite = '';
// le fichier .zip est la et bien forme
if (is_array($status)) {
// Reconnaitre un plugin par son fichier xml
$get_infos = charger_fonction('get_infos','plugins');
$infos = $get_infos($status['tmpname'], true, '');
if ($infos) {
$nom = $infos['nom'];
$image = $infos['icon'];
$description = $infos['description'];
$type = 'plugin';
$dest = _DIR_PLUGINS_AUTO;
} else {
$type = 'lib';
$dest = _DIR_RACINE.'lib/';
}
// Fixer son emplacement final
$status['dirname'] = $dest
. basename($status['tmpname']) . '/';
// repertoire parent accessible en ecriture ?
if (!@is_dir($dest)
OR !@is_writeable($dest)) {
$retour = _T("erreur");
$texte = "<p>"._T('plugin_erreur_droit1',array('dest'=>$dest))."</p>"
. "<p>"._T('plugin_erreur_droit2').aide('install0')."</p>";
}
else
// C'est un plugin ?
if ($type == 'plugin') {
$retour = typo($nom);
// l'icone ne peut pas etre dans tmp/ (lecture http oblige)
// on la copie donc dans local/chargeur/
if ($image) {
$dir = sous_repertoire(_DIR_VAR,'chargeur');
@copy($status['tmpname'].'/'.$image, $image2 = $dir.basename($image));
$retour = "<img src='".$image2."' style='float:right;' />"
. $retour;
} else
$retour = "<img src='".chemin_image('plugin-24.gif')."' style='float:right;' />"
. $retour;
if (_request('extract')) {
$afficher = charger_fonction('afficher_plugin','plugins'); // pour plugin_propre
$texte = plugin_propre($description)
. '<p>'._T('plugin_zip_installe_finie',array('zip'=>$zip)).'</p>'
. "<h2 style='text-align:center;'>"._T('plugin_zip_active')."</h2>";
} else {
$texte = '<p>'._T('plugin_zip_telecharge',array('zip'=>$zip)).'</p>';
$texte .= liste_fichiers_pclzip($status);
$texte .= "<h2 style='text-align:center;'>"._T('plugin_zip_installer')."</h2>";
$suite = 'plugins';
}
}
// C'est un paquet quelconque
else {
$retour = _T('plugin_charge_paquet',array('name' => basename($status['tmpname'])));
if (_request('extract')) {
$texte = '<p>'._T('plugin_zip_installe_rep_finie', array('zip'=>$zip, 'rep'=>$status['dirname'])).'</p>';
} else {
$texte = "<p>"._T('plugin_zip_telecharge',array('zip'=>$zip))."</p>\n";
$texte .= liste_fichiers_pclzip($status);
$suite = 'lib';
}
}
}
// fichier absent
else if ($status == -1) {
$retour = _T('erreur');
$texte = _T('plugin_erreur_charger', array('zip'=>$zip));
}
// fichier la mais pas bien dezippe
else {
$retour = _T('erreur');
$texte = _T('plugin_erreur_zip',array('status'=>$status));
}
include_spip('exec/install'); // pour bouton_suivant()
$texte = "<div style='text-align:$spip_lang_left;'>$texte</div>\n";
$redirect = rawurldecode(_request('redirect'));
// par defaut on revient sur la page admin_plugin
if($redirect == _DIR_RESTREINT OR $redirect == "./"){
$redirect_annul = generer_url_ecrire('admin_plugin');
$redirect_form = 'admin_plugin&voir=recents&'.$type.'='.preg_replace(',^[^/]+/|/$,', '', $status['dirname']);
$redirect_action = '';
}
else{
$redirect_annul = $redirect;
$redirect_form = preg_replace(',^.*exec\=,', '', $redirect);
if (!$suite)
$texte .= form_hidden(parametre_url(generer_url_ecrire($redirect_form), $type,preg_replace(',^[^/]+/|/$,', '', $status['dirname'])));
$redirect_action = $redirect_form;
}
echo minipres($retour." ",
$suite
? redirige_action_post(_request('action'),
$suite,
$redirect_action,
'',
form_hidden('?url_zip_plugin='.urlencode($zip).'&extract=oui&fichier='.urlencode($fichier))
.$texte
."<a class='suivant' href='"
.$redirect_annul
."'>"._T('bouton_annuler')."</a>"
.bouton_suivant())
: generer_form_ecrire($redirect_form, $texte . bouton_suivant())
);
exit;
// 0 = rien, pas charge
// liste de fichiers = retour gagnant
// < 0 = erreur pclzip
// ----- Error codes
// -1 : Unable to open file in binary write mode
// -2 : Unable to open file in binary read mode
// -3 : Invalid parameters
// -4 : File does not exist
// -5 : Filename is too long (max. 255)
// -6 : Not a valid zip file
// -7 : Invalid extracted file size
// -8 : Unable to create directory
// -9 : Invalid archive extension
// -10 : Invalid archive format
// -11 : Unable to delete file (unlink)
// -12 : Unable to rename file (rename)
// -13 : Invalid header checksum
// -14 : Invalid archive size
# redirige_par_entete($url_retour);
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// Mise a jour de l'option de configuration $arg
// il faudrait limiter a arg plutot que d'executer tout modif_config
// on traite a part seulement le cas du proxy car c'est indispensable
// (message d'erreur eventuel a afficher)
include_spip('inc/config');
// http://doc.spip.org/@action_configurer_dist
function action_configuration_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$r = rawurldecode(_request('redirect'));
$r = parametre_url($r, 'configuration', $arg,"&");
appliquer_modifs_config();
// Cette globale est fixee par appliquer_modifs_config();
// c'est un message a afficher dans l'exec de retour (relayeur si comme ici on est en ajax)
if ($arg == 'relayeur')
$r = parametre_url($r, 'retour_proxy', $GLOBALS['retour_proxy'],"&");
else if ($arg == 'langue') {
include_spip('inc/rubriques');
calculer_langues_rubriques();
}
if (_request('envoi_now')) cron(0, array('mail' => -1));
redirige_par_entete($r);
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// Cette action permet de confirmer un changement d'email
function action_confirmer_email_dist()
{
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
include_spip('inc/filtres');
if ($GLOBALS['visiteur_session']['id_auteur'] AND email_valide($arg)){
$editer_auteur = charger_fonction('editer_auteur','action');
auteurs_set($GLOBALS['visiteur_session']['id_auteur'],array('email'=>$arg));
}
// verifier avant de rediriger pour invalider le message de confirmation
// si ca n'a pas marche
if ($redirect = _request('redirect') AND !$arg == sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.intval($GLOBALS['visiteur_session'])))
$GLOBALS['redirect'] = parametre_url($redirect, 'email_modif','');
}
?>
\ No newline at end of file
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/cookie');
// changer de langue: pas de secu si espace public ou login ou installation
// mais alors on n'accede pas a la base, on pose seulement le cookie.
// http://doc.spip.org/@action_converser_dist
function action_converser_dist()
{
$update_session = false;
if ( _request('arg') AND spip_connect()) {
$securiser_action = charger_fonction('securiser_action', 'inc');
$securiser_action();
$update_session = true;
}
$lang = action_converser_changer_langue($update_session);
$redirect = rawurldecode(_request('redirect'));
if (!$redirect) $redirect = _DIR_RESTREINT_ABS;
$redirect = parametre_url($redirect,'lang',$lang,'&');
redirige_par_entete($redirect, true);
}
function action_converser_changer_langue($update_session){
if ($lang = _request('var_lang'))
action_converser_post($lang);
elseif ($lang = _request('var_lang_ecrire')) {
if ($update_session) {
sql_updateq("spip_auteurs", array("lang" => $lang), "id_auteur = " . $GLOBALS['visiteur_session']['id_auteur']);
$GLOBALS['visiteur_session']['lang'] = $lang;
$session = charger_fonction('session', 'inc');
if ($spip_session = $session($GLOBALS['visiteur_session'])) {
spip_setcookie(
'spip_session',
$spip_session,
time() + 3600 * 24 * 14
);
}
}
action_converser_post($lang, 'spip_lang_ecrire');
}
return $lang;
}
// http://doc.spip.org/@action_converser_post
function action_converser_post($lang, $ecrire=false)
{
if ($lang) {
include_spip('inc/lang');
if (changer_langue($lang)) {
spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, time() + 365 * 24 * 3600);
if ($ecrire)
spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, time() + 365 * 24 * 3600);
}
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/actions');
include_spip('inc/cookie');
// http://doc.spip.org/@action_cookie_dist
function action_cookie_dist() {
// La cible de notre operation de connexion
$url = _request('url');
$redirect = isset($url) ? $url : _DIR_RESTREINT;
$redirect_echec = _request('url_echec');
if (!isset($redirect_echec)) {
if (strpos($redirect,_DIR_RESTREINT_ABS)!==false)
$redirect_echec = generer_url_public('login','',true);
else
$redirect_echec = $redirect;
}
// rejoue le cookie pour renouveler spip_session
if (_request('change_session') == 'oui') {
$session = charger_fonction('session', 'inc');
$session(true);
spip_log("statut 204 pour " . $_SERVER['REQUEST_URI']);
http_status(204); // No Content
return;
}
// tentative de connexion en auth_http
if (_request('essai_auth_http') AND !$GLOBALS['ignore_auth_http']) {
include_spip('inc/auth');
if (@$_SERVER['PHP_AUTH_USER']
AND @$_SERVER['PHP_AUTH_PW']
AND lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
redirige_par_entete($redirect);
else ask_php_auth(_T('info_connexion_refusee'),
_T('login_login_pass_incorrect'),
_T('login_retour_site'),
"url=".rawurlencode($redirect),
_T('login_nouvelle_tentative'),
(strpos($url,_DIR_RESTREINT_ABS)!==false));
}
// en cas de login sur bonjour=oui, on tente de poser un cookie
// puis de passer au login qui diagnostiquera l'echec de cookie
// le cas echeant.
if (_request('test_echec_cookie') == 'oui') {
spip_setcookie('spip_session', 'test_echec_cookie');
redirige_par_entete(parametre_url(parametre_url($redirect_echec,'var_echec_cookie','oui','&'),'url',rawurlencode($redirect),'&'));
}
$cook = isset($_COOKIE['spip_admin']) ? $_COOKIE['spip_admin'] : '';
// Suppression cookie d'admin ?
if (_request('cookie_admin') == "non") {
if ($cook)
spip_setcookie('spip_admin', $cook, time() - 3600 * 24);
}
// Ajout de cookie d'admin
else if (isset($set_cookie_admin)
OR $set_cookie_admin = _request('cookie_admin')) {
spip_setcookie('spip_admin', $set_cookie_admin,
time() + 14 * 24 * 3600);
}
// Redirection finale
redirige_par_entete($redirect, true);
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// Fonction appellee lorsque l'utilisateur clique sur le bouton
// 'copier en local' (document/portfolio).
// Il s'agit de la partie logique, c'est a dire que cette fonction
// realise la copie.
// http://doc.spip.org/@action_copier_local_dist
function action_copier_local_dist() {
// Recupere les arguments.
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_document = intval($arg);
if (!$id_document) {
spip_log("action_copier_local_dist $arg pas compris");
} else {
// arguments recuperes, on peut maintenant appeler la fonction.
action_copier_local_post($id_document);
}
}
// http://doc.spip.org/@action_copier_local_post
function action_copier_local_post($id_document) {
// Il faut la source du document pour le copier
$row = sql_fetsel("fichier, descriptif", "spip_documents", "id_document=$id_document");
$source = $row['fichier'];
include_spip('inc/distant'); // pour 'copie_locale'
include_spip('inc/documents'); // pour 'set_spip_doc'
$fichier = copie_locale($source);
if ($fichier) {
$fichier = _DIR_RACINE . $fichier;
$taille = filesize($fichier);
// On le sort du repertoire IMG/distant/
$dest = preg_replace(',^.*/distant/[^/_]+[/_],', '', $fichier);
$dest = sous_repertoire(_DIR_IMG, preg_replace(',^.*\.,', '', $fichier)) . $dest;
if ($dest != $fichier
AND @rename($fichier, $dest))
$fichier = $dest;
// On indique l'ancien URL dans le descriptif (pis-aller)
$row['descriptif'] .= ($row['descriptif'] ? "\n\n":'') . "[->$source]";
// $fichier contient IMG/distant/...
// or, dans la table documents, IMG doit etre exclu.
$fichier = set_spip_doc($fichier);
spip_log("convertit doc $id_document en local: $source => $fichier");
sql_updateq('spip_documents', array('fichier' =>$fichier, 'distant'=>'non', 'taille'=>$taille, 'descriptif'=> $row['descriptif']),"id_document=".$id_document);
pipeline('post_edition',
array(
'args' => array(
'operation' => 'copier_local_post',
'table' => 'spip_documents',
'id_objet' => $id_document
),
'data' => null
)
);
} else {
spip_log("echec copie locale $source");
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/plugin');
// http://doc.spip.org/@action_desinstaller_plugin_dist
function action_desinstaller_plugin_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$plug_file = $securiser_action();
$get_infos = charger_fonction('get_infos','plugins');
$infos = $get_infos($plug_file);
if (isset($infos['install'])){
// desinstaller
$etat = desinstalle_un_plugin($plug_file,$infos);
// desactiver si il a bien ete desinstalle
if (!$etat)
ecrire_plugin_actifs(array($plug_file),false,'enleve');
}
if ($redirect = _request('redirect')){
include_spip('inc/headers');
$redirect = str_replace('&amp;','&',$redirect);
redirige_par_entete($redirect);
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// Comme son nom ne l'indique pas cette action consiste a SUPPRIMER un document
// http://doc.spip.org/@action_documenter_dist
function action_documenter_dist()
{
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(",^(-?)(\d+)\W(\w+)(\W(\d+))?$,", $arg, $r))
spip_log("action_documenter $arg pas compris");
else action_documenter_post($r);
}
// http://doc.spip.org/@supprimer_lien_document
function supprimer_lien_document($id_document, $objet, $id_objet) {
if (!$id_document = intval($id_document))
return false;
// D'abord on ne supprime pas, on dissocie
sql_delete("spip_documents_liens",
$z = "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_document=".$id_document);
// Si c'est une vignette, l'eliminer du document auquel elle appartient
sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);
// On supprime ensuite s'il est orphelin
// (autorisation verifiee dans l'action)
$supprimer_document = charger_fonction('supprimer_document','action');
return $supprimer_document($id_document);
}
// http://doc.spip.org/@action_documenter_post
function action_documenter_post($r)
{
// - sign indique le portfolio image ou document, dans le cas de
// la page exec=articles
// - id est l'id_objet (id_article ou id_rubrique etc)
// - type est 'article' (ou 'rubrique')
// - id_document le doc a supprimer ou a delier de l'objet
// SI VIDE, on supprime tous les documents du type SIGN
// (bouton "supprimer tous les documents")
list(, $sign, $id, $type, ,$id_document) = $r;
if ($id_document) {
supprimer_lien_document($id_document, $type, $id);
}
else {
$obj = "id_objet=".intval($id)." AND objet=".sql_quote($type);
$s = sql_select('D.id_document AS id_doc', "spip_documents AS D LEFT JOIN spip_documents_liens AS L ON L.id_document=D.id_document", "$obj AND D.mode='document' AND " . (sql_in('D.extension', array('gif', 'jpg', 'png'), $sign ? '' : 'NOT')));
while ($t = sql_fetch($s)) {
supprimer_lien_document($t['id_doc'], $type, $id);
}
}
if ($type == 'rubrique') {
include_spip('inc/rubriques');
depublier_branche_rubrique_if($id);
}
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_editer_article_dist
function action_editer_article_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
// si id_article n'est pas un nombre, c'est une creation
// mais on verifie qu'on a toutes les donnees qu'il faut.
if (!$id_article = intval($arg)) {
$id_parent = _request('id_parent');
$id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
if (!($id_parent AND $id_auteur)) {
include_spip('inc/headers');
redirige_url_ecrire();
}
if (($id_article = insert_article($id_parent)) > 0)
# cf. GROS HACK ecrire/inc/getdocument
# rattrapper les documents associes a cet article nouveau
# ils ont un id = 0-id_auteur
sql_updateq("spip_documents_liens", array("id_objet" => $id_article), array("id_objet = ".(0-$id_auteur),"objet='article'"));
}
// Enregistre l'envoi dans la BD
if ($id_article > 0) $err = articles_set($id_article);
if (_request('redirect')) {
$redirect = parametre_url(urldecode(_request('redirect')),
'id_article', $id_article, '&') . $err;
include_spip('inc/headers');
redirige_par_entete($redirect);
}
else
return array($id_article,$err);
}
// Appelle toutes les fonctions de modification d'un article
// $err est de la forme '&trad_err=1'
// http://doc.spip.org/@articles_set
function articles_set($id_article, $set=null) {
$err = '';
// unifier $texte en cas de texte trop long
trop_longs_articles();
$c = array();
if (!$set){
foreach (array(
'surtitre', 'titre', 'soustitre', 'descriptif',
'nom_site', 'url_site', 'chapo', 'texte', 'ps'
) as $champ)
$c[$champ] = _request($champ,$set);
if (_request('changer_virtuel',$set) == 'oui') {
$r = _request('virtuel',$set);
$c['chapo'] = (strlen($r) ? '='.$r : '');
}
}
else {
$c = $set;
unset($c['date']);
unset($c['statut']);
unset($c['id_parent']);
}
include_spip('inc/modifier');
revision_article($id_article, $c);
// Modification de statut, changement de rubrique ?
$c = array();
foreach (array(
'date', 'statut', 'id_parent'
) as $champ)
$c[$champ] = _request($champ,$set);
$err .= instituer_article($id_article, $c);
// Un lien de trad a prendre en compte
$err .= article_referent($id_article, array('lier_trad' => _request('lier_trad',$set)));
return $err;
}
// http://doc.spip.org/@insert_article
function insert_article($id_rubrique) {
// Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
// dans la premiere rubrique racine
if (!$id_rubrique = intval($id_rubrique)) {
$row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1");
$id_rubrique = $row['id_rubrique'];
} else $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique");
$id_secteur = $row['id_secteur'];
$lang_rub = $row['lang'];
// La langue a la creation : si les liens de traduction sont autorises
// dans les rubriques, on essaie avec la langue de l'auteur,
// ou a defaut celle de la rubrique
// Sinon c'est la langue de la rubrique qui est choisie + heritee
if ($GLOBALS['meta']['multi_articles'] == 'oui') {
lang_select($GLOBALS['visiteur_session']['lang']);
if (in_array($GLOBALS['spip_lang'],
explode(',', $GLOBALS['meta']['langues_multilingue']))) {
$lang = $GLOBALS['spip_lang'];
$choisie = 'oui';
}
}
if (!$lang) {
$choisie = 'non';
$lang = $lang_rub ? $lang_rub : $GLOBALS['meta']['langue_site'];
}
$champs = array(
'id_rubrique' => $id_rubrique,
'id_secteur' => $id_secteur,
'statut' => 'prepa',
'date' => date('Y-m-d H:i:s'),
'lang' => $lang,
'langue_choisie' =>$choisie);
// Envoyer aux plugins
$champs = pipeline('pre_insertion',
array(
'args' => array(
'table' => 'spip_articles',
),
'data' => $champs
)
);
$id_article = sql_insertq("spip_articles", $champs);
pipeline('post_insertion',
array(
'args' => array(
'table' => 'spip_articles',
'id_objet' => $id_article
),
'data' => $champs
)
);
// controler si le serveur n'a pas renvoye une erreur
if ($id_article > 0 AND $GLOBALS['visiteur_session']['id_auteur']) {
include_spip('action/editer_auteur');
auteur_associer($GLOBALS['visiteur_session']['id_auteur'], array('article'=>$id_article));
}
return $id_article;
}
// $c est un array ('statut', 'id_parent' = changement de rubrique)
//
// statut et rubrique sont lies, car un admin restreint peut deplacer
// un article publie vers une rubrique qu'il n'administre pas
// http://doc.spip.org/@instituer_article
function instituer_article($id_article, $c, $calcul_rub=true) {
include_spip('inc/autoriser');
include_spip('inc/rubriques');
include_spip('inc/modifier');
$row = sql_fetsel("statut, date, id_rubrique", "spip_articles", "id_article=$id_article");
$id_rubrique = $row['id_rubrique'];
$statut_ancien = $statut = $row['statut'];
$date_ancienne = $date = $row['date'];
$champs = array();
$d = isset($c['date'])?$c['date']:null;
$s = isset($c['statut'])?$c['statut']:$statut;
// cf autorisations dans inc/instituer_article
if ($s != $statut OR ($d AND $d != $date)) {
if (autoriser('publierdans', 'rubrique', $id_rubrique))
$statut = $champs['statut'] = $s;
else if (autoriser('modifier', 'article', $id_article) AND $s != 'publie')
$statut = $champs['statut'] = $s;
else
spip_log("editer_article $id_article refus " . join(' ', $c));
// En cas de publication, fixer la date a "maintenant"
// sauf si $c commande autre chose
// ou si l'article est deja date dans le futur
// En cas de proposition d'un article (mais pas depublication), idem
if ($champs['statut'] == 'publie'
OR ($champs['statut'] == 'prop' AND !in_array($statut_ancien, array('publie', 'prop')))
) {
if ($d OR strtotime($d=$date)>time())
$champs['date'] = $date = $d;
else
$champs['date'] = $date = date('Y-m-d H:i:s');
}
}
// Verifier que la rubrique demandee existe et est differente
// de la rubrique actuelle
if ($id_parent = $c['id_parent']
AND $id_parent != $id_rubrique
AND (sql_fetsel('1', "spip_rubriques", "id_rubrique=$id_parent"))) {
$champs['id_rubrique'] = $id_parent;
// si l'article etait publie
// et que le demandeur n'est pas admin de la rubrique
// repasser l'article 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' => 'spip_articles',
'id_objet' => $id_article,
'action'=>'instituer',
'statut_ancien' => $statut_ancien,
),
'data' => $champs
)
);
if (!count($champs)) return;
// Envoyer les modifs.
editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
// Invalider les caches
include_spip('inc/invalideur');
suivre_invalideur("id='article/$id_article'");
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' => 'spip_articles',
'id_objet' => $id_article,
'action'=>'instituer',
'statut_ancien' => $statut_ancien,
),
'data' => $champs
)
);
// Notifications
if ($notifications = charger_fonction('notifications', 'inc')) {
$notifications('instituerarticle', $id_article,
array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
);
}
return ''; // pas d'erreur
}
// fabrique la requete de modification de l'article, avec champs herites
// http://doc.spip.org/@editer_article_heritage
function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $cond=true) {
// Si on deplace l'article
// changer aussi son secteur et sa langue (si heritee)
if (isset($champs['id_rubrique'])) {
$row_rub = sql_fetsel("id_secteur, lang", "spip_rubriques", "id_rubrique=".sql_quote($champs['id_rubrique']));
$langue = $row_rub['lang'];
$champs['id_secteur'] = $row_rub['id_secteur'];
if (sql_fetsel('1', 'spip_articles', "id_article=$id_article AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) {
$champs['lang'] = $langue;
}
}
if (!$champs) return;
sql_updateq('spip_articles', $champs, "id_article=$id_article");
// Changer le statut des rubriques concernees
if ($cond) {
include_spip('inc/rubriques');
$postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
}
}
//
// Reunit les textes decoupes parce que trop longs
//
// http://doc.spip.org/@trop_longs_articles
function trop_longs_articles() {
if (is_array($plus = _request('texte_plus'))) {
foreach ($plus as $n=>$t) {
$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,","", $t);
}
set_request('texte', join('',$plus) . _request('texte'));
}
}
// Poser un lien de traduction vers un article de reference
// http://doc.spip.org/@article_referent
function article_referent ($id_article, $c) {
if (!$c = intval($c['lier_trad'])) return;
// selectionner l'article cible, qui doit etre different de nous-meme,
// et quitter s'il n'existe pas
$id_lier = sql_getfetsel('id_trad', 'spip_articles', "id_article=$c AND NOT(id_article=$id_article)");
if ($id_lier === NULL)
{
spip_log("echec lien de trad vers article incorrect ($lier_trad)");
return '&trad_err=1';
}
// $id_lier est le numero du groupe de traduction
// Si l'article vise n'est pas deja traduit, son identifiant devient
// le nouvel id_trad de ce nouveau groupe et on l'affecte aux deux
// articles
if ($id_lier == 0) {
sql_updateq("spip_articles", array("id_trad" => $c), "id_article IN ($c, $id_article)");
}
// sinon ajouter notre article dans le groupe
else {
sql_updateq("spip_articles", array("id_trad" => $id_lier), "id_article = $id_article");
}
return ''; // pas d'erreur
}
// obsolete, utiliser revision_article dans inc/modifier
// http://doc.spip.org/@revisions_articles
function revisions_articles ($id_article, $c=false) {
include_spip('inc/modifier');
return revision_article($id_article,$c);
}
?>
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_editer_auteur_dist
function action_editer_auteur_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
// si id_auteur n'est pas un nombre, c'est une creation
if (!$id_auteur = intval($arg)) {
if (($id_auteur = insert_auteur()) > 0){
# cf. GROS HACK
# recuperer l'eventuel logo charge avant la creation
# ils ont un id = 0-id_auteur de la session
$id_hack = 0 - $GLOBALS['visiteur_session']['id_auteur'];
$chercher_logo = charger_fonction('chercher_logo', 'inc');
if (list($logo) = $chercher_logo($id_hack, 'id_auteur', 'on'))
rename($logo, str_replace($id_hack, $id_auteur, $logo));
if (list($logo) = $chercher_logo($id_hack, 'id_auteur', 'off'))
rename($logo, str_replace($id_hack, $id_auteur, $logo));
}
}
// Enregistre l'envoi dans la BD
if ($id_auteur > 0)
$err = auteurs_set($id_auteur);
if ($redirect = _request('redirect')) {
if ($err){
$ret = ('&redirect=' . $redirect);
spip_log("echec editeur auteur: " . join(' ',$echec));
$echec = '&echec=' . join('@@@', $echec);
$redirect = generer_url_ecrire('auteur_infos',"id_auteur=$id_auteur$echec$ret",'&');
}
else
$redirect = urldecode($redirect);
$redirect = parametre_url($redirect,'id_auteur', $id_auteur, '&');
include_spip('inc/headers');
redirige_par_entete($redirect);
}
else
return array($id_auteur,$err);
$redirect = _request('redirect');
}
function insert_auteur($source=null) {
// Ce qu'on va demander comme modifications
$champs = array();
$champs['source'] = $source?$source:'spip';
$champs['login'] = '';
$champs['statut'] = '5poubelle'; // inutilisable tant qu'il n'a pas ete renseigne et institue
$champs['webmestre'] = 'non';
// Envoyer aux plugins
$champs = pipeline('pre_insertion',
array(
'args' => array(
'table' => 'spip_auteurs',
),
'data' => $champs
)
);
$id_auteur = sql_insertq("spip_auteurs", $champs);
pipeline('post_insertion',
array(
'args' => array(
'table' => 'spip_auteurs',
'id_objet' => $id_auteur
),
'data' => $champs
)
);
return $id_auteur;
}
// Appelle toutes les fonctions de modification d'un auteur
function auteurs_set($id_auteur, $set = null) {
$err = '';
if (is_null($set)){
$c = array();
foreach (array(
'nom','email','bio',
'nom_site','url_site',
'imessage','pgp',
) as $champ)
$c[$champ] = _request($champ,$set);
}
else{
$c = $set;
unset($c['webmestre']);
unset($c['pass']);
unset($c['login']);
}
include_spip('inc/modifier');
revision_auteur($id_auteur, $c);
// Modification de statut, changement de rubrique ?
$c = array();
foreach (array(
'statut', 'new_login','new_pass','login','pass','webmestre','restreintes','id_parent'
) as $champ)
if (_request($champ,$set))
$c[preg_replace(',^new_,','',$champ)] = _request($champ,$set);
$err .= instituer_auteur($id_auteur, $c);
return $err;
}
/**
* Associer un auteur a des objets listes sous forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* on peut passer optionnellement une qualification du (des) lien(s) qui sera
* alors appliquee dans la foulee.
* En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
*
* @param int $id_auteur
* @param array $objets
* @param array $qualif
* @return string
*/
function auteur_associer($id_auteur,$objets, $qualif = null){
include_spip('action/editer_liens');
return objet_associer(array('auteur'=>$id_auteur), $objets, $qualif);
}
/**
* Ancien nommage pour compatibilite
* @param int $id_auteur
* @param array $c
* @return string
*/
function auteur_referent($id_auteur,$c){
return auteur_associer($id_auteur,$c);
}
/**
* Dossocier un auteur des objets listes sous forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* un * pour $id_auteur,$objet,$id_objet permet de traiter par lot
*
* @param int $id_auteur
* @param array $objets
* @return string
*/
function auteur_dissocier($id_auteur,$objets){
include_spip('action/editer_liens');
return objet_dissocier(array('auteur'=>$id_auteur), $objets);
}
/**
* Qualifier le lien d'un auteur avec les objets listes
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
* exemple :
* $c = array('vu'=>'oui');
* un * pour $id_auteur,$objet,$id_objet permet de traiter par lot
*
* @param int $id_auteur
* @param array $objets
* @param array $qualif
*/
function auteur_qualifier($id_auteur,$objets,$qualif){
include_spip('action/editer_liens');
return objet_qualifier_liens(array('auteur'=>$id_auteur), $objets, $qualif);
}
// http://doc.spip.org/@instituer_auteur
function instituer_auteur($id_auteur, $c, $force_webmestre = false) {
if (!$id_auteur=intval($id_auteur))
return false;
// commencer par traiter les cas particuliers des logins et pass
// avant le changement de statut eventuel
if (isset($c['login']) OR isset($c['pass'])){
$auth_methode = sql_getfetsel('source','spip_auteurs','id_auteur='.intval($id_auteur));
include_spip('inc/auth');
if (isset($c['login']))
auth_modifier_login($auth_methode, $c['login'], $id_auteur);
if (isset($c['pass'])){
$c['login'] = sql_getfetsel('login','spip_auteurs','id_auteur='.intval($id_auteur));
auth_modifier_pass($auth_methode, $c['login'], $c['pass'], $id_auteur);
}
}
$champs = array();
$statut = $statut_ancien = sql_getfetsel('statut','spip_auteurs','id_auteur='.intval($id_auteur));
if (isset($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',
),
'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));
}
if (!count($champs)) return;
sql_updateq('spip_auteurs', $champs , 'id_auteur='.$id_auteur);
include_spip('inc/modifier');
sql_updateq('spip_auteurs',$champs,'id_auteur='.$id_auteur);
// 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
),
'data' => $champs
)
);
// Notifications
if ($notifications = charger_fonction('notifications', 'inc')) {
$notifications('instituerauteur', $id_auteur,
array('statut' => $statut, 'statut_ancien' => $statut_ancien)
);
}
return ''; // pas d'erreur
}
?>
\ No newline at end of file
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* API
*/
/**
* Teste l'existence de la table xxx_liens et renvoie celle ci precedee
* de la cle primaire.
* Renvoie false si l'objet n'est pas associable.
*
* @param string $objet
*/
function objet_associable($objet){
$trouver_table = charger_fonction('trouver_table','base');
$table_sql = table_objet_sql($objet);
if ($primary = id_table_objet($objet)
AND $trouver_table($l = $table_sql."_liens")
AND !preg_match(',[^\w],',$primary)
AND !preg_match(',[^\w],',$table_lien))
return array($primary,$l);
spip_log("Objet $objet non associable : ne dispose pas d'une cle primaire $primary OU d'une table liens $l");
return false;
}
/**
* Associer un ou des objets a des objets listes
* $objets_source et $objets_lies sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* on peut passer optionnellement une qualification du (des) lien(s) qui sera
* alors appliquee dans la foulee.
* En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
*
* @param array $objets_source
* @param array $objets_lies
* @param array $qualif
* @return string
*/
function objet_associer($objets_source, $objets_lies, $qualif = null){
$modifs = objet_traiter_laisons('lien_insert', $objets_source, $objets_lies);
if ($qualif)
objet_qualifier_liens($objets_source, $objets_lies, $qualif);
return $modifs; // pas d'erreur
}
/**
* Dissocier un (ou des) objet(s) des objets listes
* $objets_source et $objets sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* un * pour $objet,$id_objet permet de traiter par lot
* seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
*
*
* @param array $objets_source
* @param array $objets_lies
* @return string
*/
function objet_dissocier($objets_source,$objets_lies){
return objet_traiter_laisons('lien_delete',$objets_source,$objets_lies);
}
/**
* Qualifier le lien entre un (ou des) objet(s) et des objets listes
* $objets_source et $objets sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* un * pour $objet,$id_objet permet de traiter par lot
* seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
*
* @param array $objets_source
* @param array $objets_lies
* @param array $qualif
*/
function objet_qualifier_liens($objets_source,$objets_lies,$qualif){
return objet_traiter_laisons('lien_set',$objets_source,$objets_lies,$qualif);
}
/**
* Trouver les liens entre objets
* $objets_source et $objets sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* un * pour $objet,$id_objet permet de traiter par lot
* seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
*
* @param <type> $objets_source
* @param <type> $objets_lies
* @return <type>
*/
function objet_trouver_liens($objets_source,$objets_lies){
return objet_traiter_laisons('lien_find',$objets_source,$objets_lies,$qualif);
}
/**
* Fonctions techniques
* ne pas les appeler directement
*/
/**
* Fonction generique
* appliquer une operation de liaison entre un ou des objets et des objets listes
* $objets_source et $objets_lies sont de la forme
* array($objet=>$id_objets,...)
* $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
*
* Les objets sources sont les pivots qui portent les liens
* et pour lesquels une table spip_xxx_liens existe
* (auteurs, documents, mots)
*
* on peut passer optionnellement une qualification du (des) lien(s) qui sera
* alors appliquee dans la foulee.
* En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
*
* @param array $objets_source
* @param array $objets_lies
* @param array $qualif
* @return string
*/
function objet_traiter_laisons($operation,$objets_source,$objets_lies, $set = null){
// accepter une syntaxe minimale pour supprimer tous les liens
if ($objets_lies=='*') $objets_lies = array('*'=>'*');
$modifs = 0; // compter le nombre de modifications
$echec = null;
foreach($objets_source as $objet=>$ids){
if ($a = objet_associable($objet)) {
list($primary,$l) = $a;
if (!is_array($ids)) $ids = array($ids);
foreach($ids as $id) {
$res = $operation($objet,$primary,$l,$id,$objets_lies,$set);
if ($res===false) {
spip_log("objet_traiter_laisons [Echec] : $operation sur $objet/$primary/$l/$id");
$echec = true;
}
else
$modifs=($modifs?(is_array($res)?array_merge($modifs,$res):$modifs+$res):$res);
}
}
else
$echec = true;
}
return ($echec?false:$modifs); // pas d'erreur
}
/**
* Sous fonction insertion
* qui traite les liens pour un objet source dont la cle primaire
* et la table de lien sont fournies
*
* $objets et de la forme
* array($objet=>$id_objets,...)
*
* Retourne le nombre d'insertions realisees
*
* @param string $objet_source
* @param string $primary
* @param sgring $table_lien
* @param int $id
* @param array $objets
* @return int
*/
function lien_insert($objet_source,$primary,$table_lien,$id,$objets) {
$ins = 0;
$echec = null;
foreach($objets as $objet => $id_objets){
if (!is_array($id_objets)) $id_objets = array($id_objets);
foreach($id_objets as $id_objet) {
$objet = objet_type($objet); # securite
if ($id_objet=intval($id_objet)
AND !sql_getfetsel(
$primary,
$table_lien,
array('id_objet='.intval($id_objet), 'objet='.sql_quote($objet), $primary.'='.intval($id))))
{
$e = sql_insertq($table_lien, array('id_objet' => $id_objet, 'objet'=>$objet, $primary=>$id));
if ($e!==false) {
$ins++;
lien_propage_date_modif($objet,$id_objet);
lien_propage_date_modif($objet_source,$id);
}
else
$echec = true;
}
}
}
return ($echec?false:$ins);
}
/**
* Fabriquer la condition where en tenant compte des jokers *
*
* @param string $primary
* @param int/string/array $id_source
* @param string $objet
* @param int/string/array $id_objet
* @return <type>
*/
function lien_where($primary, $id_source, $objet, $id_objet){
if (!strlen($id_source)
OR !strlen($objet)
OR (!is_array($id_objet) AND !strlen($id_objet)))
return "0=1"; // securite
$where = array();
if ($id_source!=='*')
$where[] = addslashes($primary) . "=" . intval($id_source);
if ($objet!=='*')
$where[] = "objet=".sql_quote($objet);
if ($id_objet!=='*')
$where[] = (is_array($id_objet)?sql_in('id_objet',array_map('intval',$id_objet)):"id_objet=".intval($id_objet));
return $where;
}
/**
* Sous fonction suppression
* qui traite les liens pour un objet source dont la cle primaire
* et la table de lien sont fournies
*
* $objets et de la forme
* array($objet=>$id_objets,...)
* un * pour $id,$objet,$id_objets permet de traiter par lot
*
* @param string $objet_source
* @param string $primary
* @param sgring $table_lien
* @param int $id
* @param array $objets
* @return int
*/
function lien_delete($objet_source,$primary,$table_lien,$id,$objets){
$retire = array();
$dels = 0;
$echec = false;
foreach($objets as $objet => $id_objets){
$objet = objet_type($objet); # securite
if (!is_array($id_objets)) $id_objets = array($id_objets);
foreach($id_objets as $id_objet) {
$where = lien_where($primary, $id, $objet, $id_objet);
// lire les liens existants pour propager la date de modif
$liens = sql_allfetsel("$primary,id_objet",$table_lien,$where);
$e = sql_delete($table_lien, $where);
if ($e!==false){
$dels+=$e;
lien_propage_date_modif($objet,array_map('end',$liens));
lien_propage_date_modif($objet_source,array_map('reset',$liens));
}
else
$echec = true;
$retire[] = array('source'=>array($objet_source=>$id),'lien'=>array($objet=>$id_objet),'type'=>$objet,'id'=>$id_objet);
}
}
pipeline('trig_supprimer_objets_lies',$retire);
return ($echec?false:$dels);
}
/**
* Sous fonction qualification
* qui traite les liens pour un objet source dont la cle primaire
* et la table de lien sont fournies
*
* $objets et de la forme
* array($objet=>$id_objets,...)
* un * pour $id,$objet,$id_objets permet de traiter par lot
*
* exemple :
* $qualif = array('vu'=>'oui');
*
* @param string $objet_source
* @param string $primary
* @param sgring $table_lien
* @param int $id
* @param array $objets
* @param array $qualif
*/
function lien_set($objet_source,$primary,$table_lien,$id,$objets,$qualif){
$echec = null;
if (!$qualif)
return false;
// nettoyer qualif qui peut venir directement d'un objet_trouver_lien :
unset($qualif[$primary]);
unset($qualif[$objet_source]);
unset($qualif[$qualif['objet']]);
unset($qualif['objet']);
unset($qualif['id_objet']);
foreach($objets as $objet => $id_objets){
$objet = objet_type($objet); # securite
if (!is_array($id_objets)) $id_objets = array($id_objets);
foreach($id_objets as $id_objet) {
$where = lien_where($primary, $id, $objet, $id_objet);
$e = sql_updateq($table_lien,$qualif,$where);
if ($e===false)
$echec = true;
}
}
return ($echec?false:true);
}
/**
* Sous fonction trouver
* qui cherche les liens pour un objet source dont la cle primaire
* et la table de lien sont fournies
*
* $objets et de la forme
* array($objet=>$id_objets,...)
* un * pour $id,$objet,$id_objets permet de traiter par lot
*
*
* @param string $objet_source
* @param string $primary
* @param sgring $table_lien
* @param int $id
* @param array $objets
*/
function lien_find($objet_source,$primary,$table_lien,$id,$objets){
$trouve = array();
foreach($objets as $objet => $id_objets){
$objet = objet_type($objet); # securite
// lien_where prend en charge les $id_objets sous forme int ou array
$where = lien_where($primary, $id, $objet, $id_objets);
$liens = sql_allfetsel('*',$table_lien,$where);
// ajouter les entrees objet_source et objet cible par convenance
foreach($liens as $l) {
$l[$objet_source] = $l[$primary];
$l[$objet] = $l['id_objet'];
$trouve[] = $l;
}
}
return $trouve;
}
/**
* Propager la date_modif sur les objets dont un lien a ete modifie
*
* @param string $objet
* @param array/int $ids
*/
function lien_propage_date_modif($objet,$ids){
$trouver_table = charger_fonction('trouver_table','base');
$table = table_objet_sql($objet);
if ($desc = $trouver_table($table)
AND isset($desc['field']['date_modif'])){
$primary = id_table_objet($objet);
$where = (is_array($ids)?sql_in($primary, array_map('intval',$ids)):"$primary=".intval($ids));
sql_updateq($table, array('date_modif'=>date('Y-m-d H:i:s')), $where);
}
}
?>
\ No newline at end of file
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/filtres');
// http://doc.spip.org/@action_editer_message_dist
function action_editer_message_dist($arg=null) {
if (is_null($arg)){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
}
if (preg_match(',^(\d+)$,', $arg, $r))
action_editer_message_post_vieux($arg);
elseif (preg_match(',^-(\d+)$,', $arg, $r))
action_editer_message_post_supprimer($r[1]);
elseif (preg_match(',^(\d+)\W$,', $arg, $r))
action_editer_message_post_choisir($r[1]);
elseif (preg_match(',^(\d+)\W@(\d+)$,', $arg, $r))
action_editer_message_post_ajouter($r[1], $r[2]);
elseif (preg_match(',^(\d+)\W:(\d+)$,', $arg, $r))
action_editer_message_post_vu($r[1], $r[2]);
elseif (preg_match(',^(\d+)\W-(\d+)$,', $arg, $r))
action_editer_message_post_retirer($r[1], $r[2]);
elseif (preg_match(',^(\d+)\W(\w+)$,', $arg, $r))
action_editer_message_post_envoyer($r[1], $r[2]);
elseif (preg_match(',^(\w+)$,', $arg, $r))
action_editer_message_post_nouveau($arg);
elseif (preg_match(',^(\w+)\W(\d+)$,', $arg, $r))
action_editer_message_post_nouveau($r[1], $r[2]);
elseif (preg_match(',^(\w+)\W(\d+-\d+-\d+)$,', $arg, $r))
action_editer_message_post_nouveau($r[1], '', $r[2]);
else spip_log("action_editer_message_dist $arg pas compris");
}
// http://doc.spip.org/@action_editer_message_post_supprimer
function action_editer_message_post_supprimer($id_message) {
sql_delete("spip_messages", "id_message=".sql_quote($id_message));
include_spip('action/editer_auteur');
auteur_dissocier('*', array('message'=>$id_message));
}
// http://doc.spip.org/@action_editer_message_post_vu
function action_editer_message_post_vu($id_message, $id_auteur) {
include_spip('action/editer_auteur');
auteur_qualifier($id_auteur,array('message'=>$id_message),array("vu" => 'oui'));
}
// http://doc.spip.org/@action_editer_message_post_retirer
function action_editer_message_post_retirer($id_message, $id_auteur) {
include_spip('action/editer_auteur');
auteur_dissocier($id_auteur, array('message'=>$id_message));
}
// http://doc.spip.org/@action_editer_message_post_ajouter
function action_editer_message_post_ajouter($id_message, $id_auteur) {
include_spip('action/editer_auteur');
auteur_associer($id_auteur, array('message'=>$id_message),array('vu'=>'non'));
// Ne pas notifier ici, car si on se trompe d'auteur, on veut avoir le temps
// de supprimer celui qu'on vient d'ajouter... c'est fait en cron
}
// http://doc.spip.org/@action_editer_message_post_choisir
function action_editer_message_post_choisir($id_message) {
if ($id_auteur = _request('nouv_auteur'))
action_editer_message_post_ajouter($id_message, $id_auteur);
else {
include_spip('inc/ressembler');
include_spip('inc/charsets'); // pour tranlitteration
$id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
$cherche_auteur= _request('cherche_auteur');
$query = sql_select("id_auteur, nom", "spip_auteurs", "messagerie<>'non' AND id_auteur<>'$id_auteur' AND pass<>'' AND login<>''");
$table_auteurs = array();
$table_ids = array();
while ($row = sql_fetch($query)) {
$table_auteurs[] = $row['nom'];
$table_ids[] = $row['id_auteur'];
}
$res = mots_ressemblants($cherche_auteur, $table_auteurs, $table_ids);
$n = count($res);
if ($n == 1)
# Bingo
action_editer_message_post_ajouter($id_message, $res[0]);
# renvoyer la valeur ==> formulaire de choix si n !=1
# notification que $res[0] a ete rajoute sinon
redirige_par_entete(parametre_url(urldecode(_request('redirect')),
'cherche_auteur', $cherche_auteur, '&'));
}
}
// http://doc.spip.org/@action_editer_message_post_envoyer
function action_editer_message_post_envoyer($id_message, $statut) {
sql_updateq("spip_messages", array("statut" => $statut), "id_message=$id_message");
sql_updateq("spip_messages", array("date_heure" => date('Y-m-d H:i:s')), "id_message=$id_message AND rv<>'oui'");
}
// http://doc.spip.org/@action_editer_message_post_nouveau
function action_editer_message_post_nouveau($type, $dest='', $rv='')
{
$id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
$mydate = date("YmdHis", time() - 2 * 24 * 3600);
sql_delete("spip_messages", "(statut = 'redac') AND (date_heure < $mydate)");
if ($type == 'pb') $statut = 'publie';
else $statut = 'redac';
$titre = filtrer_entites(_T('texte_nouveau_message'));
$vals = array('titre' => $titre,
'statut' => $statut,
'type' => $type,
'id_auteur' => $id_auteur);
if (!$rv)
$vals['date_heure'] = date('Y-m-d H:i:s');
else {
$vals['date_heure'] = "$rv 12:00:00";
$vals['date_fin'] = "$rv 13:00:00";
$vals['rv'] = 'oui';
}
$id_message = sql_insertq("spip_messages", $vals);
include_spip('action/editer_auteur');
if ($type != "affich"){
auteur_associer($id_auteur, array('message'=>$id_message),array('vu'=>'oui'));
if ($dest)
auteur_associer($dest, array('message'=>$id_message),array('vu'=>'non'));
}
redirige_url_ecrire('message_edit', "id_message=$id_message&new=oui&dest=$dest");
}
// http://doc.spip.org/@action_editer_message_post_vieux
function action_editer_message_post_vieux($id_message)
{
sql_updateq('spip_messages', array('titre'=>_request('titre'), 'texte' => _request('texte')), "id_message=$id_message");
sql_updateq('spip_messages', array('rv' => _request('rv')), "id_message=$id_message");
if (_request('jour'))
change_date_message($id_message, _request('heures'),_request('minutes'),_request('mois'), _request('jour'), _request('annee'), _request('heures_fin'),_request('minutes_fin'),_request('mois_fin'), _request('jour_fin'), _request('annee_fin'));
}
// Convertir dates a calendrier correct
// (exemple: 31 fevrier devient debut mars, 24h12 devient 00h12 du lendemain)
// http://doc.spip.org/@change_date_message
function change_date_message($id_message, $heures,$minutes,$mois, $jour, $annee, $heures_fin,$minutes_fin,$mois_fin, $jour_fin, $annee_fin)
{
$date = date("Y-m-d H:i:s", mktime($heures,$minutes,0,$mois, $jour, $annee));
$jour = journum($date);
$mois = mois($date);
$annee = annee($date);
$heures = heures($date);
$minutes = minutes($date);
// Verifier que la date de fin est bien posterieure au debut
$unix_debut = date("U", mktime($heures,$minutes,0,$mois, $jour, $annee));
$unix_fin = date("U", mktime($heures_fin,$minutes_fin,0,$mois_fin, $jour_fin, $annee_fin));
if ($unix_fin <= $unix_debut) {
$jour_fin = $jour;
$mois_fin = $mois;
$annee_fin = $annee;
$heures_fin = $heures + 1;
$minutes_fin = $minutes;
}
$date_fin = date("Y-m-d H:i:s", mktime($heures_fin,$minutes_fin,0,$mois_fin, $jour_fin, $annee_fin));
$jour_fin = journum($date_fin);
$mois_fin = mois($date_fin);
$annee_fin = annee($date_fin);
$heures_fin = heures($date_fin);
$minutes_fin = minutes($date_fin);
sql_updateq('spip_messages', array('date_heure'=>"$annee-$mois-$jour $heures:$minutes:00", 'date_fin'=>"$annee_fin-$mois_fin-$jour_fin $heures_fin:$minutes_fin:00"), "id_message=$id_message");
}
?>
Ce diff est replié.
Ce diff est replié.
Ce diff est replié.
X
Ce diff est replié.
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2010 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// http://doc.spip.org/@action_instituer_auteur_dist
function action_instituer_auteur_dist() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
list($id_auteur, $statut) = preg_split('/\W/', $arg);
if (!$statut) $statut = _request('statut'); // cas POST
if (!$statut) return; // impossible mais sait-on jamais
$id_auteur = intval($id_auteur);
include_spip('action/editer_auteur');
$c = array(
array('statut'=>$statut,'id_parent'=>intval(_request('id_parent')),'restreintes'=>_request('restreintes'))
);
instituer_auteur($id_auteur, $c);
}
?>
Ce diff est replié.