/** * Appelle toutes les fonctions de modification d'un auteur * * @param int $id_auteur * @param array $set * @param bool $force_update * permet de forcer la maj en base des champs fournis, sans passer par instancier * utilise par auth/spip * @return string */ function auteur_modifier($id_auteur, $set = null, $force_update = false) { include_spip('inc/modifier'); include_spip('inc/filtres'); $c = collecter_requests(objet_info('auteur', 'champs_editables'), $force_update ? array() : array('webmestre', 'pass', 'login'), $set); if ($err = objet_modifier_champs('auteur', $id_auteur, array('nonvide' => array('nom' => _T('ecrire:item_nouvel_auteur'))), $c)) { return $err; } $session = $c; $err = ''; if (!$force_update) { // Modification de statut, changement de rubrique ? $c = collecter_requests(array('statut', 'new_login', 'new_pass', 'login', 'pass', 'webmestre', 'restreintes', 'id_parent'), array(), $set); if (isset($c['new_login']) and !isset($c['login'])) { $c['login'] = $c['new_login']; } if (isset($c['new_pass']) and !isset($c['pass'])) { $c['pass'] = $c['new_pass']; } $err = auteur_instituer($id_auteur, $c); $session = array_merge($session, $c); } // .. mettre a jour les sessions de cet auteur include_spip('inc/session'); $session['id_auteur'] = $id_auteur; unset($session['new_login']); unset($session['new_pass']); actualiser_sessions($session); return $err; }
/** * Afficher le diff d'un champ texte generique * @param string $champ * @param string $old * @param string $new * @param string $format * apercu, diff ou complet * @return string */ function afficher_diff_jointure_dist($champ, $old, $new, $format = 'diff') { $join = substr($champ, 9); $objet = objet_type($join); $old = explode(',', $old); $new = explode(',', $new); $liste = array(); // les communs $intersection = array_intersect($new, $old); foreach ($intersection as $id) { if ($id = intval(trim($id))) { $liste[$id] = "<a href='" . generer_url_entite($id, $objet) . "' title='" . _T(objet_info($objet, 'texte_objet')) . " {$id}'>" . generer_info_entite($id, $objet, 'titre') . "</a>"; } } // les supprimes $old = array_diff($old, $intersection); foreach ($old as $id) { if ($id = intval(trim($id))) { $liste[$id] = "<span class='diff-supprime'>" . "<a href='" . generer_url_entite($id, $objet) . "' title='" . _T(objet_info($objet, 'texte_objet')) . " {$id}'>" . generer_info_entite($id, $objet, 'titre') . "</a>" . "</span>"; } } // les ajoutes $new = array_diff($new, $intersection); foreach ($new as $id) { if ($id = intval(trim($id))) { $liste[$id] = "<span class='diff-ajoute'>" . "<a href='" . generer_url_entite($id, $objet) . "' title='" . _T(objet_info($objet, 'texte_objet')) . " {$id}'>" . generer_info_entite($id, $objet, 'titre') . "</a>" . "</span>"; } } ksort($liste); $liste = implode(', ', $liste); return $liste; }
function html_f3666965c018303599bb64189cbac96c($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) { if (isset($Pile[0]["doublons"]) and is_array($Pile[0]["doublons"])) { $doublons = nettoyer_env_doublons($Pile[0]["doublons"]); } $connect = ''; $page = ' <div' . (($t1 = strval(interdire_scripts(entites_html(sinon(table_valeur(@$Pile[0], (string) 'divclass', null), 'spip-admin-bloc'), true)))) !== '' ? ' class="' . $t1 . '"' : '') . ' id=\'spip-admin\' dir="' . lang_dir(@$Pile[0]['lang'], 'ltr', 'rtl') . '">' . (($t1 = strval(interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'analyser', null), true)))) !== '' ? ' <a href="' . $t1 . ('" class="spip-admin-boutons" id="analyser">' . _T('public|spip|ecrire:analyse_xml') . (($t2 = strval(interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'xhtml_error', null), true)))) !== '' ? ' (' . $t2 . ')' : '') . '</a>') : '') . ' ' . (($t1 = strval(interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'objet', null), true) ? ' ' : ''))) !== '' ? $t1 . (' ' . (($t2 = strval(interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'id_objet', null), true)))) !== '' ? '<a href="' . interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) ('voir_' . interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'objet', null), true))), null), true)) . '" class="spip-admin-boutons" id="voir_' . interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'objet', null), true)) . '">' . interdire_scripts(_T(objet_info(entites_html(table_valeur(@$Pile[0], (string) 'objet', null), true), 'texte_objet'))) . ' (' . $t2 . ')</a>' : '') . ' ') : '') . '<!--extra-->' . (($t1 = strval(interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'ecrire', null), true)))) !== '' ? ' <a href="' . $t1 . ('" class="spip-admin-boutons" id="ecrire">' . _T('public|spip|ecrire:espace_prive') . '</a>') : '') . ' <a href="' . parametre_url(self(), 'var_mode', interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'calcul', null), true))) . '" class="spip-admin-boutons" id="var_mode">' . _T('public|spip|ecrire:admin_recalculer') . interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'use_cache', null), true)) . '</a>' . (($t1 = strval(interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'preview', null), true)))) !== '' ? ' <a href="' . $t1 . ('" class="spip-admin-boutons" id="preview">' . _T('public|spip|ecrire:previsualisation') . '</a>') : '') . (($t1 = strval(interdire_scripts(entites_html(table_valeur(@$Pile[0], (string) 'debug', null), true)))) !== '' ? ' <a href="' . $t1 . ('" class="spip-admin-boutons" id="debug">' . _T('public|spip|ecrire:admin_debug') . '</a>') : '') . ' </div> '; return analyse_resultat_skel('html_f3666965c018303599bb64189cbac96c', $Cache, $page, 'squelettes-dist/formulaires/administration.html'); }
/** * Trouver le label d'un champ de révision * * Quelques champs ont un label dans dans les chaînes de langue de SPIP * Pour un champ particulier d'un objet particulier, le pipeline revisions_chercher_label * peut être utilisé * * @param string $champ * Le nom du champ révisionné * @param string $objet * Le type d'objet révisionné * @return string $label * Le label du champ */ function label_champ($champ, $objet = false) { $label = ""; // si jointure: renvoyer le nom des objets joints if (strncmp($champ, 'jointure_', 9) == 0) { return _T(objet_info(objet_type(substr($champ, 9)), 'texte_objets')); } switch ($champ) { case 'surtitre': $label = "texte_sur_titre"; break; case 'soustitre': $label = "texte_sous_titre"; break; case 'nom_site': $label = "lien_voir_en_ligne"; break; case 'email': $label = "entree_adresse_email_2"; break; case 'login': $label = "item_login"; break; case 'chapo': $champ = "chapeau"; default: $label = pipeline('revisions_chercher_label', array('args' => array('champ' => $champ, 'objet' => $objet), 'data' => $label ? $label : 'info_' . $champ)); break; } return $label ? _T($label) : ""; }
/** * Un parametre permet de forcer le statut (exemple: plugin antispam) * * http://code.spip.net/@inc_forum_insert_dist * * @param $objet * @param $id_objet * @param $id_forum * en reponse a * @param null $force_statut * @return bool */ function inc_forum_insert_dist($objet, $id_objet, $id_forum, $force_statut = null) { if (!in_array($force_statut, array('privrac', 'privadm'))) { if (!strlen($objet) or !intval($id_objet)) { spip_log("Erreur insertion forum sur objet='{$objet}', id_objet={$id_objet}", 'forum.' . _LOG_ERREUR); return 0; } } spip_log("insertion de forum {$force_statut} sur {$objet} {$id_objet} (+{$id_forum})", 'forum'); include_spip('inc/filtres'); include_spip('inc/modifier'); include_spip('inc/session'); $champs = objet_info('forum', 'champs_editables'); $c = collecter_requests($champs, array()); $c['statut'] = 'off'; $c['objet'] = $objet; $c['id_objet'] = $id_objet; $c['auteur'] = sinon(session_get('nom'), session_get('session_nom')); $c['email_auteur'] = sinon(session_get('email'), session_get('session_email')); $c = pipeline('pre_edition', array('args' => array('table' => 'spip_forum', 'id_objet' => $id_forum, 'action' => 'instituer'), 'data' => forum_insert_statut($c, $force_statut))); $id_reponse = forum_insert_base($c, $id_forum, $objet, $id_objet, $c['statut'], _request('ajouter_mot')); if (!$id_reponse) { spip_log("Echec insertion forum sur {$objet} {$id_objet} (+{$id_forum})", 'forum.' . _LOG_ERREUR); } else { spip_log("forum insere' {$id_reponse} sur {$objet} {$id_objet} (+{$id_forum})", 'forum'); } return $id_reponse; }
function critere_archives($idb, &$boucles, $crit) { $boucle =& $boucles[$idb]; $objet = objet_type($boucle->id_table); $date = objet_info($objet, 'date'); $champ_date = "'" . $boucle->id_table . "." . $date . "'"; $boucle->where[] = array('REGEXP', $champ_date, "sql_quote(('^' . interdire_scripts(entites_html(\$Pile[0]['" . VAR_DATE . "']))))"); }
function urls_afficher_fiche_objet($flux) { if (isset($GLOBALS['meta']['urls_activer_controle']) and $GLOBALS['meta']['urls_activer_controle'] == 'oui' and $objet = $flux['args']['type'] and $id_objet = $flux['args']['id'] and objet_info($objet, 'page')) { $p = strpos($flux['data'], 'fiche_objet'); $p = strpos($flux['data'], '<!--/hd-->', $p); //$p = strrpos(substr($flux['data'],0,$p),'<div'); $res = recuperer_fond('prive/objets/editer/url', array('id_objet' => $id_objet, 'objet' => $objet), array('ajax' => true)); $flux['data'] = substr_replace($flux['data'], $res, $p, 0); } return $flux; }
/** * Modifier une souscription * * $c est un contenu (par defaut on prend le contenu via _request()) * * @param int $id_souscription * @param array|bool $set * @return string */ function souscription_modifier($id_souscription, $set = false) { include_spip('inc/modifier'); $c = collecter_requests(objet_info('souscription', 'champs_editables'), array(), $set); /* Récupération du nom du pays */ $code_pays = _request('pays'); $pays = sql_getfetsel(sql_multi("nom", $GLOBALS['spip_lang']), 'spip_pays', "code=" . sql_quote($code_pays)); $c = array_merge($c, array("pays" => $pays)); if ($err = objet_modifier_champs('souscription', $id_souscription, array(), $c)) { return $err; } }
/** * J'edite tel objet * si l'objet est non editable dans l'espace prive, ne pas retenir le signalement * qui correspond a un process unique * * http://doc.spip.org/@signale_edition * * @param int $id * @param $auteur * @param string $type * @return mixed */ function signale_edition($id, $auteur, $type = 'article') { include_spip('base/objets'); include_spip('inc/filtres'); if (objet_info($type, 'editable') !== 'oui') { return; } $edition = lire_tableau_edition(); if (isset($auteur['id_auteur']) and $id_a = $auteur['id_auteur']) { $nom = $auteur['nom']; } else { $nom = $id_a = $GLOBALS['ip']; } if (!is_array($edition[$type][$id])) { $edition[$type][$id] = array(); } $edition[$type][$id][$id_a][$nom] = time(); ecrire_tableau_edition($edition); }
/** * Appelle toutes les fonctions de modification d'un article * $err est de la forme chaine de langue ou vide si pas d'erreur * http://doc.spip.org/@articles_set * * @param $id_article * @param null $set * @return string */ function article_modifier($id_article, $set = null) { // unifier $texte en cas de texte trop long trop_longs_articles(); include_spip('inc/modifier'); include_spip('inc/filtres'); $c = collecter_requests(objet_info('article', 'champs_editables'), array('date', 'statut', 'id_parent'), $set); // Si l'article est publie, invalider les caches et demander sa reindexation $t = sql_getfetsel("statut", "spip_articles", "id_article=" . intval($id_article)); $invalideur = $indexation = false; if ($t == 'publie') { $invalideur = "id='article/{$id_article}'"; $indexation = true; } if ($err = objet_modifier_champs('article', $id_article, array('nonvide' => array('titre' => _T('info_nouvel_article') . " " . _T('info_numero_abbreviation') . $id_article), 'invalideur' => $invalideur, 'indexation' => $indexation, 'date_modif' => 'date_modif'), $c)) { return $err; } // Modification de statut, changement de rubrique ? $c = collecter_requests(array('date', 'statut', 'id_parent'), array(), $set); $err = article_instituer($id_article, $c); return $err; }
/** * Enregistre une revision de document. * $set est un contenu (par defaut on prend le contenu via _request()) * * @param int $id_document * @param array|bool $set */ function document_modifier($id_document, $set = false) { include_spip('inc/modifier'); include_spip('inc/filtres'); // champs normaux $champs = collecter_requests(objet_info('document', 'champs_editables'), array('parents', 'ajout_parents'), $set); $invalideur = ""; $indexation = false; // Si le document est publie, invalider les caches et demander sa reindexation $t = sql_getfetsel("statut", "spip_documents", 'id_document=' . intval($id_document)); if ($t == 'publie') { $invalideur = "id='id_document/{$id_document}'"; $indexation = true; } $ancien_fichier = ""; // si le fichier est modifie, noter le nom de l'ancien pour faire le menage if (isset($champs['fichier'])) { $ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)); } if ($err = objet_modifier_champs('document', $id_document, array('invalideur' => $invalideur, 'indexation' => $indexation), $champs)) { return $err; } // nettoyer l'ancien fichier si necessaire if ($champs['fichier'] and $ancien_fichier and $ancien_fichier !== $champs['fichier'] and @file_exists($f = get_spip_doc($ancien_fichier))) { spip_unlink($f); } // Changer le statut du document ? // le statut n'est jamais fixe manuellement mais decoule de celui des objets lies $champs = collecter_requests(array('parents', 'ajouts_parents'), array(), $set); if (document_instituer($id_document, $champs)) { // // Post-modifications // // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='id_document/{$id_document}'"); } }
/** * Renseigner les informations de taille et dimension d'un document * * Récupère les informations de taille (largeur / hauteur / type_image / taille) d'un document * Utilise pour cela les fonctions du répertoire metadatas/* * * Ces fonctions de récupérations peuvent retourner d'autres champs si ces champs sont définis * comme editable dans la déclaration de la table spip_documents * * TODO Renommer cette fonction sans "_image" * * @param string $fichier * Le fichier à examiner * @param string $ext * L'extension du fichier à examiner * @return array|string $infos * Si c'est une chaine, c'est une erreur * Si c'est un tableau, l'ensemble des informations récupérées du fichier */ function renseigner_taille_dimension_image($fichier, $ext) { $infos = array('largeur' => 0, 'hauteur' => 0, 'type_image' => '', 'taille' => 0); // Quelques infos sur le fichier if (!$fichier or !@file_exists($fichier) or !($infos['taille'] = @intval(filesize($fichier)))) { spip_log("Echec copie du fichier {$fichier}"); return _T('medias:erreur_copie_fichier', array('nom' => $fichier)); } // chercher une fonction de description $meta = array(); if ($metadata = charger_fonction($ext, "metadata", true)) { $meta = $metadata($fichier); } else { $media = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($ext)); if ($metadata = charger_fonction($media, "metadata", true)) { $meta = $metadata($fichier); } } $meta = pipeline('renseigner_document', array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta)); include_spip('inc/filtres'); # pour objet_info() $editables = objet_info('document', 'champs_editables'); foreach ($meta as $m => $v) { if (isset($infos[$m]) or in_array($m, $editables)) { $infos[$m] = $v; } } return $infos; }
/** * Autorisation de changer de langue un contenu * * @param string $faire Action demandée * @param string $type Type d'objet sur lequel appliquer l'action * @param int $id Identifiant de l'objet * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon **/ function autoriser_changerlangue_dist($faire, $type, $id, $qui, $opt) { $multi_objets = explode(',', lire_config('multi_objets')); $gerer_trad_objets = explode(',', lire_config('gerer_trad_objets')); $table = table_objet_sql($type); if (in_array($table, $multi_objets) or in_array($table, $gerer_trad_objets)) { // affichage du formulaire si la configuration l'accepte $multi_secteurs = lire_config('multi_secteurs'); $champs = objet_info($type, 'field'); if ($multi_secteurs == 'oui' and array_key_exists('id_rubrique', $champs)) { // multilinguisme par secteur et objet rattaché à une rubrique $primary = id_table_objet($type); if ($table != 'spip_rubriques') { $id_rubrique = sql_getfetsel('id_rubrique', "{$table}", "{$primary}=" . intval($id)); } else { $id_rubrique = $id; } $id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); if (!$id_secteur > 0) { $id_secteur = $id_rubrique; } $langue_secteur = sql_getfetsel('lang', 'spip_rubriques', 'id_rubrique=' . intval($id_secteur)); $langue_objet = sql_getfetsel('lang', "{$table}", "{$primary}=" . intval($id)); if ($langue_secteur != $langue_objet) { // configuration incohérente, on laisse l'utilisateur corriger la situation return true; } if ($table != 'spip_rubriques') { // le choix de la langue se fait seulement sur les rubriques return false; } else { $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id)); if ($id_parent != 0) { // sous-rubriques : pas de choix de langue return false; } } } } else { return false; } return autoriser('modifier', $type, $id, $qui, $opt); }
/** * 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; }
/** * Chargement du formulaire d'édition de logo * * @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 Variables d'environnement pour le fond */ function formulaires_editer_logo_charger_dist($objet, $id_objet, $retour = '', $options = array()) { // pas dans une boucle ? formulaire pour le logo du site // dans ce cas, il faut chercher un 'siteon0.ext' if (!$objet) { $objet = 'site'; } $objet = objet_type($objet); $_id_objet = id_table_objet($objet); if (!is_array($options)) { $options = unserialize($options); } if (!isset($options['titre'])) { $balise_img = chercher_filtre('balise_img'); $img = $balise_img(chemin_image('image-24.png'), "", 'cadre-icone'); $libelles = pipeline('libeller_logo', $GLOBALS['logo_libelles']); $libelle = ($id_objet or $objet != 'rubrique') ? $objet : 'racine'; if (isset($libelles[$libelle])) { $libelle = $libelles[$libelle]; } elseif ($libelle = objet_info($objet, 'texte_logo_objet')) { $libelle = _T($libelle); } else { $libelle = _L('Logo'); } switch ($objet) { case 'article': $libelle .= " " . aide("logoart"); break; case 'breve': $libelle .= " " . aide("breveslogo"); break; case 'rubrique': $libelle .= " " . aide("rublogo"); break; default: break; } $options['titre'] = $img . $libelle; } if (!isset($options['editable'])) { include_spip('inc/autoriser'); $options['editable'] = autoriser('iconifier', $objet, $id_objet); } $res = array('editable' => ($GLOBALS['meta']['activer_logos'] == 'oui' ? ' ' : '') && (!isset($options['editable']) or $options['editable']), 'logo_survol' => $GLOBALS['meta']['activer_logos_survol'] == 'oui' ? ' ' : '', 'objet' => $objet, 'id_objet' => $id_objet, '_options' => $options, '_show_upload_off' => ''); // rechercher le logo de l'objet // la fonction prend un parametre '_id_objet' etrange : // le nom de la cle primaire (et non le nom de la table) // ou directement le nom du raccourcis a chercher $chercher_logo = charger_fonction('chercher_logo', 'inc'); $etats = $res['logo_survol'] ? array('on', 'off') : array('on'); foreach ($etats as $etat) { $logo = $chercher_logo($id_objet, $_id_objet, $etat); if ($logo) { $res['logo_' . $etat] = $logo[0]; } } // pas de logo_on -> pas de formulaire pour le survol if (!isset($res['logo_on'])) { $res['logo_survol'] = ''; } elseif (!isset($res['logo_off']) and _request('logo_up')) { $res['_show_upload_off'] = ' '; } // si le logo n'est pas editable et qu'il n'y en a pas, on affiche pas du tout le formulaire if (!$res['editable'] and !isset($res['logo_off']) and !isset($res['logo_on'])) { return false; } return $res; }
function agenda_action_update_repetitions($id_evenement, $repetitions) { // evenement source if ($row = sql_fetsel('*', 'spip_evenements', 'id_evenement=' . intval($id_evenement))) { // Si ce n'est pas un événement source, on n'a rien à faire ici if ($row['id_evenement_source'] != 0) { return; } // On ne garde que les données correctes pour une modification $c = collecter_requests(objet_info('evenement', 'champs_editables'), array('id_evenement', 'id_evenement_source'), $row); // Savoir si la source était publiée ou pas $publie = $row['statut'] == 'publie'; // On calcule la durée en secondes de l'événement source pour la reporter telle quelle aux répétitions $date_debut = strtotime($row['date_debut']); $date_fin = strtotime($row['date_fin']); $duree = $date_fin - $date_debut; $repetitions_updated = array(); // mettre a jour toutes les repetitions deja existantes ou les supprimer si plus lieu $res = sql_select('id_evenement,date_debut', 'spip_evenements', 'id_evenement_source=' . intval($id_evenement)); while ($row = sql_fetch($res)) { $date = strtotime(date('Y-m-d', strtotime($row['date_debut']))); if (in_array($date, $repetitions)) { // Cette répétition existe déjà, on la met à jour $repetitions_updated[] = $date; // On calcule les nouvelles dates/heures en reportant la durée de la source $update_date_debut = date('Y-m-d', $date) . ' ' . date('H:i:s', $date_debut); $update_date_fin = date('Y-m-d H:i:s', strtotime($update_date_debut) + $duree); // Seules les dates sont changées dans les champs de la source // TODO : prendre en charge la mise a jour uniquement si conforme a l'original $c['date_debut'] = $update_date_debut; $c['date_fin'] = $update_date_fin; // mettre a jour l'evenement sql_updateq('spip_evenements', $c, 'id_evenement = ' . $row['id_evenement']); } else { // il est supprime sql_delete('spip_evenements', 'id_evenement=' . $row['id_evenement']); } } // regarder les repetitions a ajouter foreach ($repetitions as $date) { if (!in_array($date, $repetitions_updated)) { // On calcule les dates/heures en reportant la durée de la source $update_date_debut = date('Y-m-d', $date) . ' ' . date('H:i:s', $date_debut); $update_date_fin = date('Y-m-d H:i:s', strtotime($update_date_debut) + $duree); // Seules les dates sont changées dans les champs de la source $c['date_debut'] = $update_date_debut; $c['date_fin'] = $update_date_fin; // On crée la nouvelle répétition if ($id_evenement_new = agenda_action_insert_evenement($c['id_article'], $id_evenement)) { // Si c'est bon, on ajoute tous les champs sql_updateq('spip_evenements', $c, 'id_evenement = ' . $id_evenement_new); // Pour les créations il ne faut pas oublier de dupliquer les liens // En effet, sinon les documents insérés avant la création (0-id_auteur) ne seront pas dupliqués include_spip('action/editer_liens'); objet_dupliquer_liens('evenement', $id_evenement, $id_evenement_new); } } } } }
function generer_url_ecrire_entite_edit($id, $entite, $args = '', $ancre = '') { $exec = objet_info($entite, 'url_edit'); $url = generer_url_ecrire($exec, $args); if (intval($id)) { $url = parametre_url($url, id_table_objet($entite), $id); } else { $url = parametre_url($url, 'new', 'oui'); } if ($ancre) { $url = ancre_url($url, $ancre); } return $url; }
/** * Autorisation de changer de langue un contenu * * @param string $faire Action demandée * @param string $type Type d'objet sur lequel appliquer l'action * @param int $id Identifiant de l'objet * @param array $qui Description de l'auteur demandant l'autorisation * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon **/ function autoriser_changerlangue_dist($faire, $type, $id, $qui, $opt) { $multi_objets = explode(',', lire_config('multi_objets')); $gerer_trad_objets = explode(',', lire_config('gerer_trad_objets')); $table = table_objet_sql($type); if (in_array($table, $multi_objets) or in_array($table, $gerer_trad_objets)) { // affichage du formulaire si la configuration l'accepte $multi_secteurs = lire_config('multi_secteurs'); $champs = objet_info($type, 'field'); if ($multi_secteurs == 'oui' and array_key_exists('id_rubrique', $champs)) { // multilinguisme par secteur et objet rattaché à une rubrique if ($table != 'spip_rubriques') { // le choix de la langue se fait seulement sur les rubriques return false; } else { $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id)); if ($id_parent != 0) { // sous-rubriques : pas de choix de langue return false; } } } } else { return false; } return autoriser('modifier', $type, $id, $qui, $opt); }
/** * Filtre pour afficher l'img icone d'un objet * * @param string $objet * @param int $taille * @return string */ function objet_icone($objet, $taille = 24) { $icone = objet_info($objet, 'icone_objet') . "-" . $taille . ".png"; $icone = chemin_image($icone); $balise_img = charger_filtre('balise_img'); return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet'))) : ''; }
/** * Générer l'URL d'un objet dans l'espace privé * * L'URL est calculée en fonction de son état publié ou non, * calculé à partir de la déclaration de statut. * * @param string $objet Type d'objet * @param int $id Identifiant de l'objet * @param string $args * @param string $ancre * @param bool|null $public * @param string $connect * @return string * */ function generer_url_ecrire_objet($objet, $id, $args = '', $ancre = '', $public = null, $connect = '') { static $furls = array(); if (!isset($furls[$objet])) { if (function_exists($f = 'generer_url_ecrire_' . $objet) or $f = charger_fonction($f, 'urls', true)) { $furls[$objet] = $f; } else { $furls[$objet] = ''; } } if ($furls[$objet]) { return $furls[$objet]($id, $args, $ancre, $public, $connect); } // si pas de flag public fourni // le calculer en fonction de la declaration de statut if (is_null($public) and !$connect) { $public = objet_test_si_publie($objet, $id, $connect); } if ($public or $connect) { return generer_url_entite_absolue($id, $objet, $args, $ancre, $connect); } $a = id_table_objet($objet) . "=" . intval($id); if (!function_exists('objet_info')) { include_spip('inc/filtres'); } return generer_url_ecrire(objet_info($objet, 'url_voir'), $a . ($args ? "&{$args}" : '')) . ($ancre ? "#{$ancre}" : ''); }
/** * Compile la balise `#INTRODUCTION` * * Retourne une introduction d'un objet éditorial, c'est à dire les 600 * premiers caractères environ du champ 'texte' de l'objet ou le contenu * indiqué entre `<intro>` et `</intro>` de ce même champ. * * Pour les articles, l'introduction utilisée est celle du champ `descriptif` * s'il est renseigné, sinon il est pris dans les champs `chapo` et `texte` et * est par défaut limité à 500 caractères. * * Pour les rubriques, l'introduction utilisée est celle du champ `descriptif` * s'il est renseigné, sinon du champ texte. * * La balise accèpte 1 paramètre indiquant la longueur en nombre de caractères * de l'introduction. * * @see filtre_introduction_dist() * @example * ``` * #INTRODUCTION * #INTRODUCTION{300} * ``` * * @balise * @link http://www.spip.net/@introduction * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer **/ function balise_INTRODUCTION_dist($p) { $type = $p->type_requete; $_texte = champ_sql('texte', $p); $_descriptif = ($type == 'articles' or $type == 'rubriques') ? champ_sql('descriptif', $p) : "''"; if ($type == 'articles') { $_chapo = champ_sql('chapo', $p); $_texte = "(strlen({$_descriptif}))\n\t\t? ''\n\t\t: {$_chapo} . \"\\n\\n\" . {$_texte}"; } // longueur en parametre, ou valeur par defaut $longueur_defaut = objet_info($type, 'introduction_longueur'); if (!$longueur_defaut) { $longueur_defaut = 600; } $_suite = 'null'; $_longueur = $longueur_defaut; if (($v = interprete_argument_balise(1, $p)) !== null) { $_longueur = 'is_numeric(' . $v . ')?intval(' . $v . '):' . $longueur_defaut; $_suite = '!is_numeric(' . $v . ')?' . $v . ':null'; } if (($v2 = interprete_argument_balise(2, $p)) !== null) { $_suite = $v2; } $f = chercher_filtre('introduction'); $p->code = "{$f}({$_descriptif}, {$_texte}, {$_longueur}, \$connect, {$_suite})"; #$p->interdire_scripts = true; $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro return $p; }
/** * Importe une description de champs extras donnée * * @param array $description * description des champs extras (table sql => liste des champs extras) * @param string $message * message de retour, rempli par cette fonction * @param bool $fusionner_doublons * true si on fusionne les champs présents dans la sauvegarde et aussi présents sur le site. False pour les ignorer. * @return bool * true si tout s'est bien passé, false sinon **/ function iextras_importer_description($description, &$message, $fusionner_doublons = false) { include_spip('inc/iextras'); include_spip('inc/saisies'); include_spip('inc/texte'); include_spip('inc/cextras'); $tables_sql_presentes = array_keys(lister_tables_objets_sql()); $message = ''; $nbt = count($description); $message .= "{{Fichier importé :}}\n"; $message .= "- {$nbt} objets éditoriaux.\n"; $nbc = 0; foreach ($description as $table => $saisies) { $nbc += count($saisies); } $message .= "- {$nbc} champs extras.\n"; foreach ($description as $table => $saisies) { if (!in_array($table, $tables_sql_presentes)) { $message .= "\nTable {{ {$table} }} absente sur le site\n"; $message .= count($saisies) . " champs extras ignorés !!\n"; continue; } $champs_presents = $champs_futurs = iextras_champs_extras_definis($table); $champs_presents_par_nom = saisies_lister_par_nom($champs_presents); $objet = objet_type($table); $titre = _T(objet_info($objet, 'texte_objets')); $message .= "\n{{ {$titre} :}}\n"; $message .= count($saisies) . " champs extras\n"; foreach ($saisies as $saisie) { $nom = isset($saisie['options']['nom']) ? $saisie['options']['nom'] : ''; if (!$nom) { $message .= "- !! Saisie sans nom ignorée\n"; continue; } // champ déjà présent ? if (isset($champs_presents_par_nom[$nom])) { if ($fusionner_doublons) { $message .= "- {{ {$nom} :}} modifié (déjà présent)\n"; $champs_futurs = saisies_modifier($champs_futurs, $nom, $saisie); } else { $message .= "- {{ {$nom} :}} ignoré (déjà présent)\n"; } } else { $message .= "- {{ {$nom} :}} ajouté\n"; $champs_futurs = saisies_inserer($champs_futurs, $saisie); } } $diff = saisies_comparer_par_identifiant($champs_presents, $champs_futurs); // ajouter les nouveaux champs; if ($diff['ajoutees']) { $message .= count($diff['ajoutees']) . " champs ajoutés.\n"; champs_extras_creer($table, $diff['ajoutees']); } // modifier les champs modifies; if ($diff['modifiees']) { $message .= count($diff['modifiees']) . " champs modifiés.\n"; $anciennes = saisies_lister_par_identifiant($champs_presents); $anciennes = array_intersect_key($anciennes, $diff['modifiees']); champs_extras_modifier($table, $diff['modifiees'], $anciennes); } // enregistrer la nouvelle config if ($diff['ajoutees'] or $diff['modifiees']) { ecrire_meta("champs_extras_" . $table, serialize($champs_futurs)); } else { $message .= "Aucune modification !\n"; } } $message = propre($message); return true; }