예제 #1
0
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;
}
예제 #2
0
/**
 * 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;
}
예제 #3
0
/**
 * 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;
}
예제 #4
0
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;
}
예제 #5
0
파일: dater.php 프로젝트: JLuc/SPIP
/**
 * 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;
}
예제 #6
0
/**
 * 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}" : '');
}
예제 #7
0
파일: lien.php 프로젝트: loorenzooo/aslfc
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('"', '&quot;', $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('"', '&quot;', $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;
}
예제 #9
0
/**
 * 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;
}
예제 #10
0
/**
 * 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;
}