From 7760556456d826e4c506c726e518bc154458669e Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Wed, 7 May 2008 16:34:59 +0000
Subject: [PATCH] meilleur fonctionnement de l'analyse auto : on represente le
 formulaire avec remplissage des valeurs issues de l'analyse, cela permet un
 controle de saisie le logo est recupere a l'analyse et insere en hidden pour
 recuperation lors de l'action

---
 dist/formulaires/editer_site.html |   3 +
 dist/formulaires/editer_site.php  | 122 +++++++++++++++++++++++++++++-
 ecrire/action/editer_site.php     | 122 +-----------------------------
 ecrire/inc/editer.php             |   7 +-
 4 files changed, 133 insertions(+), 121 deletions(-)

diff --git a/dist/formulaires/editer_site.html b/dist/formulaires/editer_site.html
index 64f21a34e2..f8e8016382 100644
--- a/dist/formulaires/editer_site.html
+++ b/dist/formulaires/editer_site.html
@@ -9,6 +9,8 @@
 		#ACTION_FORMULAIRE{#ENV{action}}
 	  <input type='hidden' name='id_syndic' value='#ENV{id_syndic}' />
 		<input type='hidden' name='syndication_old' value="#ENV**{syndication}" />
+		[<input type='hidden' name='logo' value='(#ENV**{logo,''})' />]
+		[<input type='hidden' name='format_logo' value='(#ENV**{format_logo,''})' />]
 	  <fieldset>
 	  <ol class="formfx">
 	  	[(#ENV{id_syndic}||?{'',' '})
@@ -16,6 +18,7 @@
 		  <li><fieldset><legend><img src='#EVAL{_DIR_IMG_PACK}site-24.gif' /></legend><ol><li>
 			<label for='url_auto'><:texte_referencement_automatique:></label>
 			<input type="text" name="url_auto" id="url_auto" class='fondl' size='40' value="http://" />
+			[<span class='erreur'>(#ENV**{erreurs}|table_valeur{url_auto})</span>]
 			</li></ol>
 		  <div style='text-align: right'><input class='fondo' type='submit' value='<:bouton_ajouter:>' /></div>
 			</fieldset>
diff --git a/dist/formulaires/editer_site.php b/dist/formulaires/editer_site.php
index 9442dbcd36..7116d273b4 100644
--- a/dist/formulaires/editer_site.php
+++ b/dist/formulaires/editer_site.php
@@ -17,6 +17,9 @@ include_spip('inc/editer');
 
 function formulaires_editer_site_charger_dist($id_syndic='new', $id_rubrique=0, $lier_trad=0, $retour='', $config_fonc='sites_edit_config', $row=array(), $hidden=''){
 	$valeurs = formulaires_editer_objet_charger('site',$id_syndic,$id_rubrique,$lier_trad,$retour,$config_fonc,$row,$hidden);
+	# pour recuperer le logo issu d'analyse auto
+	$valeurs['logo']='';
+	$valeurs['format_logo']='';
 	return $valeurs;
 }
 
@@ -35,12 +38,127 @@ function sites_edit_config($row)
 }
 
 function formulaires_editer_site_verifier_dist($id_syndic='new', $id_rubrique=0, $lier_trad=0, $retour='', $config_fonc='sites_edit_config', $row=array(), $hidden=''){
-
-	$erreurs = formulaires_editer_objet_verifier('site',$id_syndic,_request('url_auto')?array():array('nom_site','url_site'));
+	include_spip('inc/filtres');
+	$oblis = array('nom_site','url_site');
+	// Envoi depuis le formulaire d'analyse automatique d'un site
+	if (strlen(vider_url($u = _request('url_auto')))) {
+		if ($auto = analyser_site($u)) {
+			foreach($auto as $k=>$v){
+				set_request($k,$v);
+			}
+			$erreurs['message_erreur'] = ' '; # provoquer la resaisie de controle
+		}
+		else{
+			$erreurs['url_auto'] = _L('Site introuvable');
+		}
+	}
+	else
+		$erreurs = formulaires_editer_objet_verifier('site',$id_syndic,$oblis);
 	return $erreurs;
 }
 
 function formulaires_editer_site_traiter_dist($id_syndic='new', $id_rubrique=0, $lier_trad=0, $retour='', $config_fonc='sites_edit_config', $row=array(), $hidden=''){
 	return formulaires_editer_objet_traiter('site',$id_syndic,$id_rubrique,$lier_trad,$retour,$config_fonc,$row,$hidden);
 }
+
+
+// http://doc.spip.org/@analyser_site
+function analyser_site($url) {
+	include_spip('inc/filtres');
+	include_spip('inc/distant');
+
+	// Accepter les URLs au format feed:// ou qui ont oublie le http://
+	$url = preg_replace(',^feed://,i', 'http://', $url);
+	if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
+
+	$texte = recuperer_page($url, true);
+	if (!$texte) return false;
+
+	if (preg_match(',<(channel|feed)([:[:space:]][^>]*)?'
+	.'>(.*)</\1>,ims', $texte, $regs)) {
+		$result['syndication'] = 'oui';
+		$result['url_syndic'] = $url;
+		$channel = $regs[3];
+
+		// Pour recuperer l'entete, on supprime tous les items
+		$b = array_merge(
+			extraire_balises($channel, 'item'),
+			extraire_balises($channel, 'entry')
+		);
+		$header = str_replace($b,array(),$channel);
+
+		if ($t = extraire_balise($header, 'title'))
+			$result['nom_site'] = supprimer_tags($t);
+		if ($t = extraire_balises($header, 'link')) {
+			foreach ($t as $link) {
+				$u = supprimer_tags(filtrer_entites($link));
+				if (!strlen($u))
+					$u = extraire_attribut($link, 'href');
+				if (strlen($u)) {
+					// on installe l'url comme url du site
+					// si c'est non vide, en donnant la priorite a rel=alternate
+					if (preg_match(',\balternate\b,', extraire_attribut($link, 'rel'))
+					OR !isset($result['url_site']))
+						$result['url_site'] = filtrer_entites($u);
+				}
+			}
+		}
+		$result['url_site'] = url_absolue($result['url_site'], $url);
+
+		if ($a = extraire_balise($header, 'description')
+		OR $a = extraire_balise($header, 'tagline')) {
+			$result['descriptif'] = supprimer_tags($a);
+		}
+
+		if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims',
+		$header, $r)
+		AND preg_match(',(https?://.*/.*(gif|png|jpg)),ims', $r[1], $r)
+		AND $image = recuperer_infos_distantes($r[1])) {
+			if (in_array($image['extension'], array('gif', 'jpg', 'png'))) {
+				$result['format_logo'] = $image['extension'];
+				$result['logo'] = $image['fichier'];
+			}
+			else if ($image['fichier']) {
+				spip_unlink($image['fichier']);
+			}
+		}
+	}
+	else {
+		$result['syndication'] = 'non';
+		$result['url_site'] = $url;
+		if (preg_match(',<head>(.*(description|title).*)</head>,Uims', $texte, $regs)) {
+			$head = filtrer_entites($regs[1]);
+		} else
+			$head = $texte;
+		if (preg_match(',<title[^>]*>(.*),i', $head, $regs))
+			$result['nom_site'] = filtrer_entites(supprimer_tags(preg_replace(',</title>.*,i', '', $regs[1])));
+		if ($a = array_merge(
+			extraire_balises($head, 'meta'),
+			extraire_balises($head, 'http-equiv')
+		)) {
+			foreach($a as $meta) {
+				if (extraire_attribut($meta, 'name') == 'description') {
+					$desc = trim(extraire_attribut($meta, 'content'));
+					if (!strlen($desc))
+						$desc = trim(extraire_attribut($meta, 'value'));
+					$result['descriptif'] = $desc;
+				}
+			}
+		}
+
+		// Cherchons quand meme un backend
+		include_spip('inc/distant');
+		include_spip('inc/feedfinder');
+		$feeds = get_feed_from_url($url, $texte);
+		// si on a a trouve un (ou plusieurs) on le note avec select:
+		// ce qui constitue un signal pour exec=sites qui proposera de choisir
+		// si on syndique, et quelle url.
+		if (count($feeds)>=1) {
+			spip_log("feedfinder.php :\n".join("\n", $feeds));
+			$result['url_syndic'] = "select: ".join(' ',$feeds);
+		}
+	}
+
+	return $result;
+}
 ?>
\ No newline at end of file
diff --git a/ecrire/action/editer_site.php b/ecrire/action/editer_site.php
index 4660ecfa99..fd3f8d0c25 100644
--- a/ecrire/action/editer_site.php
+++ b/ecrire/action/editer_site.php
@@ -48,29 +48,15 @@ function action_editer_site_dist() {
 			set_request('reload', 'oui');
 			$id_syndic = insert_syndic(_request('id_parent'));
 			revisions_sites($id_syndic);
+			if ($logo = _request('logo')
+			 AND $format_logo = _request('format_logo'))
+				@rename($logo,
+				_DIR_IMG . 'siteon'.$id_syndic.'.'.$format_logo);
 		} else {
 			include_spip('inc/headers');
 			return array(0,redirige_formulaire(generer_url_ecrire('sites_edit', 'id_rubrique='._request('id_parent'),'&')));
 		}
 	}
-	// Envoi depuis le formulaire d'analyse automatique d'un site
-	else if (strlen(vider_url($u = _request('url_auto')))) {
-		if ($auto = analyser_site($u)) {
-			$id_syndic = insert_syndic(_request('id_parent'));
-			revisions_sites($id_syndic, $auto);
-			if ($auto['syndication'] == 'oui')
-				set_request('reload', 'oui');
-
-			// Enregistrer le logo s'il existe
-			if ($auto['logo'] AND $auto['format_logo'])
-				@rename($auto['logo'],
-				_DIR_IMG . 'siteon'.$id_syndic.'.'.$auto['format_logo']);
-		}
-		else{
-			include_spip('inc/headers');
-			return array(0,redirige_formulaire(generer_url_ecrire('sites_edit', 'id_rubrique='._request('id_parent'),'&')));
-		}
-	}
 	// Erreur
 	else {
 		redirige_url_ecrire();
@@ -249,106 +235,6 @@ function revisions_sites ($id_syndic, $c=false) {
 }
 
 
-// http://doc.spip.org/@analyser_site
-function analyser_site($url) {
-	include_spip('inc/filtres');
-	include_spip('inc/distant');
-
-	// Accepter les URLs au format feed:// ou qui ont oublie le http://
-	$url = preg_replace(',^feed://,i', 'http://', $url);
-	if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
-
-	$texte = recuperer_page($url, true);
-	if (!$texte) return false;
-
-	if (preg_match(',<(channel|feed)([:[:space:]][^>]*)?'
-	.'>(.*)</\1>,ims', $texte, $regs)) {
-		$result['syndication'] = 'oui';
-		$result['url_syndic'] = $url;
-		$channel = $regs[3];
-
-		// Pour recuperer l'entete, on supprime tous les items
-		$b = array_merge(
-			extraire_balises($channel, 'item'),
-			extraire_balises($channel, 'entry')
-		);
-		$header = str_replace($b,array(),$channel);
-
-		if ($t = extraire_balise($header, 'title'))
-			$result['nom_site'] = supprimer_tags($t);
-		if ($t = extraire_balises($header, 'link')) {
-			foreach ($t as $link) {
-				$u = supprimer_tags(filtrer_entites($link));
-				if (!strlen($u))
-					$u = extraire_attribut($link, 'href');
-				if (strlen($u)) {
-					// on installe l'url comme url du site
-					// si c'est non vide, en donnant la priorite a rel=alternate
-					if (preg_match(',\balternate\b,', extraire_attribut($link, 'rel'))
-					OR !isset($result['url_site']))
-						$result['url_site'] = filtrer_entites($u);
-				}
-			}
-		}
-		$result['url_site'] = url_absolue($result['url_site'], $url);
-
-		if ($a = extraire_balise($header, 'description')
-		OR $a = extraire_balise($header, 'tagline')) {
-			$result['descriptif'] = supprimer_tags($a);
-		}
-
-		if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims',
-		$header, $r)
-		AND preg_match(',(https?://.*/.*(gif|png|jpg)),ims', $r[1], $r)
-		AND $image = recuperer_infos_distantes($r[1])) {
-			if (in_array($image['extension'], array('gif', 'jpg', 'png'))) {
-				$result['format_logo'] = $image['extension'];
-				$result['logo'] = $image['fichier'];
-			}
-			else if ($image['fichier']) {
-				spip_unlink($image['fichier']);
-			}
-		}
-	}
-	else {
-		$result['syndication'] = 'non';
-		$result['url_site'] = $url;
-		if (preg_match(',<head>(.*(description|title).*)</head>,Uims', $texte, $regs)) {
-			$head = filtrer_entites($regs[1]);
-		} else
-			$head = $texte;
-		if (preg_match(',<title[^>]*>(.*),i', $head, $regs))
-			$result['nom_site'] = filtrer_entites(supprimer_tags(preg_replace(',</title>.*,i', '', $regs[1])));
-		if ($a = array_merge(
-			extraire_balises($head, 'meta'),
-			extraire_balises($head, 'http-equiv')
-		)) {
-			foreach($a as $meta) {
-				if (extraire_attribut($meta, 'name') == 'description') {
-					$desc = trim(extraire_attribut($meta, 'content'));
-					if (!strlen($desc))
-						$desc = trim(extraire_attribut($meta, 'value'));
-					$result['descriptif'] = $desc;
-				}
-			}
-		}
-
-		// Cherchons quand meme un backend
-		include_spip('inc/distant');
-		include_spip('inc/feedfinder');
-		$feeds = get_feed_from_url($url, $texte);
-		// si on a a trouve un (ou plusieurs) on le note avec select:
-		// ce qui constitue un signal pour exec=sites qui proposera de choisir
-		// si on syndique, et quelle url.
-		if (count($feeds)>=1) {
-			spip_log("feedfinder.php :\n".join("\n", $feeds));
-			$result['url_syndic'] = "select: ".join(' ',$feeds);
-		}
-	}
-
-	return $result;
-}
-
 // Enregistrre les options et retourne True s'il faut syndiquer.
 
 // http://doc.spip.org/@editer_site_options
diff --git a/ecrire/inc/editer.php b/ecrire/inc/editer.php
index 82ab25c609..0c5d5b65fa 100644
--- a/ecrire/inc/editer.php
+++ b/ecrire/inc/editer.php
@@ -57,13 +57,18 @@ function formulaires_editer_objet_charger($type, $id='new', $id_parent=0, $lier_
 	if (!$row) {
 		if ($select = charger_fonction($type."_select",'inc',true)){
 			$row = $select($id, $id_parent, $lier_trad);
-			if (!$row) return '';
 		}
 		else {
 			$row = sql_fetsel('*',$table_objet_sql,$id_table_objet."=".intval($id));
 		}
 		if (is_numeric($id)) $new = '';
 		else $new = $id;
+		if (!$row) {
+			$trouver_table = charger_fonction('trouver_table','base');
+			if ($desc = base_trouver_table_dist($table_objet))
+				foreach($desc['field'] as $k=>$v)
+					$row[$k]='';
+		}
 	}
 	// Gaffe: sans ceci, on ecrase systematiquement l'article d'origine
 	// (et donc: pas de lien de traduction)
-- 
GitLab