/** * 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} -> {$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 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 -> $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']); }