Valider 98468924 rédigé par esj's avatar esj
Parcourir les fichiers

Revision de l'interface aux jeux de fonctions generer_url_$objet, commandés en...

Revision de l'interface aux jeux de fonctions generer_url_$objet, commandés en  particulier par la globale $type_urls.

Ces fonctions n'admettaient auparavant qu'un seul argument, index de la clé primaire dans la table correspondante. En conséquence, il n'était pas possible d'exploiter à fond les possibilités des raccourcis données par la RegExp:

define('_RACCOURCI_URL', ',^\s*(\w*?)\s*(\d+)(\?(.*?))?(#([^\s]*))?$,S');

qui autorise explicitement paramètres supplémentaires et ancre, lesquels étaient
raoutés ultérieurement, et mal à propos en cas de redirection.

A présent, les fonctions generer_url_*objet sont appelées avec les 2 arguments supplémentaires trouvés dans le raccourci, le premier étant censé etre une suite n1=v1&n2=v2 et le deuxième une ancre. Les définitions standards de ces jeux de
fonctions (urls/page urls/html urls/propres et inc/urls) admettent ces nouveaux arguments et les injectent dans les URL construites. Dans le cas où les URLs sont en fait des scripts qui provoqueront  une redirection, l'ancre est fourni sous la forme "ancre=nom", le script de redirection synthétisant "#$ancre" dans l'URL finale.

Compatibilité:

- totale pour les sites sans mes_options.php personnelle;

- vraisemblablement assurée pour ceux définissant un jeu de fonctions generer_url_$objet car:
	-- PHP ne dit rien en présence d'arguments excédentaires
	-- les variantes generer_url_ecrire_$objet admettaient certes déjà un 2e argument, mais son utilisation comportait un bug suggérant qu'il n'avait jamais utilisé en dehors du noyau de Spip où il était transparent (cet argument est donc maintenant en 4e position, et permet de forcer le statut de l'objet)
	-- le 2e argument generer_url_forum n'avait jamais été utilisé;
	-- ce sont à présent ces fonctions qui doivent rajouter la suite d'arguments supplémentaires et l'ancre, mais il est douteux que certaines comptaient dessus sinon la faute de conception motivant ce dépot aurait été signalée depuis longtemps;

- pour le sous-jeu de fonctions calculer_url_$objet, il reçoit à présent en 3e argument ce qu'a calculé le generer_url_$objet correspondant, ce qui leur facilite le travail. A noter une curieuse dissymétrie pour le raccourci des sites, qui dans ce cas retoune l'URL du site et non du script (conservée telle quelle).

A signaler également que la RegExp des raccourcis était assez laxiste, cherchanten vain des fonctions generer_url_$objet avec $objet n'étant pas nécessairement un \w+.
parent dfafbd25
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+24 −22
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -20,38 +20,40 @@ charger_generer_url();
// http://doc.spip.org/@action_redirect_dist
function action_redirect_dist()
{
  global $id_article, $id_auteur, $id_breve, $id_forum, $id_mot, $id_rubrique, $id_site, $id_syndic, $var_mode;
  global $var_mode, $redirect;


  if ($id_article = intval($id_article)) {
	$url = generer_url_article($id_article);
  if ($id_article = intval(_request('id_article'))) {
	$redirect = generer_url_article($id_article,'',_request('ancre'));
}
  else if ($id_breve = intval($id_breve)) {
	$url = generer_url_breve($id_breve);
  else if ($id_breve = intval(_request('id_breve'))) {
	$redirect = generer_url_breve($id_breve,'',_request('ancre'));
}
  else if ($id_forum = intval($id_forum)) {
	$url = generer_url_forum($id_forum);
  else if ($id_forum = intval(_request('id_forum'))) {
	$redirect = generer_url_forum($id_forum,'',_request('ancre'));
}
  else if ($id_rubrique = intval($id_rubrique)) {
	$url = generer_url_rubrique($id_rubrique);
  else if ($id_rubrique = intval(_request('id_rubrique'))) {
	$redirect = generer_url_rubrique($id_rubrique,'',_request('ancre'));
}
  else if ($id_mot = intval($id_mot)) {
	$url = generer_url_mot($id_mot);
  else if ($id_mot = intval(_request('id_mot'))) {
	$redirect = generer_url_mot($id_mot,'',_request('ancre'));
}
  else if ($id_auteur = intval($id_auteur)) {
	$url = generer_url_auteur($id_auteur);
  else if ($id_auteur = intval(_request('id_auteur'))) {
	$redirect = generer_url_auteur($id_auteur,'',_request('ancre'));
}
  else if ($id_syndic = intval($id_syndic) OR $id_syndic = intval($id_site)) {
	$url = generer_url_site($id_syndic);
  else if ($id_syndic = intval(_request('id_syndic')) OR $id_syndic = intval(_request('id_site'))) {
	$redirect = generer_url_site($id_syndic,'',_request('ancre'));
}
else {
	$url = _DIR_RESTREINT_ABS;
}

// Ne pas masquer cette eventuelle erreur (aide a detecter des lignes vides
// dans inc-urls ou mes_fonctions/mes_options)
 header("Location: " . (!$var_mode ?  $url : ($url . (strpos($url,'?') ? '&' : '?') ."var_mode=" . $var_mode)));
	$redirect = _DIR_RESTREINT_ABS;
}
	if ($var_mode) {
		$var_mode = (strpos($redirect,'?') ? '&' : '?') ."var_mode="
		. $var_mode;
		$redirect = strpos($redirect,'#')
		  ? str_replace('#', "$var_mode#", $redirect)
		  : "$redirect$var_mode";
	}
}


?>
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -185,7 +185,7 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
			$env['id_'.$id] = ${'id_'.$id};
			$g = 'generer_url_ecrire_'.$obj;
			$env['voir_'.$obj] = str_replace('&', '&',
				$g(${'id_'.$id}, 'prop'));
				$g(${'id_'.$id}, '','', 'prop'));
		}
	}

+6 −6
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1402,7 +1402,7 @@ function sql_calendrier_interval_articles($avant, $apres, &$evenements) {
				'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
				'DESCRIPTION' => $row['descriptif'] ? $row['descriptif'] : $langues[$row['lang']],
				'SUMMARY' => $row['titre'],
				'URL' => generer_url_article($id, 'prop'));
				'URL' => generer_url_article($id, '','','prop'));
	}
}

@@ -1419,7 +1419,7 @@ function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) {
				'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
				'DESCRIPTION' => $row['descriptif'],
				'SUMMARY' => $row['titre'],
				'URL' => generer_url_rubrique($id, 'prop'));
				'URL' => generer_url_rubrique($id, '','', 'prop'));
	}
}

@@ -1433,7 +1433,7 @@ function sql_calendrier_interval_breves($avant, $apres, &$evenements) {
		if (autoriser('voir','breve',$id))
			$evenements[$amj][]=
			array(
			      'URL' => generer_url_breve($id, 'prop'),
			      'URL' => generer_url_breve($id, '','', 'prop'),
			      'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
			      'SUMMARY' => $row['titre']);
	}
+9 −14
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -39,23 +39,18 @@ function get_spip_doc($fichier) {
}

// http://doc.spip.org/@generer_url_document_dist
function generer_url_document_dist($id_document) {
function generer_url_document_dist($id_document, $args='', $ancre='') {
	if (intval($id_document) <= 0)
		return '';
	$row = spip_fetch_array(spip_query("SELECT fichier,distant FROM spip_documents WHERE id_document="._q($id_document)));
	if ($row) {

	if (!$row) return '';
	// Cette variable de configuration peut etre posee par un plugin
	// par exemple acces_restreint
	if ($GLOBALS['meta']["creer_htaccess"] == 'oui'
		AND $row['distant'] != 'oui')
			return parametre_url(
				generer_url_action('acceder_document', "arg=$id_document"),
				'file', $row['fichier'], '&');
		else
			return get_spip_doc($row['fichier']);
	}
	return '';
	AND $row['distant'] != 'oui') {
	  $args .= ($args ? "&" : '') . "arg=$id_document&file=" . $row['fichier'] . ($ancre ? "&ancre=$ancre" : '');
		return generer_url_action('acceder_document', $args);
	} else	return get_spip_doc($row['fichier']);
}

//
+6 −7
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -257,23 +257,22 @@ function racine_forum($id_forum){
} 

// http://doc.spip.org/@generer_url_forum_dist
function generer_url_forum_dist($id_forum, $show_thread=false) {
function generer_url_forum_dist($id_forum, $args='', $ancre='') {
	if (!$id_forum) return '';
	list($type, $id, $id_thread) = racine_forum($id_forum);
	if ($id_thread>0 AND $show_thread)
		$id_forum = $id_thread;
	if (!$ancre) $ancre = "forum$id_forum";
	switch($type) {
		case 'article':
			return generer_url_article($id)."#forum$id_forum";
			return generer_url_article($id, $args, $ancre);
			break;
		case 'breve':
			return generer_url_breve($id)."#forum$id_forum";
			return generer_url_breve($id, $args, $ancre);
			break;
		case 'rubrique':
			return generer_url_rubrique($id)."#forum$id_forum";
			return generer_url_rubrique($id, $args, $ancre);
			break;
		case 'site':
			return generer_url_site($id)."#forum$id_forum";
			return generer_url_site($id, $args, $ancre);
			break;
		default:
		  return '';
Chargement en cours