Beispiel #1
0
/**
 * Traitement
 *
 * @param string $type
 * @param int $id
 * @return array
 */
function formulaires_editer_url_objet_traiter($type, $id)
{
    $valeurs = array('editable' => true);
    include_spip('action/editer_url');
    // les urls manuelles sont toujours permanentes
    $set = array('url' => _request('url'), 'type' => $type, 'id_objet' => $id, 'perma' => 1);
    $type_urls = (isset($GLOBALS['type_urls']) and $GLOBALS['type_urls'] != 'page') ? $GLOBALS['type_urls'] : $GLOBALS['meta']['type_urls'];
    if (include_spip("urls/{$type_urls}") and function_exists($renseigner_url = "renseigner_url_{$type_urls}") and $r = $renseigner_url($type, $id) and isset($r['parent'])) {
        $set['id_parent'] = $r['parent'];
    }
    $separateur = "-";
    if (defined('_url_sep_id')) {
        $separateur = _url_sep_id;
    }
    if (url_insert($set, false, $separateur)) {
        set_request('url');
        $valeurs['message_ok'] = _T("urls:url_ajoutee");
    } else {
        $valeurs['message_erreur'] = _T("urls:url_ajout_impossible");
    }
    return $valeurs;
}
Beispiel #2
0
function spip_importer_articles($spip_data)
{
    global $tables_conversion;
    foreach ($spip_data as $entry) {
        $id_rubrique = null;
        $type = $entry['metadata']['type'];
        journaliser(sprintf("Traitement d'un nouvel item : %s - %s", $entry['metadata']['nid'], $type), 2);
        if (binlog_contient($entry['metadata']['nid'])) {
            journaliser("L'élément %s a déjà été converti", $entry['metadata']['nid']);
            continue;
        }
        journaliser("Recherche de la catégorie cible pour l'article");
        /* FIXME: doit être déplacé hors de cette fonction (spécifique site cible). */
        /* CATEGORIE CIBLE */
        /* Remarque : les articles de type 'story' sont dispatchés par la
         * fonction dispatch_story_type() */
        $cat_cible = array('video' => 14, 'photos' => 23, 'audio' => 24, 'commission' => 36, 'livre' => 15, 'evenement' => 11);
        $fct = "dispatch_{$type}_type";
        if (function_exists($fct)) {
            $id_rubrique = call_user_func($fct, $entry);
        } elseif ($cat_cible[$type]) {
            $id_rubrique = $cat_cible[$type];
        }
        if ($id_rubrique == null) {
            journaliser("Catégorie cible introuvable pour le type de contenu " . $type, 4);
            die;
        }
        journaliser("Envoi de l'article dans la rubrique %s", $id_rubrique, 1);
        /* --- VIDEO --- */
        if ($type == "video") {
            if ($entry['documents']['video']) {
                /* Si une vidéo est présente dans ce champ, il faut modifier le
                 * texte de l'article et ajouter le lien vers la video à la
                 * fin. */
                $entry['article']['texte'] .= sprintf("\n\n%s", $entry['documents']['video']);
            }
        }
        /* --- AUDIO --- */
        if ($type == "audio") {
            journaliser("Gestion des documents audio");
            $audio_path = $entry['documents']['audio'];
            $audio_name = $entry['documents']['audio_name'];
            $id_document = importer_document($audio_path, $audio_name);
            journaliser("Import du document : " . $id_document, 1);
            $entry['article']['texte'] = sprintf("<emb%s>\nRéalisation : %s\n\n%s", $id_document, $entry['documents']['audio_desc'], $entry['article']['texte']);
            document_modifier($id_document, array('credits' => $entry['documents']['audio_desc']));
        }
        /* --- PIECES JOINTES --- */
        if ($entry['documents']['pdf']) {
            journaliser("Ajout des pièces jointes au format PDF");
            foreach ($entry['documents']['pdf'] as $document) {
                $id_document = importer_document($document['filepath'], $document['filename']);
                journaliser(sprintf("Document PDF %s importé", $id_document), 1);
                $entry['article']['texte'] = sprintf("%s\n\n<lecteurpdf%s>", $entry['article']['texte'], $id_document);
            }
        }
        /* --- ARTICLE --- */
        journaliser("Création du nouvel article");
        $id_article = article_inserer($id_rubrique);
        journaliser("Nouvel article créee : {$id_article}", 1);
        //print_r($entry['article']);
        article_modifier($id_article, $entry['article']);
        journaliser("Ajout des données dans l'article n° {$id_article}", 1);
        /* --- AUTEUR => ARTICLE --- */
        journaliser("Création ou récupération des auteurs qui doivent être associées à l'article");
        $id_auteurs = array();
        if ($entry['auteur']['nom']) {
            foreach ($entry['auteur']['nom'] as $nom_auteur) {
                journaliser("Recherche de l'auteur « {$nom_auteur} »", 1);
                if ($id = sql_getfetsel("id_auteur", "spip_auteurs", 'nom LIKE ' . sql_quote("% - {$nom_auteur}"))) {
                    journaliser("« {$nom_auteur} » trouvé : {$id} (REGEXP)", 1);
                    $id_auteurs[] = $id;
                } elseif ($id = sql_getfetsel("id_auteur", "spip_auteurs", 'nom=' . sql_quote($nom_auteur))) {
                    journaliser("« {$nom_auteur} » trouvé : {$id}", 1);
                    $id_auteurs[] = $id;
                } else {
                    $id = auteur_inserer();
                    auteur_modifier($id, array('nom' => $nom_auteur, 'statut' => '1comite'));
                    $id_auteurs[] = $id;
                    journaliser("« {$nom_auteur} » créé : {$id}", 1);
                }
            }
            foreach ($id_auteurs as $id) {
                journaliser("Association de l'auteur %s à l'article", $id, 1);
                auteur_associer($id, array('article' => $id_article));
            }
        }
        if (!in_array(1, $id_auteurs)) {
            journaliser("Retrait de l'auteur 1", 1);
            auteur_dissocier(1, array('article' => $id_article));
        }
        /* --- CAMPAGNE --- */
        if ($entry['metadata']['campagne']) {
            journaliser("Ajout des mots-clés de campagne");
            foreach ($entry['metadata']['campagne'] as $campagne) {
                journaliser("Association du mot clé %s à l'article %s", $campagne, $id_article, 1);
                mot_associer($campagne, array('article' => $id_article));
            }
        }
        /* --- ATTACPÉDIA --- */
        if ($entry['metadata']['attacpedia']) {
            journaliser("Ajout des mots-clés Attacpédia");
            foreach ($entry['metadata']['attacpedia'] as $attacpedia) {
                journaliser("Association du mot clé %s à l'article %s", $attacpedia, $id_article, 1);
                mot_associer($attacpedia, array('article' => $id_article));
            }
        }
        /* EVENEMENT */
        if ($type == "evenement") {
            journaliser("Création de l'évènement");
            foreach ($entry['evenement']['dates'] as $dates_evt) {
                $id_evenement = evenement_inserer($id_article);
                journaliser("Numéro de l'évènement : %s", $id_evenement, 1);
                evenement_modifier($id_evenement, array('titre' => $entry['article']['titre'], 'lieu' => $entry['evenement']['lieu'], 'date_debut' => $dates_evt['date_debut'], 'date_fin' => $dates_evt['date_fin'], 'statut' => $entry['article']['statut']));
                journaliser("Géolocation GIS", 1);
                $id_gis = gis_inserer();
                journaliser("Création du lieu GIS : %s", $id_gis, 1);
                gis_modifier($id_gis, $entry['gis']);
                lier_gis($id_gis, "evenement", $id_evenement);
                journaliser("Lien de l'évènement %s au lieu %s", $id_evenement, $id_gis, 1);
            }
        }
        /* --- TYPE D'EVENEMENT --- */
        if ($type == "evenement") {
            $id_mot_drupal = $entry['metadata']['type_evenement'];
            $mod_evt = $tables_conversion['type_evenement'][$id_mot_drupal];
            mot_associer($mod_evt, array('article' => $id_article));
            journaliser("Association du mot clé %s/%s à l'article %s", $id_mot_drupal, $mod_evt, $id_article, 1);
        }
        /* --- PIECES JOINTES --- */
        if ($entry['documents']['pj']) {
            journaliser("Ajout des pièces jointes");
            foreach ($entry['documents']['pj'] as $document) {
                $id_document = importer_document($document['filepath'], $document['filename'], $id_article);
                journaliser(sprintf("Document %s importé", $id_document), 1);
            }
        }
        /* --- GALERIES PHOTO --- */
        if ($entry['documents']['photos']) {
            journaliser("Ajout des pĥotos jointes");
            foreach ($entry['documents']['photos'] as $document) {
                $id_document = importer_document($document['filepath'], $document['filename'], $id_article, "document");
                journaliser(sprintf("Document %s importé", $id_document), 1);
            }
        }
        /* --- URL --- */
        journaliser("Gestion des URL");
        $urls = array();
        $urls[] = "node/" . $entry['metadata']['nid'];
        $urls[] = $entry['url']['url'];
        foreach ($urls as $url) {
            if ($url) {
                if ($url_existante = sql_fetsel(array('id_objet', 'type'), 'spip_urls', 'url=' . sql_quote($url))) {
                    journaliser(sprintf("URL ({$url}) déjà existante (%s / %s)", $url_existante['type'], $url_existante['id_objet']), 4);
                } else {
                    $sql_url = array('url' => $url, 'type' => 'article', 'id_objet' => $id_article, 'perma' => 1, 'id_parent' => $id_rubrique);
                    url_insert($sql_url, false, '-');
                    journaliser(sprintf("URL ajoutée : %s/%s", $GLOBALS['meta']['adresse_site'], $url), 1);
                }
            }
        }
        /* --- LOGO --- */
        if ($entry['logo']['chemin']) {
            journaliser("Import du logo");
            $remote = sprintf("http://www.france.attac.org/%s", $entry['logo']['chemin']);
            $filename = $entry['logo']['fichier'];
            $fic = copie_locale($remote, 'auto', determine_upload() . $filename);
            journaliser("Logo ({$remote}) => {$fic}", 1);
            $spip_image_ajouter = charger_fonction('spip_image_ajouter', 'action');
            $spip_image_ajouter('arton' . $id_article, true, $filename);
            spip_unlink($fic);
        }
        $dest_url = sprintf("%s/%s", $GLOBALS['meta']['adresse_site'], $id_article);
        journaliser(sprintf("Article publié : <%s>", $dest_url), 2);
        binlog($entry['metadata']['nid'], $entry['metadata']['type'], $id_article, $entry['article']['titre'], $dest_url);
    }
}
Beispiel #3
0
function declarer_url_propre($type, $id_objet)
{
    $trouver_table = charger_fonction('trouver_table', 'base');
    $desc = $trouver_table(table_objet($type));
    $table = $desc['table'];
    $champ_titre = $desc['titre'] ? $desc['titre'] : 'titre';
    $col_id = @$desc['key']["PRIMARY KEY"];
    if (!$col_id) {
        return false;
    }
    // Quand $type ne reference pas une table
    $id_objet = intval($id_objet);
    // Recuperer une URL propre correspondant a l'objet.
    // mais urls a 1 segment uniquement (pas d'urls /)
    // de preference avec id_parent=0, puis perma, puis par date desc
    $row = sql_fetsel("U.url, U.date, U.id_parent, U.perma, {$champ_titre}", "{$table} AS O LEFT JOIN spip_urls AS U ON (U.type='{$type}' AND U.id_objet=O.{$col_id})", "O.{$col_id}={$id_objet} AND (U.segments IS NULL OR U.segments=1)", '', 'U.id_parent=0 DESC, U.perma DESC, U.date DESC', 1);
    // en SQLite le left join retourne du vide si il y a une url mais qui ne correspond pas pour la condition sur le segment
    // on verifie donc que l'objet existe bien avant de sortir ou de creer une url pour cet objet
    if (!$row) {
        $row = sql_fetsel("'' as url, '' as date, 0 as id_parent, 0 as perma, {$champ_titre}", "{$table} AS O", "O.{$col_id}={$id_objet}");
    }
    if (!$row) {
        return "";
    }
    # Quand $id_objet n'est pas un numero connu
    $url_propre = $row['url'];
    // si url_propre connue mais avec id_parent non nul, essayer de reinserer tel quel avec id_parent=0
    if ($url_propre and $row['id_parent']) {
        include_spip('action/editer_url');
        $set = array('url' => $url_propre, 'type' => $type, 'id_objet' => $id_objet, 'perma' => $row['perma']);
        // si on arrive pas a reinserer tel quel, on annule url_propre pour forcer un recalcul d'url
        if (!url_insert($set, false, _url_propres_sep_id)) {
            $url_propre = "";
        } else {
            $url_propre = $row['url'] = $set['url'];
        }
    }
    // Se contenter de cette URL si elle existe ;
    // sauf si on invoque par "voir en ligne" avec droit de modifier l'url
    // l'autorisation est verifiee apres avoir calcule la nouvelle url propre
    // car si elle ne change pas, cela ne sert a rien de verifier les autorisations
    // qui requetent en base
    $modifier_url = (defined('_VAR_URLS') and _VAR_URLS and !$row['perma']);
    if ($url_propre and !$modifier_url) {
        return $url_propre;
    }
    // Sinon, creer une URL
    $url = pipeline('propres_creer_chaine_url', array('data' => $url_propre, 'objet' => array_merge($row, array('type' => $type, 'id_objet' => $id_objet))));
    // Eviter de tamponner les URLs a l'ancienne (cas d'un article
    // intitule "auteur2")
    include_spip('inc/urls');
    $objets = urls_liste_objets();
    if (preg_match(',^(' . $objets . ')[0-9]+$,', $url, $r) and $r[1] != $type) {
        $url = $url . _url_propres_sep_id . $id_objet;
    }
    // Pas de changement d'url
    if ($url == $url_propre) {
        return $url_propre;
    }
    // verifier l'autorisation, maintenant qu'on est sur qu'on va agir
    if ($modifier_url) {
        include_spip('inc/autoriser');
        $modifier_url = autoriser('modifierurl', $type, $id_objet);
    }
    // Verifier si l'utilisateur veut effectivement changer l'URL
    if ($modifier_url and CONFIRMER_MODIFIER_URL and $url_propre and $url != preg_replace('/' . preg_quote(_url_propres_sep_id, '/') . '.*/', '', $url_propre)) {
        $confirmer = true;
    } else {
        $confirmer = false;
    }
    if ($confirmer and !_request('ok')) {
        die("vous changez d'url ? {$url_propre} -&gt; {$url}");
    }
    $set = array('url' => $url, 'type' => $type, 'id_objet' => $id_objet);
    include_spip('action/editer_url');
    if (!url_insert($set, $confirmer, _url_propres_sep_id)) {
        return $url_propre;
    }
    //serveur out ? retourner au mieux
    return $set['url'];
}
Beispiel #4
0
/**
 * Retrouver/Calculer l'ensemble des segments d'url d'un objet
 *
 * http://doc.spip.org/@declarer_url_arbo
 *
 * @param string $type
 * @param int $id_objet
 * @return string
 */
function declarer_url_arbo($type, $id_objet)
{
    static $urls = array();
    // utiliser un cache memoire pour aller plus vite
    if (!is_null($C = Cache())) {
        return $C;
    }
    // Se contenter de cette URL si elle existe ;
    // sauf si on invoque par "voir en ligne" avec droit de modifier l'url
    // l'autorisation est verifiee apres avoir calcule la nouvelle url propre
    // car si elle ne change pas, cela ne sert a rien de verifier les autorisations
    // qui requetent en base
    $modifier_url = (defined('_VAR_URLS') and _VAR_URLS);
    if (!isset($urls[$type][$id_objet]) or $modifier_url) {
        $r = renseigner_url_arbo($type, $id_objet);
        // Quand $type ne reference pas une table
        if ($r === false) {
            return false;
        }
        if (!is_null($r)) {
            $urls[$type][$id_objet] = $r;
        }
    }
    if (!isset($urls[$type][$id_objet])) {
        return "";
    }
    # objet inexistant
    $url_propre = $urls[$type][$id_objet]['url'];
    // si on a trouve l'url
    // et que le parent est bon
    // et (permanente ou pas de demande de modif)
    if (!is_null($url_propre) and $urls[$type][$id_objet]['id_parent'] == $urls[$type][$id_objet]['parent'] and ($urls[$type][$id_objet]['perma'] or !$modifier_url)) {
        return declarer_url_arbo_rec($url_propre, $type, isset($urls[$type][$id_objet]['parent']) ? $urls[$type][$id_objet]['parent'] : 0, isset($urls[$type][$id_objet]['type_parent']) ? $urls[$type][$id_objet]['type_parent'] : null);
    }
    // Si URL inconnue ou maj forcee sur une url non permanente, recreer une url
    $url = $url_propre;
    if (is_null($url_propre) or $modifier_url and !$urls[$type][$id_objet]['perma']) {
        $url = pipeline('arbo_creer_chaine_url', array('data' => $url_propre, 'objet' => array_merge($urls[$type][$id_objet], array('type' => $type, 'id_objet' => $id_objet))));
        // Eviter de tamponner les URLs a l'ancienne (cas d'un article
        // intitule "auteur2")
        include_spip('inc/urls');
        $objets = urls_liste_objets();
        if (preg_match(',^(' . $objets . ')[0-9]*$,', $url, $r) and $r[1] != $type) {
            $url = $url . _url_arbo_sep_id . $id_objet;
        }
    }
    // Pas de changement d'url ni de parent
    if ($url == $url_propre and $urls[$type][$id_objet]['id_parent'] == $urls[$type][$id_objet]['parent']) {
        return declarer_url_arbo_rec($url_propre, $type, $urls[$type][$id_objet]['parent'], $urls[$type][$id_objet]['type_parent']);
    }
    // verifier l'autorisation, maintenant qu'on est sur qu'on va agir
    if ($modifier_url) {
        include_spip('inc/autoriser');
        $modifier_url = autoriser('modifierurl', $type, $id_objet);
    }
    // Verifier si l'utilisateur veut effectivement changer l'URL
    if ($modifier_url and CONFIRMER_MODIFIER_URL and $url_propre and $url != preg_replace('/' . preg_quote(_url_propres_sep_id, '/') . '.*/', '', $url_propre)) {
        $confirmer = true;
    } else {
        $confirmer = false;
    }
    if ($confirmer and !_request('ok')) {
        die("vous changez d'url ? {$url_propre} -&gt; {$url}");
    }
    $set = array('url' => $url, 'type' => $type, 'id_objet' => $id_objet, 'id_parent' => $urls[$type][$id_objet]['parent'], 'perma' => intval($urls[$type][$id_objet]['perma']));
    include_spip('action/editer_url');
    if (url_insert($set, $confirmer, _url_arbo_sep_id)) {
        $urls[$type][$id_objet]['url'] = $set['url'];
        $urls[$type][$id_objet]['id_parent'] = $set['id_parent'];
    } else {
        // l'insertion a echoue,
        //serveur out ? retourner au mieux
        $urls[$type][$id_objet]['url'] = $url_propre;
    }
    return declarer_url_arbo_rec($urls[$type][$id_objet]['url'], $type, $urls[$type][$id_objet]['parent'], $urls[$type][$id_objet]['type_parent']);
}
function url_insert(&$set, $confirmer, $separateur)
{
    $has_parent = true;
    # assurer la coherence des champs techniques si non fournis
    if (!isset($set['id_parent'])) {
        $has_parent = false;
        $set['id_parent'] = 0;
    }
    if (!isset($set['segments'])) {
        $set['segments'] = count(explode('/', $set['url']));
    }
    $perma = false;
    if (isset($set['perma']) and $set['perma']) {
        unset($set['perma']);
        $perma = true;
    }
    $redate = true;
    # le separateur ne peut pas contenir de /
    if (strpos($separateur, '/') !== false) {
        $separateur = "-";
    }
    // Si l'insertion echoue, c'est une violation d'unicite.
    $where_urllike = 'url LIKE ' . url_sql_quote_like($set['url']) . " AND NOT(type=" . sql_quote($set['type']) . " AND id_objet=" . intval($set['id_objet']) . ")";
    $where_thisurl = $where_urllike . ($has_parent ? " AND id_parent=" . intval($set['id_parent']) : "");
    if (!$has_parent and sql_countsel("spip_urls", $where_urllike) or @sql_insertq('spip_urls', $set) <= 0) {
        // On veut chiper une ancienne adresse ou prendre celle d'un repertoire deja present?
        if (!is_dir(_DIR_RACINE . $set['url']) and !file_exists(_DIR_RACINE . $set['url']) and $vieux = sql_fetsel('*', 'spip_urls', $where_thisurl, '', 'perma DESC') and !$vieux['perma'] and $courant = sql_fetsel('*', 'spip_urls', 'type=' . sql_quote($vieux['type']) . ' AND id_objet=' . sql_quote($vieux['id_objet']) . ' AND url<>' . sql_quote($set['url']) . ' AND date>' . sql_quote($vieux['date']), '', 'date DESC', 1)) {
            if ($confirmer and !_request('ok2')) {
                die("Vous voulez chiper l'URL de l'objet " . $courant['type'] . " " . $courant['id_objet'] . " qui a maintenant l'url " . $courant['url']);
            }
            $where_thisurl = "url=" . sql_quote($vieux['url']) . " AND id_parent=" . intval($vieux['id_parent']);
            // si oui on le chipe
            sql_updateq('spip_urls', $set, $where_thisurl);
            sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl);
            spip_log("reattribue url " . $vieux['url'] . " de " . $vieux['type'] . "#" . $vieux['id_objet'] . " (parent " . $vieux['id_parent'] . ")" . " A " . $set['type'] . "#" . $set['id_objet'] . " (parent " . $set['id_parent'] . ")", "urls" . _LOG_INFO_IMPORTANTE);
        } else {
            // Soit c'est un Come Back d'une ancienne url propre de l'objet
            // Soit c'est un vrai conflit. Rajouter l'ID jusqu'a ce que ca passe,
            // mais se casser avant que ca ne casse.
            // il peut etre du a un changement de casse de l'url simplement
            // pour ce cas, on reecrit systematiquement l'url en plus d'actualiser la date
            $where = "type=" . sql_quote($set['type']) . " AND id_objet=" . intval($set['id_objet']) . " AND id_parent=" . intval($set['id_parent']) . " AND url LIKE ";
            if (!is_dir(_DIR_RACINE . $set['url']) and !file_exists(_DIR_RACINE . $set['url']) and sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))) {
                sql_updateq('spip_urls', array('url' => $set['url'], 'date' => date('Y-m-d H:i:s')), $where . url_sql_quote_like($set['url']));
                spip_log("reordonne " . $set['type'] . " " . $set['id_objet'], "urls");
                $redate = false;
            } else {
                $set['url'] .= $separateur . $set['id_objet'];
                if (strlen($set['url']) > 200) {
                    return false;
                } elseif (sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))) {
                    sql_updateq('spip_urls', array('url' => $set['url'], 'date' => date('Y-m-d H:i:s')), $where . url_sql_quote_like($set['url']));
                    $redate = false;
                } else {
                    // remettre id_parent et perma comme il faut si besoin
                    if (!$has_parent) {
                        unset($set['id_parent']);
                    }
                    if ($perma) {
                        $set['perma'] = true;
                    }
                    return url_insert($set, $confirmer, $separateur);
                }
            }
        }
    }
    $where_thisurl = 'url=' . sql_quote($set['url']) . " AND id_parent=" . intval($set['id_parent']);
    // maj
    if ($redate) {
        sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl);
    }
    // si url perma, poser le flag sur la seule url qu'on vient de mettre
    if ($perma) {
        sql_update('spip_urls', array('perma' => "({$where_thisurl})"), "type=" . sql_quote($set['type']) . " AND id_objet=" . intval($set['id_objet']));
    }
    spip_log("Creation de l'url propre '" . $set['url'] . "' pour " . $set['type'] . " " . $set['id_objet'] . " (parent " . $set['id_parent'] . " perma " . ($perma ? "1" : "0") . ")", "urls");
    return true;
}
Beispiel #6
0
function declarer_url_arbo($type, $id_objet) {
	static $urls=array();
	
	// Se contenter de cette URL si elle existe ;
	// sauf si on invoque par "voir en ligne" avec droit de modifier l'url

	// l'autorisation est verifiee apres avoir calcule la nouvelle url propre
	// car si elle ne change pas, cela ne sert a rien de verifier les autorisations
	// qui requetent en base
	$modifier_url = $GLOBALS['var_urls'];
	
	if (!isset($urls[$type][$id_objet]) OR $modifier_url) {
		$trouver_table = charger_fonction('trouver_table', 'base');
		$desc = $trouver_table(table_objet($type));
		$champ_titre = $desc['titre'];
		$col_id =  @$desc['key']["PRIMARY KEY"];
		//  $type doit designer une table, avec champ indiquant un titre
		if (!$col_id OR !$champ_titre) return false; 

		$table = $desc['table'];
		$id_objet = intval($id_objet);
	

		// parent
		$champ_parent = url_arbo_parent($type);
		$sel_parent = ($champ_parent)?", O.".reset($champ_parent).' as parent':'';
	
		//  Recuperer une URL propre correspondant a l'objet.
		$row = sql_fetsel("U.url, U.date, O.$champ_titre $sel_parent", "$table AS O LEFT JOIN spip_urls AS U ON (U.type='$type' AND U.id_objet=O.$col_id)", "O.$col_id=$id_objet", '', 'U.date DESC', 1);
		if ($row){
			$urls[$type][$id_objet] = $row;
			$urls[$type][$id_objet]['type_parent'] = $champ_parent?end($champ_parent):'';
		}
	}

	if (!isset($urls[$type][$id_objet])) return ""; # objet inexistant

	$url_propre = $urls[$type][$id_objet]['url'];

	if (!is_null($url_propre) AND !$modifier_url)
		return declarer_url_arbo_rec($url_propre,$type,
		  isset($urls[$type][$id_objet]['parent'])?$urls[$type][$id_objet]['parent']:null,
		  isset($urls[$type][$id_objet]['type_parent'])?$urls[$type][$id_objet]['type_parent']:null);

	// Sinon, creer une URL
	$url = pipeline('arbo_creer_chaine_url',
		array(
			'data' => $url_propre,  // le vieux url_propre
			'objet' => array_merge($urls[$type][$id_objet],
				array('type' => $type, 'id_objet' => $id_objet)
			)
		)
	);

	// Eviter de tamponner les URLs a l'ancienne (cas d'un article
	// intitule "auteur2")
	include_spip('inc/urls');
	$objets = urls_liste_objets();
	if (preg_match(',^('.$objets.')[0-9]*$,', $url, $r)
	AND $r[1] != $type)
		$url = $url._url_arbo_sep_id.$id_objet;

	// Pas de changement d'url
	if ($url == $url_propre)
		return declarer_url_arbo_rec($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
	
	// verifier l'autorisation, maintenant qu'on est sur qu'on va agir
	if ($modifier_url) {
		include_spip('inc/autoriser');
		$modifier_url = autoriser('modifierurl', $type, $id_objet);
	}
	// Verifier si l'utilisateur veut effectivement changer l'URL
	if ($modifier_url
		AND CONFIRMER_MODIFIER_URL
		AND $url_propre
		AND $url != preg_replace('/,.*/', '', $url_propre))
		$confirmer = true;
	else
		$confirmer = false;

	if ($confirmer AND !_request('ok')) {
		die ("vous changez d'url ? $url_propre -&gt; $url");
	}

	$set = array('url' => $url, 'type' => $type, 'id_objet' => $id_objet);
	include_spip('action/editer_url');
	if (url_insert($set,$confirmer,_url_arbo_sep_id)){
		$urls[$type][$id_objet]['url'] = $set['url'];
	}
	else {
		// l'insertion a echoue,
		//serveur out ? retourner au mieux
		$urls[$type][$id_objet]['url']=$url_propre;
	}

	return declarer_url_arbo_rec($urls[$type][$id_objet]['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
}