function urls_generer_url_ecrire_forum_dist($id, $args = '', $ancre = '', $public = null, $connect = '') { $a = "id_forum=" . intval($id); if (is_null($public) and !$connect) { $public = objet_test_si_publie('forum', $id, $connect); } $h = ($public or $connect) ? generer_url_entite_absolue($id, 'forum', $args, $ancre, $connect) : generer_url_ecrire('controler_forum', "debut_forum=@{$id}" . ($args ? "&{$args}" : '')) . ($ancre ? "#{$ancre}" : ''); return $h; }
/** * Detecter les demande d'acces aux pages restreintes * et re-orienter vers une 401 si necessaire * * @param array $contexte * @return array */ function accesrestreint_page_indisponible($contexte) { if ($contexte['status'] == '404') { $objet = ""; if (isset($contexte['type'])) { $objet = $contexte['type']; } elseif (isset($contexte['type-page'])) { $objet = $contexte['type-page']; } elseif (isset($contexte['fond_erreur'])) { include_spip('inc/urls'); define('_DEFINIR_CONTEXTE_TYPE_PAGE', true); $c2 = $contexte; list($fond2, $c2, $url_redirect) = urls_decoder_url(nettoyer_uri(), $contexte['fond_erreur'], $c2, true); $objet = $c2['type-page']; } if ($objet) { $table_sql = table_objet_sql($objet); $id_table_objet = id_table_objet($objet); if ($id = intval($contexte[$id_table_objet])) { $publie = true; if (include_spip("base/objets") and function_exists("objet_test_si_publie")) { $publie = objet_test_si_publie($objet, $id); } else { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (isset($desc['field']['statut'])) { $statut = sql_getfetsel('statut', $table_sql, "{$id_table_objet}=" . intval($id)); if ($statut != 'publie') { $publie = false; } } } include_spip('inc/autoriser'); if ($publie and !autoriser('voir', $objet, $id)) { // c'est un contenu restreint $contexte['status'] = '401'; $contexte['code'] = '401 Unauthorized'; $contexte['fond'] = '401'; $contexte['erreur'] = _T('accesrestreint:info_acces_restreint'); $contexte['cible'] = self(); if (!isset($contexte['objet'])) { $contexte['objet'] = $objet; $contexte['id_objet'] = $id; } } } } } return $contexte; }
/** * Appelle toutes les fonctions de modification d'un objet * $err est un message d'erreur eventuelle * * @param string $objet * @param int $id * @param array|null $set * @return mixed|string */ function objet_modifier($objet, $id, $set = null) { if (include_spip('action/editer_' . $objet) and function_exists($modifier = $objet . "_modifier")) { return $modifier($id, $set); } $table_sql = table_objet_sql($objet); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (!$desc or !isset($desc['field'])) { spip_log("Objet {$objet} inconnu dans objet_modifier", _LOG_ERREUR); return _L("Erreur objet {$objet} inconnu"); } include_spip('inc/modifier'); $champ_date = ''; if (isset($desc['date']) and $desc['date']) { $champ_date = $desc['date']; } elseif (isset($desc['field']['date'])) { $champ_date = 'date'; } $white = array_keys($desc['field']); // on ne traite pas la cle primaire par defaut, notamment car // sur une creation, id_x vaut 'oui', et serait enregistre en id_x=0 dans la base $white = array_diff($white, array($desc['key']['PRIMARY KEY'])); if (isset($desc['champs_editables']) and is_array($desc['champs_editables'])) { $white = $desc['champs_editables']; } $c = collecter_requests($white, array($champ_date, 'statut', 'id_parent', 'id_secteur'), $set); // Si l'objet est publie, invalider les caches et demander sa reindexation if (objet_test_si_publie($objet, $id)) { $invalideur = "id='{$objet}/{$id}'"; $indexation = true; } else { $invalideur = ""; $indexation = false; } if ($err = objet_modifier_champs($objet, $id, array('nonvide' => '', 'invalideur' => $invalideur, 'indexation' => $indexation, 'date_modif' => isset($desc['field']['date_modif']) ? 'date_modif' : ''), $c)) { return $err; } // Modification de statut, changement de rubrique ? // FIXME: Ici lorsqu'un $set est passé, la fonction collecter_requests() retourne tout // le tableau $set hors black liste, mais du coup on a possiblement des champs en trop. $c = collecter_requests(array($champ_date, 'statut', 'id_parent'), array(), $set); $err = objet_instituer($objet, $id, $c); return $err; }
function formulaires_editer_evenement_traiter_dist($id_evenement = 'new', $id_article = 0, $retour = '', $lier_trad = 0, $config_fonc = 'evenements_edit_config', $row = array(), $hidden = '') { set_request('horaire', _request('horaire') == 'non' ? 'non' : 'oui'); set_request('inscription', _request('inscription') ? 1 : 0); include_spip('inc/date_gestion'); $erreurs = array(); $date_debut = verifier_corriger_date_saisie('debut', _request('horaire') == 'oui', $erreurs); $date_fin = verifier_corriger_date_saisie('fin', _request('horaire') == 'oui', $erreurs); set_request('date_debut', date('Y-m-d H:i:s', $date_debut)); set_request('date_fin', date('Y-m-d H:i:s', $date_fin)); $res = formulaires_editer_objet_traiter('evenement', $id_evenement, $id_article, 0, $retour, $config_fonc, $row, $hidden); // si c'est une creation dans un article publie, passer l'evenement en publie // l'article peut être renseigné/modifié par l'utilisateur dans le formulaire. On le retrouve. if (!intval($id_evenement) and $id_article = sql_getfetsel('id_article', 'spip_evenements', 'id_evenement=' . $res['id_evenement']) and objet_test_si_publie('article', $id_article)) { // sera refuse si auteur pas autorise evenement_modifier($res['id_evenement'], array('statut' => 'publie')); } // a la creation, documenter la date de creation if (!intval($id_evenement)) { evenement_modifier($res['id_evenement'], array('date_creation' => date('Y-m-d H:i:s'))); } $id_evenement = $res['id_evenement']; if ($res['redirect']) { if (strpos($res['redirect'], 'article') !== false) { $id_article = sql_getfetsel('id_article', 'spip_evenements', 'id_evenement=' . intval($id_evenement)); $res['redirect'] = parametre_url($res['redirect'], 'id_article', $id_article); } } return $res; }
/** * Traitement du formulaire d'édition d'une date * * @param string $objet * Type d'objet * @param int $id_objet * Identifiant de l'objet * @param string $retour * URL de redirection après le traitement * @param array|string $options * Options. * @return Array * Retours des traitements */ function formulaires_dater_traiter_dist($objet, $id_objet, $retour = '', $options = array()) { $res = array('editable' => ' '); if (_request('changer')) { $_id_objet = id_table_objet($objet); $table = table_objet($objet); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table); if (!$desc) { return array('message_erreur' => _L('erreur')); } #impossible en principe $champ_date = $desc['date'] ? $desc['date'] : 'date'; $set = array(); $charger = charger_fonction("charger", "formulaires/dater/"); $v = $charger($objet, $id_objet, $retour, $options); if ($v['_editer_date']) { if (!($d = dater_recuperer_date_saisie(_request('date_jour')))) { $d = array(date('Y'), date('m'), date('d')); } if (!($h = dater_recuperer_heure_saisie(_request('date_heure')))) { $h = array(0, 0); } $set[$champ_date] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]); } if (isset($desc['field']['date_redac']) and $v['_editer_date_anterieure']) { if (!_request('date_redac_jour') or _request('sans_redac')) { $set['date_redac'] = sql_format_date(0, 0, 0, 0, 0, 0); } else { if (!($d = dater_recuperer_date_saisie(_request('date_redac_jour'), "date_redac"))) { $d = array(date('Y'), date('m'), date('d')); } if (!($h = dater_recuperer_heure_saisie(_request('date_redac_heure')))) { $h = array(0, 0); } $set['date_redac'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]); } } if (count($set)) { $publie_avant = objet_test_si_publie($objet, $id_objet); include_spip('action/editer_objet'); objet_modifier($objet, $id_objet, $set); $publie_apres = objet_test_si_publie($objet, $id_objet); if ($publie_avant !== $publie_apres) { // on refuse ajax pour forcer le rechargement de la page ici // on refera traiter une 2eme fois, mais c'est sans consequence refuser_traiter_formulaire_ajax(); } } } if ($retour) { $res['redirect'] = $retour; } set_request('date_jour'); set_request('date_redac_jour'); set_request('date_heure'); set_request('date_redac_heure'); return $res; }
/** * 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}" : ''); }
function inc_lien_dist($lien, $texte = '', $class = '', $title = '', $hlang = '', $rel = '', $connect = '', $env = array()) { static $u = null; if (!$u) { $u = url_de_base(); } $typo = false; // Si une langue est demandee sur un raccourci d'article, chercher // la traduction ; // - [{en}->art2] => traduction anglaise de l'article 2, sinon art 2 // - [{}->art2] => traduction en langue courante de l'art 2, sinon art 2 // s'applique a tout objet traduit if ($hlang and $match = typer_raccourci($lien)) { @(list($type, , $id, , $args, , $ancre) = $match); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table(table_objet($type, $connect), $connect); if ($desc and $id_table_objet = $desc['key']['PRIMARY KEY']) { $table_objet_sql = $desc['table']; if ($row = sql_fetsel('*', $table_objet_sql, "{$id_table_objet}=" . intval($id)) and isset($row['id_trad']) and isset($row['lang']) and $id_dest = sql_getfetsel($id_table_objet, $table_objet_sql, "id_trad=" . intval($row['id_trad']) . " AND lang=" . sql_quote($hlang)) and objet_test_si_publie($type, $id_dest)) { $lien = "{$type}{$id_dest}"; } else { $hlang = ''; } } else { $hlang = ''; } } $mode = ($texte and $class) ? 'url' : 'tout'; $lien = calculer_url($lien, $texte, $mode, $connect); if ($mode === 'tout') { $texte = $lien['titre']; if (!$class and isset($lien['class'])) { $class = $lien['class']; } $lang = isset($lien['lang']) ? $lien['lang'] : ''; $mime = isset($lien['mime']) ? " type='" . $lien['mime'] . "'" : ""; $lien = $lien['url']; } $lien = trim($lien); if (strncmp($lien, "#", 1) == 0) { # ancres pures (internes a la page) $class = 'spip_ancre'; } elseif (strncasecmp($lien, 'mailto:', 7) == 0) { # pseudo URL de mail $class = "spip_mail"; } elseif (strncmp($texte, '<html>', 6) == 0) { # cf traiter_lien_explicite $class = "spip_url spip_out"; } elseif (!$class) { $class = "spip_out"; } # si pas spip_in|spip_glossaire // Si l'objet n'est pas de la langue courante, on ajoute hreflang if (!$hlang and $lang !== $GLOBALS['spip_lang']) { $hlang = $lang; } $lang = $hlang ? " hreflang='{$hlang}'" : ''; if ($title) { $title = ' title="' . attribut_html($title) . '"'; } else { $title = ''; } // $title peut etre 'false' // rel=external pour les liens externes if ((strncmp($lien, 'http://', 7) == 0 or strncmp($lien, 'https://', 8) == 0) and strncmp("{$lien}/", $u, strlen($u)) != 0) { $rel = trim("{$rel} external"); } if ($rel) { $rel = " rel='{$rel}'"; } // si pas de modele dans le texte du lien, on peut juste passer typo sur le texte, c'est plus rapide // les rares cas de lien qui encapsule un modele passe en dessous, c'est plus lent if (traiter_modeles($texte, false, '', $connect, null, $env) == $texte) { $texte = typo($texte, true, $connect, $env); $lien = "<a href=\"" . str_replace('"', '"', $lien) . "\" class='{$class}'{$lang}{$title}{$rel}" . (isset($mime) ? $mime : '') . ">{$texte}</a>"; return $lien; } # ceci s'execute heureusement avant les tableaux et leur "|". # Attention, le texte initial est deja echappe mais pas forcement # celui retourne par calculer_url. # Penser au cas [<imgXX|right>->URL], qui exige typo('<a>...</a>') $lien = "<a href=\"" . str_replace('"', '"', $lien) . "\" class='{$class}'{$lang}{$title}{$rel}{$mime}>{$texte}</a>"; $res = typo($lien, true, $connect, $env); // dans ce cas, echapons le resultat du modele pour que propre etc ne viennent pas pouicher le html $res = echappe_html("<html>{$res}</html>"); return $res; }
/** * Appelle toutes les fonctions de modification d'un objet * $err est un message d'erreur eventuelle * * @param int $id * @param array|null $set * @return mixed|string */ function reservation_credit_mouvement_modifier($id, $set = null) { $table_sql = 'spip_reservation_credit_mouvements'; $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (!$desc or !isset($desc['field'])) { spip_log("Objet 'spip_reservation_credit_mouvement' inconnu dans objet_modifier", _LOG_ERREUR); return _L("Erreur objet 'spip_reservation_credit_mouvement' inconnu"); } include_spip('inc/modifier'); $champ_date = ''; if (isset($desc['date']) and $desc['date']) { $champ_date = $desc['date']; } elseif (isset($desc['field']['date'])) { $champ_date = 'date'; } $white = array_keys($desc['field']); // on ne traite pas la cle primaire par defaut, notamment car // sur une creation, id_x vaut 'oui', et serait enregistre en id_x=0 dans la base $white = array_diff($white, array($desc['key']['PRIMARY KEY'])); if (isset($desc['champs_editables']) and is_array($desc['champs_editables'])) { $white = $desc['champs_editables']; } // Si il n'y pas encore de compte crédit pour l'email en question, on le crée $id_reservation_credit = _request('id_reservation_credit') ? _request('id_reservation_credit') : (isset($set['id_reservation_credit']) ? $set['id_reservation_credit'] : ''); $email = _request('email') ? _request('email') : (isset($set['email']) ? $set['email'] : ''); if (!$id_reservation_credit) { if (!($id_reservation_credit = sql_getfetsel('id_reservation_credit', 'spip_reservation_credits', 'email = ' . sql_quote($email)))) { $action = charger_fonction('editer_objet', 'action'); $reservation_credit = $action('new', 'reservation_credit'); $id_reservation_credit = $reservation_credit[0]; } } $c = collecter_requests($white, array($champ_date, 'statut', 'id_parent', 'id_secteur'), $set); $c['id_reservation_credit'] = $id_reservation_credit; // Si l'objet est publie, invalider les caches et demander sa reindexation if (objet_test_si_publie('reservation_credit_mouvement', $id)) { $invalideur = "id='reservation_credit_mouvement/{$id}'"; $indexation = true; } else { $invalideur = ""; $indexation = false; } if ($err = objet_modifier_champs('reservation_credit_mouvement', $id, array('nonvide' => '', 'invalideur' => $invalideur, 'indexation' => $indexation, 'date_modif' => isset($desc['field']['date_modif']) ? 'date_modif' : ''), $c)) { return $err; } // Modification de statut, changement de rubrique ? // FIXME: Ici lorsqu'un $set est passé, la fonction collecter_requests() retourne tout // le tableau $set hors black liste, mais du coup on a possiblement des champs en trop. $c = collecter_requests(array($champ_date, 'statut', 'id_parent'), array(), $set); $err = objet_instituer('reservation_credit_mouvement', $id, $c); // Actualiser le montant de crédit $sql = sql_select('montant,type,devise', 'spip_reservation_credit_mouvements', 'id_reservation_credit=' . $id_reservation_credit); $montant = array(); while ($data = sql_fetch($sql)) { $id = isset($data['devise']) ? $data['devise'] : 'sans_devise'; if ($data['type'] == 'credit') { $montant[$id] = $montant[$id] + $data['montant']; } elseif ($data['type'] == 'debit') { $montant[$id] = $montant[$id] - $data['montant']; } } sql_updateq('spip_reservation_credits', array('credit' => serialize($montant)), 'id_reservation_credit=' . $id_reservation_credit); return $err; }
/** * Trouver le titre d'un objet publie * * @param string $objet * @param int $id_objet * @param int $id_forum * @param bool $publie * @return bool|string */ function forum_recuperer_titre_dist($objet, $id_objet, $id_forum = 0, $publie = true) { include_spip('inc/filtres'); $titre = ""; if ($f = charger_fonction($objet . '_forum_extraire_titre', 'inc', true)) { $titre = $f($id_objet); } else { include_spip('base/objets'); if ($publie and !objet_test_si_publie($objet, $id_objet)) { return false; } $titre = generer_info_entite($id_objet, $objet, 'titre', '*'); } if ($titre and $id_forum) { $titre_m = sql_getfetsel('titre', 'spip_forum', "id_forum = " . intval($id_forum)); if (!$titre_m) { return false; // URL fabriquee } $titre = $titre_m; } $titre = supprimer_numero($titre); $titre = str_replace('~', ' ', extraire_multi($titre)); return $titre; }
/** * determiner le statut d'un document : prepa/publie * si on trouve un element joint sans champ statut ou avec un statut='publie' alors le doc est publie aussi * * @param int $id_document * @param array $champs * @return bool */ function document_instituer($id_document, $champs = array()) { $statut = isset($champs['statut']) ? $champs['statut'] : null; $date_publication = isset($champs['date_publication']) ? $champs['date_publication'] : null; if (isset($champs['parents'])) { medias_revision_document_parents($id_document, $champs['parents']); } if (isset($champs['ajout_parents'])) { medias_revision_document_parents($id_document, $champs['ajout_parents'], true); } $row = sql_fetsel("statut,date_publication", "spip_documents", "id_document={$id_document}"); $statut_ancien = $row['statut']; $date_publication_ancienne = $row['date_publication']; /* Autodetermination du statut si non fourni */ if (is_null($statut)) { $statut = 'prepa'; $trouver_table = charger_fonction('trouver_table', 'base'); $res = sql_select('id_objet,objet', 'spip_documents_liens', "objet!='document' AND id_document=" . intval($id_document)); // dans 10 ans, ca nous fera un bug a corriger vers 2018 // penser a ouvrir un ticket d'ici la :p $date_publication = time() + 10 * 365 * 24 * 3600; include_spip('base/objets'); while ($row = sql_fetch($res)) { if ($row['objet'] == 'rubrique' or objet_test_si_publie($row['objet'], $row['id_objet'])) { $statut = 'publie'; $date_publication = 0; continue; } elseif ($row['objet'] == 'article' and $row2 = sql_fetsel('date', 'spip_articles', 'id_article=' . intval($row['id_objet']) . " AND statut='publie'")) { $statut = 'publie'; $date_publication = min($date_publication, strtotime($row2['date'])); } } $date_publication = date('Y-m-d H:i:s', $date_publication); if ($statut == 'publie' and $statut_ancien == 'publie' and $date_publication == $date_publication_ancienne) { return false; } if ($statut != 'publie' and $statut_ancien != 'publie' and $statut_ancien != '0') { return false; } } if ($statut !== $statut_ancien or $date_publication != $date_publication_ancienne) { sql_updateq('spip_documents', array('statut' => $statut, 'date_publication' => $date_publication), 'id_document=' . intval($id_document)); if ($statut !== $statut_ancien) { $publier_rubriques = sql_allfetsel('id_objet', 'spip_documents_liens', "objet='rubrique' AND id_document=" . intval($id_document)); if (count($publier_rubriques)) { include_spip('inc/rubriques'); foreach ($publier_rubriques as $r) { calculer_rubriques_if($r['id_objet'], array('statut' => $statut), $statut_ancien, false); } } } return true; } return false; }