/**
* Ajout d'un dépot et de son contenu (paquets, plugins) dans la base de données
*
* Si une erreur survient (syntaxe XML incorrecte, pas de plugin dans le dépot),
* son texte est placé dans le paramètre $erreur
*
* @param string $url
* URL du fichier XML de description du dépot
* @param string $erreur
* Texte d'un éventuel message d'erreur
* @return bool
* true si le dépot est ajouté correctement, false sinon
*/
function svp_ajouter_depot($url, &$erreur = '')
{
include_spip('inc/distant');
// On considere que l'url a deja ete validee (correcte et nouveau depot)
$url = trim($url);
// Ajout du depot dans la table spip_depots. Les compteurs de paquets et de plugins
// sont mis a jour apres le traitement des paquets
// on recupère le XML
$fichier_xml = copie_locale($url, 'modif');
if (!$fichier_xml) {
$erreur = _T('svp:message_nok_xml_non_recupere', array('fichier' => $url));
return false;
}
$fichier_xml = _DIR_RACINE . $fichier_xml;
// Lire les donnees d'un depot de paquets
$infos = svp_phraser_depot($fichier_xml);
if (!$infos) {
$erreur = _T('svp:message_nok_xml_non_conforme', array('fichier' => $url));
return false;
}
$titre = filtrer_entites($infos['depot']['titre']);
$champs = array('titre' => $titre, 'descriptif' => filtrer_entites($infos['depot']['descriptif']), 'type' => $infos['depot']['type'], 'url_serveur' => $infos['depot']['url_serveur'], 'url_brouteur' => $infos['depot']['url_brouteur'], 'url_archives' => $infos['depot']['url_archives'], 'url_commits' => $infos['depot']['url_commits'], 'xml_paquets' => $url, 'sha_paquets' => sha1_file($fichier_xml), 'nbr_paquets' => 0, 'nbr_plugins' => 0, 'nbr_autres' => 0);
// verifier avant l'insertion que le depot n'existe pas deja
// car la recuperation pouvant etre longue on risque le probleme en cas de concurrence
if (sql_countsel('spip_depots', 'xml_paquets=' . sql_quote($url))) {
$erreur = _T('svp:message_nok_depot_deja_ajoute', array('url' => $url));
return false;
} elseif (!($id_depot = sql_insertq('spip_depots', $champs))) {
$erreur = _T('svp:message_nok_sql_insert_depot', array('objet' => "{$titre} ({$url})"));
return false;
}
// Ajout des paquets dans spip_paquets et actualisation des plugins dans spip_plugins
$ok = svp_actualiser_paquets($id_depot, $infos['paquets'], $nb_paquets, $nb_plugins, $nb_autres);
if (!$ok or $nb_paquets == 0) {
// Si une erreur s'est produite, on supprime le depot deja insere
sql_delete('spip_depots', 'id_depot=' . sql_quote($id_depot));
if (!$ok) {
$erreur = _T('svp:message_nok_xml_non_conforme', array('fichier' => $url));
} else {
$erreur = _T('svp:message_nok_aucun_paquet_ajoute', array('url' => $url));
}
return false;
}
// On met à jour le nombre de paquets et de plugins du depot maintenant !
sql_updateq('spip_depots', array('nbr_paquets' => $nb_paquets, 'nbr_plugins' => $nb_plugins, 'nbr_autres' => $nb_autres), 'id_depot=' . sql_quote($id_depot));
// On vide les paquets locaux pour mettre a jour leurs donnees relatives au depot
// comme les mises a jour disponibles
include_spip('inc/svp_depoter_local');
svp_actualiser_paquets_locaux(true);
return true;
}
function onelettrebis($chaine) {
$chaine=sansle($chaine);
$chaine=filtrer_entites($chaine); // si il y a des fois des accents en dur qui trainent
$chaine = unicode2charset(utf_8_to_unicode($chaine), 'iso-8859-1'); // on code en html ISO
$a = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
$b = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
$chaine=strtr($chaine, $a, $b); // on retire les accents
$chaine=strtoupper($chaine); // on passe en majuscules
/// si débute par le fameux Œ ou œ
$pattern = "^(Œ|œ)";
if (eregi($pattern,$chaine,$regs))
$chaine='O';//$chaine= $regs[0]; //on va renvoyer la lettre O
else
$chaine = $chaine{0};
return $chaine ;
}
/**
* Récupère les valeurs d'une traduction de référence pour la création
* d'un objet (préremplissage du formulaire).
*
* @param string $type
* Type d'objet (article, breve...)
* @param string|int $id_objet
* Identifiant de l'objet, ou "new" pour une création
* @param int $id_rubrique
* Identifiant éventuel de la rubrique parente
* @param int $lier_trad
* Identifiant éventuel de la traduction de référence
* @param string $champ_titre
* Nom de la colonne SQL de l'objet donnant le titre
* @return array
* Couples clés / valeurs des champs du formulaire à charger
**/
function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $champ_titre = 'titre')
{
$table = table_objet_sql($type);
$_id_objet = id_table_objet($table);
// Recuperer les donnees de l'objet original
$row = sql_fetsel("*", $table, "{$_id_objet}={$lier_trad}");
if ($row) {
$row[$champ_titre] = filtrer_entites(_T('info_nouvelle_traduction')) . ' ' . $row[$champ_titre];
} else {
$row = array();
}
// on met l'objet dans une rubrique si l'objet le peut
$desc = lister_tables_objets_sql($table);
$is_rubrique = isset($desc['field']['id_rubrique']);
if ($is_rubrique) {
if ($id_rubrique) {
$row['id_rubrique'] = $id_rubrique;
return $row;
}
$id_rubrique = $row['id_rubrique'];
// Regler la langue, si possible, sur celle du redacteur
// Cela implique souvent de choisir une rubrique ou un secteur
if (in_array($GLOBALS['spip_lang'], explode(',', $GLOBALS['meta']['langues_multilingue']))) {
// Si le menu de langues est autorise sur l'objet,
// on peut changer la langue quelle que soit la rubrique
// donc on reste dans la meme rubrique
if (in_array($table, explode(',', $GLOBALS['meta']['multi_objets']))) {
$row['id_rubrique'] = $row['id_rubrique'];
# explicite :-)
// Sinon, chercher la rubrique la plus adaptee pour
// accueillir l'objet dans la langue du traducteur
} elseif ($is_rubrique and $GLOBALS['meta']['multi_rubriques'] == 'oui') {
if ($GLOBALS['meta']['multi_secteurs'] == 'oui') {
$id_parent = 0;
} else {
// on cherche une rubrique soeur dans la bonne langue
$row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique={$id_rubrique}");
$id_parent = $row_rub['id_parent'];
}
$row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "lang='" . $GLOBALS['spip_lang'] . "' AND id_parent={$id_parent}");
if ($row_rub) {
$row['id_rubrique'] = $row_rub['id_rubrique'];
}
}
}
}
return $row;
}
function article_select_trad($lier_trad, $id_rubrique=0) {
// Recuperer les donnees de l'article original
$row = sql_fetsel("*", "spip_articles", "id_article=$lier_trad");
if ($row) {
$row['titre'] = filtrer_entites(_T('info_nouvelle_traduction')).' '.$row["titre"];
} else $row = array();
if ($id_rubrique) {
$row['id_rubrique'] = $id_rubrique;
return $row;
}
$id_rubrique = $row['id_rubrique'];
// Regler la langue, si possible, sur celle du redacteur
// Cela implique souvent de choisir une rubrique ou un secteur
if (in_array($GLOBALS['spip_lang'],
explode(',', $GLOBALS['meta']['langues_multilingue']))) {
// Si le menu de langues est autorise sur les articles,
// on peut changer la langue quelle que soit la rubrique
// donc on reste dans la meme rubrique
if ($GLOBALS['meta']['multi_articles'] == 'oui') {
$row['id_rubrique'] = $row['id_rubrique']; # explicite :-)
}
else if ($GLOBALS['meta']['multi_rubriques'] == 'oui') {
// Sinon, chercher la rubrique la plus adaptee pour
// accueillir l'article dans la langue du traducteur
if ($GLOBALS['meta']['multi_secteurs'] == 'oui') {
$id_parent = 0;
} else {
// on cherche une rubrique soeur dans la bonne langue
$row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=$id_rubrique");
$id_parent = $row_rub['id_parent'];
}
$row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "lang='".$GLOBALS['spip_lang']."' AND id_parent=$id_parent");
if ($row_rub)
$row['id_rubrique'] = $row_rub['id_rubrique'];
}
}
return $row;
}
function get_id_doc($fichier) {
if (trim($fichier)=="") return false;
spip_log("get_id_doc cherche : ".$fichier,"snippets");
$sql = "SELECT id_document FROM spip_documents WHERE fichier='".addslashes(filtrer_entites($fichier))."'";
$result = spip_query($sql);
while ($row = spip_fetch_array($result)) {
spip_log("get_id_doc trouve : ".$row['id_document'],"snippets");
return $row['id_document'];
}
// inconnu ...
spip_log("get_id_doc trouve pas :( ","snippets");
return false ;
}
开发者ID:rhertzog,项目名称:lcs,代码行数:13,代码来源:snippets.php
示例17: analyser_site
/**
* Analyser une URL de site distant, qui peut être une syndication.
*
* @param string $url
* URL du site à analyser
* @return array|bool
* - array : informations du site
* - false : site impossible à récupérer
**/
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;
}
include_spip('inc/syndic');
cdata_echappe($texte, $echappe_cdata);
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')) {
cdata_echappe_retour($t, $echappe_cdata);
$result['nom_site'] = filtrer_entites(supprimer_tags($t));
}
if ($t = extraire_balises($header, 'link')) {
cdata_echappe_retour($t, $echappe_cdata);
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')) {
cdata_echappe_retour($a, $echappe_cdata);
$result['descriptif'] = filtrer_entites(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'] = $r[1];
} 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[^>]*>(.*),ims', $head, $regs)) {
$titre = trim($regs[1]);
if (!strlen($titre)) {
$titre = substr($head, strpos($head, $regs[0]));
}
$result['nom_site'] = filtrer_entites(supprimer_tags(preg_replace(',</title>.*$,ims', '', $titre)));
}
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) {
//.........这里部分代码省略.........
//.........这里部分代码省略.........
// prendre la premiere etiquette sur le tas et traiter son courrier
$sql_courrier_select = array(
'titre', 'texte', 'message_texte', 'type'
, 'id_courrier', 'id_liste', 'email_test', 'total_abonnes', 'date_debut_envoi'
);
if($id_courrier =
intval(spiplistes_courriers_en_queue_premier('id_courrier', 'etat='.$sql_vide))
) {
$sql_courrier_a_traiter = spiplistes_courriers_casier_premier(
$sql_courrier_select
, 'id_courrier='.sql_quote($id_courrier)
);
spiplistes_debug_log ($prefix_log.'etiquette en cours pour id_courrier #'.$id_courrier);
} else {
// un vieux bug dans une ancienne version, eradique depuis (j'espere ;-)
//spiplistes_log($prefix_log."premiere etiquette en erreur. id_courier = 0. Supprimer cette etiquette manuellement !");
spiplistes_log(_T('spiplistes:erreur_queue_supprimer_courrier'
, array('s' => $prefix_log))
);
}
// boucle (sur LIMIT 1) pour pouvoir sortir par break si erreur
while($row = sql_fetch($sql_courrier_a_traiter)) {
foreach($sql_courrier_select as $key) {
$$key = $row[$key];
}
foreach(array('id_courrier','id_liste','total_abonnes') as $key) {
$$key = intval($$key);
}
// objet (subject) ne peut pas être en html ?!
// sauf pour le webmail (et encore)
$objet_html = filtrer_entites(typo(spiplistes_calculer_balise_titre(extraire_multi($titre))));
$page_html = stripslashes($texte);
$message_texte = stripslashes($message_texte);
$nb_emails = array();
// compteur pour la session uniquement
// le total de chaque sera ajoute en fin de session
$nb_emails_envoyes =
$nb_emails_echec =
$nb_emails_non_envoyes =
$nb_emails['texte'] =
$nb_emails['html'] = 0
;
$str_log = 'id_courrier #'.$id_courrier;
//////////////////////////
// Determiner email de l emetteur
if($is_a_test = email_valide($email_test)) {
// courrier a destination adresse email de test
$str_log .= ' TO: '.$email_test.' (TEST)';
}
else if($id_liste > 0) {
// courrier a destination des abonnes d'une liste
$total_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste);
$str_log .= ' TO id_liste #'.$id_liste.' ('.$total_abonnes.' users)';
$lang = spiplistes_listes_langue($id_liste);
if($lang != '') {
$GLOBALS['spip_lang'] = $lang;
}
请发表评论