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