function recherche_avancee_google_like($string, $options = array()) { $resume = isset($options['resume']) ? $options['resume'] : ($options['resume'] != 'non' ? $string : ''); $wrapper = isset($options['wrapper']) ? '<i class="rsusp">[...]</i>' : ''; $taille = isset($options['taille']) ? $options['taille'] : 55; // Convertir en texte brut sans accent $string = textebrut($string); $string = translitteration($string); $rech = translitteration(_request('recherche')); // Supprimer les caracteres qui m... $badguy = array("^", "/", "\\", "\$", "@", "*"); $rech = str_replace($badguy, "", $rech); // en avant $query = rtrim(str_replace("+", " ", $rech)); $qt = explode(" ", $query); if ($wrapper) { $num = count($qt); // $cc = ceil(55 / $num); $cc = $taille; for ($i = 0; $i < $num; $i++) { $tab[$i] = preg_split("/\\b({$qt[$i]})/i", $string, 2, PREG_SPLIT_DELIM_CAPTURE); if (count($tab[$i]) > 1) { // Chaine avant $avant = substr($tab[$i][0], -$cc, $cc); $mots = split(" ", $avant, 2); if (count($mots) > 1) { $avant = $mots[1]; } // Chaine apres $apres = substr($tab[$i][2], 0, $cc); $apres = preg_replace('@(.+)\\s\\S+@s', '\\1', $apres); // Concatener if ($string_re == '') { $string_re = $wrapper; } $string_re .= " {$avant}<span class='spip_surligne'>" . $tab[$i][1] . "</span>{$apres} {$wrapper}"; } } } else { $pattern = array(); $replace = array(); foreach ($qt as $t) { $pattern[] = "/{$t}/"; $replace[] = "<span class='spip_surligne'>" . $t . "</span>"; } $string_re = preg_replace($pattern, $replace, $string); } // Si rien trouve : renvoyer les premiers mots en resume if ($resume != '' and $string_re == '') { $mots = split(" ", $string, 40); for ($i = 0; $i < count($mots) - 1; $i++) { $string_re .= $mots[$i] . " "; if (strlen($string_re) > 2 * $cc) { break; } } $string_re = $resume; } return $string_re; }
/** * enlever les accents des cles presentes dans le head, * sinon ca pose des problemes ... * * @param string $key * @return string */ function importer_csv_nettoie_key($key) { return translitteration($key); /*$accents=array('�','�','�','�','�',"�","�","'"); $accents_rep=array('e','e','e','a','u',"o","c","_"); return str_replace($accents,$accents_rep,$key);*/ }
function reduire_mot($mot) { return strtr( translitteration(trim($mot)), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz' ); }
function action_snippet_exporte(){ global $auteur_session; $arg = _request('arg'); $args = explode(":",$arg); $hash = _request('hash'); $id_auteur = $auteur_session['id_auteur']; $redirect = _request('redirect'); if ($redirect==NULL) $redirect=""; include_spip("inc/securiser_action"); if (verifier_action_auteur("snippet_exporte-$arg",$hash,$id_auteur)==TRUE) { $table = $args[0]; $id = $args[1]; $f = snippets_fond_exporter($table, false); if ($f) { include_spip('public/assembler'); $out = recuperer_fond($f,array('id'=>intval($id))); //$out = preg_replace(",\n\n[\s]*(?=\n),","",$out); $filename=str_replace(":","_",$arg); if (preg_match(",<titre>(.*)</titre>,Uims",$out,$regs)) $filename = preg_replace(',[^-_\w]+,', '_', trim(translitteration(textebrut(typo($regs[1]))))); $extension = "xml"; Header("Content-Type: text/xml; charset=".$GLOBALS['meta']['charset']); Header("Content-Disposition: attachment; filename=$filename.$extension"); Header("Content-Length: ".strlen($out)); echo $out; exit(); } } redirige_par_entete(str_replace("&","&",urldecode($redirect))); }
function plugins_afficher_liste_dist($url_page,$liste_plugins, $liste_plugins_actifs, $dir_plugins=_DIR_PLUGINS,$afficher_un = 'afficher_plugin'){ $get_infos = charger_fonction('get_infos','plugins'); $ligne_plug = charger_fonction($afficher_un,'plugins'); $liste_plugins = array_flip($liste_plugins); foreach(array_keys($liste_plugins) as $chemin) { if ($info = $get_infos($chemin, false, $dir_plugins)) $liste_plugins[$chemin] = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($info['nom'])))))); } asort($liste_plugins); $exposed = urldecode(_request('plugin')); $block_par_lettre = false;//count($liste_plugins)>10; $fast_liste_plugins_actifs = array_flip($liste_plugins_actifs); $res = ''; $block = ''; $initiale = ''; $block_actif = false; foreach($liste_plugins as $plug => $nom){ if (($i=substr($nom,0,1))!==$initiale){ $res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block; $initiale = $i; $block = ''; $block_actif = false; } // le rep suivant $actif = @isset($fast_liste_plugins_actifs[$plug]); $block_actif = $block_actif | $actif; $expose = ($exposed AND ($exposed==$plug OR $exposed==$dir_plugins . $plug OR $exposed==substr($dir_plugins,strlen(_DIR_RACINE)) . $plug)); $block .= $ligne_plug($url_page, $plug, $actif, $expose, "item", $dir_plugins)."\n"; } $res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block; $class = basename($dir_plugins); return $res ? "<ul class='liste-items plugins $class'>$res</ul>" : ""; }
function url_nettoyer($titre,$longueur_maxi,$longueur_min=0,$separateur='-',$filtre=''){ if (!defined('_TRANSLITTERER_URL')) define('_TRANSLITTERER_URL', true); $titre = supprimer_tags(supprimer_numero(extraire_multi($titre))); $url = corriger_caracteres($titre); if (_TRANSLITTERER_URL) $url = translitteration($url); if ($filtre) $url = $filtre($url); // on va convertir tous les caracteres de ponctuation et espaces // a l'exception de l'underscore (_), car on veut le conserver dans l'url $url = str_replace('_', chr(7), $url); $url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url); $url = str_replace(chr(7), '_', $url); // S'il reste trop de caracteres non latins, les gerer comme wikipedia // avec rawurlencode : if (_TRANSLITTERER_URL && preg_match_all(",[^a-zA-Z0-9 _]+,", $url, $r, PREG_SET_ORDER)) { foreach ($r as $regs) { $url = substr_replace($url, rawurlencode($regs[0]), strpos($url, $regs[0]), strlen($regs[0])); } } // S'il reste trop peu, renvoyer vide if (strlen($url) < $longueur_min) return ''; // Sinon couper les mots et les relier par des $separateur if (_TRANSLITTERER_URL) $mots = preg_split(",[^a-zA-Z0-9_%]+,", $url); else $mots = preg_split(",[\s]+,", $url); $url = ''; foreach ($mots as $mot) { if (!strlen($mot)) continue; $url2 = $url.$separateur.$mot; // Si on depasse $longueur_maxi caracteres, s'arreter // ne pas compter 3 caracteres pour %E9 mais un seul $long = preg_replace(',%.,', '', $url2); if (strlen($long) > $longueur_maxi) { break; } $url = $url2; } $url = substr($url, 1); // On enregistre en utf-8 dans la base $url = rawurldecode($url); if (strlen($url) < $longueur_min) return ''; return $url; }
/** * Nom du fichier de sauvegarde * la fourniture de l'extension permet de verifier que le nom n'existe pas deja * * @param string $dir * @param string $extension * @return string */ function dump_nom_fichier($dir, $extension = 'sqlite') { include_spip('inc/texte'); $site = isset($GLOBALS['meta']['nom_site']) ? preg_replace(array(",\\W,is", ",_(?=_),", ",_\$,"), array("_", "", ""), couper(translitteration(trim($GLOBALS['meta']['nom_site'])), 30, "")) : 'spip'; $site .= '_' . date('Ymd'); $nom = $site; $cpt = 0; while (file_exists($dir . $nom . ".{$extension}")) { $nom = $site . sprintf('_%03d', ++$cpt); } return $nom . ".{$extension}"; }
function expression_recherche($recherche, $options) { $u = $GLOBALS['meta']['pcre_u']; include_spip('inc/charsets'); $recherche = trim(translitteration($recherche)); $is_preg = false; if (substr($recherche, 0, 1) == '/' and substr($recherche, -1, 1) == '/') { // c'est une preg $preg = $recherche . $options['preg_flags']; $is_preg = true; } else { // s'il y a plusieurs mots il faut les chercher tous : oblige REGEXP if (preg_match(",\\s+," . $u, $recherche)) { $is_preg = true; $recherche = preg_replace(',\\s+,' . $u, '|', $recherche); } $preg = '/' . str_replace('/', '\\/', $recherche) . '/' . $options['preg_flags']; } // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite // ou si l'expression reguliere est invalide if (!$is_preg or @preg_match($preg, '') === FALSE) { $methode = 'LIKE'; $u = $GLOBALS['meta']['pcre_u']; // eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses $recherche = str_replace(array('(', ')', '?', '[', ']', '+', '*', '/'), array('\\(', '\\)', '[?]', '\\[', '\\]', '\\+', '\\*', '\\/'), $recherche); $recherche_mod = $recherche; // echapper les % et _ $q = str_replace(array('%', '_'), array('\\%', '\\_'), trim($recherche)); // les expressions entre " " sont un mot a chercher tel quel // -> on remplace les espaces par un _ et on enleve les guillemets if (preg_match(',["][^"]+["],Uims', $q, $matches)) { foreach ($matches as $match) { // corriger le like dans le $q $word = preg_replace(",\\s+,Uims", "_", $match); $word = trim($word, '"'); $q = str_replace($match, $word, $q); // corriger la regexp $word = preg_replace(",\\s+,Uims", "[\\s]", $match); $word = trim($word, '"'); $recherche_mod = str_replace($match, $word, $recherche_mod); } } $q = sql_quote("%" . preg_replace(",\\s+," . $u, "%", $q) . "%"); $preg = '/' . preg_replace(",\\s+," . $u, ".+", trim($recherche_mod)) . '/' . $options['preg_flags']; } else { $methode = 'REGEXP'; $q = sql_quote(trim($recherche, '/')); } return array($methode, $q, $preg); }
/** * Afficher une liste de plugins dans l'interface * http://doc.spip.org/@affiche_liste_plugins * * @param string $url_page * @param array $liste_plugins * @param array $liste_plugins_checked * @param array $liste_plugins_actifs * @param string $dir_plugins * @param string $afficher_un * @return string */ function plugins_afficher_liste_dist($url_page, $liste_plugins, $liste_plugins_checked, $liste_plugins_actifs, $dir_plugins = _DIR_PLUGINS, $afficher_un = 'afficher_plugin') { $get_infos = charger_fonction('get_infos', 'plugins'); $ligne_plug = charger_fonction($afficher_un, 'plugins'); $all_infos = $get_infos($liste_plugins, false, $dir_plugins); $all_infos = pipeline('filtrer_liste_plugins', array('args' => array('liste_plugins' => $liste_plugins, 'liste_plugins_checked' => $liste_plugins_checked, 'liste_plugins_actifs' => $liste_plugins_actifs, 'dir_plugins' => $dir_plugins), 'data' => $all_infos)); $liste_plugins = array_flip($liste_plugins); foreach ($liste_plugins as $chemin => $v) { // des plugins ont pu etre enleves de la liste par le pipeline. On en tient compte. if (isset($all_infos[$chemin])) { $liste_plugins[$chemin] = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($all_infos[$chemin]['nom'])))))); } else { unset($liste_plugins[$chemin]); } } asort($liste_plugins); $exposed = urldecode(_request('plugin')); $block_par_lettre = false; //count($liste_plugins)>10; $fast_liste_plugins_actifs = array(); $fast_liste_plugins_checked = array(); if (is_array($liste_plugins_actifs)) { $fast_liste_plugins_actifs = array_flip($liste_plugins_actifs); } if (is_array($liste_plugins_checked)) { $fast_liste_plugins_checked = array_flip($liste_plugins_checked); } $res = ''; $block = ''; $initiale = ''; $block_actif = false; foreach ($liste_plugins as $plug => $nom) { if (($i = substr($nom, 0, 1)) !== $initiale) { $res .= $block_par_lettre ? affiche_block_initiale($initiale, $block, $block_actif) : $block; $initiale = $i; $block = ''; $block_actif = false; } // le rep suivant $actif = isset($fast_liste_plugins_actifs[$plug]); $checked = isset($fast_liste_plugins_checked[$plug]); $block_actif = $block_actif | $actif; $expose = ($exposed and ($exposed == $plug or $exposed == $dir_plugins . $plug or $exposed == substr($dir_plugins, strlen(_DIR_RACINE)) . $plug)); $block .= $ligne_plug($url_page, $plug, $checked, $actif, $expose, "item", $dir_plugins) . "\n"; } $res .= $block_par_lettre ? affiche_block_initiale($initiale, $block, $block_actif) : $block; $class = basename($dir_plugins); return $res ? "<ul class='liste-items plugins {$class}'>{$res}</ul>" : ""; }
function inc_exporter_csv_dist($titre, $resource, $delim=',', $entetes = null,$envoyer = true){ $filename = preg_replace(',[^-_\w]+,', '_', translitteration(textebrut(typo($titre)))); if ($delim == 'TAB') $delim = "\t"; if (!in_array($delim,array(',',';',"\t"))) $delim = ","; $charset = $GLOBALS['meta']['charset']; $importer_charset = null; if ($delim == ',') $extension = 'csv'; else { $extension = 'xls'; # Excel n'accepte pas l'utf-8 ni les entites html... on transcode tout ce qu'on peut $importer_charset = $charset = 'iso-8859-1'; } $filename = "$filename.$extension"; if ($entetes AND is_array($entetes) AND count($entetes)) $output = exporter_csv_ligne($entetes,$delim,$importer_charset); // on passe par un fichier temporaire qui permet de ne pas saturer la memoire // avec les gros exports $fichier = sous_repertoire(_DIR_CACHE,"export") . $filename; $fp = fopen($fichier, 'w'); $length = fwrite($fp, $output); while ($row=is_array($resource)?array_shift($resource):sql_fetch($resource)){ $output = exporter_csv_ligne($row,$delim,$importer_charset); $length += fwrite($fp, $output); } fclose($fp); if ($envoyer) { Header("Content-Type: text/comma-separated-values; charset=$charset"); Header("Content-Disposition: attachment; filename=$filename"); //non supporte //Header("Content-Type: text/plain; charset=$charset"); Header("Content-Length: $length"); ob_clean(); flush(); readfile($fichier); } return $fichier; }
function copier_document($ext, $orig, $source) { $orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc $dir = creer_repertoire_documents($ext); $dest = preg_replace("/[^.=\w-]+/", "_", translitteration(preg_replace("/\.([^.]+)$/", "", preg_replace("/<[^>]*>/", '', basename($orig))))); // ne pas accepter de noms de la forme -r90.jpg qui sont reserves // pour les images transformees par rotation (action/documenter) $dest = preg_replace(',-r(90|180|270)$,', '', $dest); // Si le document "source" est deja au bon endroit, ne rien faire if ($source == ($dir . $dest . '.' . $ext)) return $source; // sinon tourner jusqu'a trouver un numero correct $n = 0; while (@file_exists($newFile = $dir . $dest .($n++ ? ('-'.$n) : '').'.'.$ext)); return deplacer_fichier_upload($source, $newFile); }
function action_exporter() { //global $auteur_session; $arg = _request('arg'); $args = explode(":", $arg); $hash = _request('hash'); //$id_auteur = $auteur_session['id_auteur']; $redirect = _request('redirect'); if ($redirect == NULL) { $redirect = ""; } //include_spip("inc/securiser_action"); //if (verifier_action_auteur("snippet_exporte-$arg",$hash,$id_auteur)==TRUE) { $table = array_shift($args); $id = $args; $f = snippets_fond_exporter($table, false); spip_log('f ' . $f, 'export'); if ($f) { include_spip('public/assembler'); $out = recuperer_fond($f, array('id' => $id)); //$out = preg_replace(",\n\n[\s]*(?=\n),","",$out); // $filename=str_replace(":","_",$arg); $today = date(Ymd); $filename = $table . '_export_' . $today; if (preg_match(",<titre>(.*)</titre>,Uims", $out, $regs)) { $filename = preg_replace(',[^-_\\w]+,', '_', trim(translitteration(textebrut(typo($regs[1]))))); } $extension = "csv"; Header("Content-Type: text/csv; charset=" . $GLOBALS['meta']['charset']); Header("Content-Disposition: attachment; filename={$filename}.{$extension}"); Header("Content-Length: " . strlen($out)); echo $out; exit; // } } redirige_par_entete(str_replace("&", "&", urldecode($redirect))); }
/** * enlever les accents des cles presentes dans le head, * sinon ca pose des problemes ... * * @param string $key * @return string */ function importer_csv_nettoie_key($key) { return translitteration($key); }
/** * Lister les fichiers contenus dans un zip * * @param array $files * La liste des fichiers * @return string $res * La liste HTML des fichiers <li>...</li> */ function joindre_liste_contenu_tailles_archive($files) { include_spip('inc/charsets'); # pour le nom de fichier $res = ''; if (is_array($files)) { foreach ($files as $nom => $file) { $nom = translitteration($nom); $date = date_interface(date("Y-m-d H:i:s", $file['mtime'])); $taille = taille_en_octets($file['size']); $res .= "<li title=\"" . attribut_html($title) . "\"><b>{$nom}</b> – {$taille}<br /> {$date}</li>\n"; } } return $res; }
/** * Tester le type de document * * - le document existe et n'est pas de taille 0 ? * - interdit a l'upload ? * - quelle extension dans spip_types_documents ? * - est-ce "inclus" comme une image ? * * Le zipper si necessaire * * @param array $file * Au format $_FILES * @param string $mode * Mode d'inclusion du fichier, si connu * @return array */ function fixer_fichier_upload($file, $mode = '') { /** * On vérifie que le fichier existe et qu'il contient quelque chose */ if (is_array($row = verifier_upload_autorise($file['name'], $mode))) { if (!isset($row['autozip'])) { $row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']); /** * On vérifie que le fichier a une taille * si non, on le supprime et on affiche une erreur */ if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) { spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)"); spip_unlink(get_spip_doc($row['fichier'])); return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name'])); } else { return $row; } } else { unset($row['autozip']); $ext = 'zip'; if (!($tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))) { return false; } spip_unlink($tmp_dir); @mkdir($tmp_dir); include_spip('inc/charsets'); $tmp = $tmp_dir . '/' . translitteration($file['name']); $file['name'] .= '.' . $ext; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip // deplacer le fichier tmp_name dans le dossier tmp deplacer_fichier_upload($file['tmp_name'], $tmp, true); include_spip('inc/pclzip'); $source = _DIR_TMP . basename($tmp_dir) . '.' . $ext; $archive = new PclZip($source); $v_list = $archive->create($tmp, PCLZIP_OPT_REMOVE_PATH, $tmp_dir, PCLZIP_OPT_ADD_PATH, ''); effacer_repertoire_temporaire($tmp_dir); if (!$v_list) { spip_log("Echec creation du zip "); return false; } $row['fichier'] = copier_document($row['extension'], $file['name'], $source); spip_unlink($source); /** * On vérifie que le fichier a une taille * si non, on le supprime et on affiche une erreur */ if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) { spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)"); spip_unlink(get_spip_doc($row['fichier'])); return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name'])); } else { return $row; } } } else { return $row; } // retourner le message d'erreur }
function ancre_url($url, $ancre) { // lever l'#ancre if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) { $url = $r[1]; } if (preg_match('/[^-_a-zA-Z0-9]+/S', $ancre)) { if (!function_exists('translitteration')) { include_spip('inc/charsets'); } $ancre = preg_replace(array('/^[^-_a-zA-Z0-9]+/', '/[^-_a-zA-Z0-9]/'), array('', '-'), translitteration($ancre)); } return $url . (strlen($ancre) ? '#' . $ancre : ''); }
function expression_recherche($recherche, $options) { // ne calculer qu'une seule fois l'expression par hit // (meme si utilisee dans plusieurs boucles) static $expression = array(); $key = serialize(array($recherche, $options['preg_flags'])); if (isset($expression[$key])) { return $expression[$key]; } $u = $GLOBALS['meta']['pcre_u']; if ($u and strpos($options['preg_flags'], $u) === false) { $options['preg_flags'] .= $u; } include_spip('inc/charsets'); $recherche = trim($recherche); $is_preg = false; if (substr($recherche, 0, 1) == '/' and substr($recherche, -1, 1) == '/') { // c'est une preg $recherche_trans = translitteration($recherche); $preg = $recherche_trans . $options['preg_flags']; $is_preg = true; } else { // s'il y a plusieurs mots il faut les chercher tous : oblige REGEXP, // sauf ceux de moins de 4 lettres (on supprime ainsi 'le', 'les', 'un', // 'une', 'des' ...) // attention : plusieurs mots entre guillemets sont a rechercher tels quels $recherche_trans = $recherche_mod = $recherche; // les expressions entre " " sont un mot a chercher tel quel // -> on remplace les espaces par un \x1 et on enleve les guillemets if (preg_match(',["][^"]+["],Uims', $recherche_mod, $matches)) { foreach ($matches as $match) { $word = preg_replace(",\\s+,Uims", "", $match); $word = trim($word, '"'); $recherche_mod = str_replace($match, $word, $recherche_mod); } } if (preg_match(",\\s+," . $u, $recherche_mod)) { $is_preg = true; $recherche_inter = '|'; $recherche_mots = explode(' ', $recherche_mod); $min_long = defined('_RECHERCHE_MIN_CAR') ? _RECHERCHE_MIN_CAR : 4; foreach ($recherche_mots as $mot) { if (strlen($mot) >= $min_long) { // echapper les caracteres de regexp qui sont eventuellement dans la recherche $recherche_inter .= preg_quote($mot) . ' '; } } $recherche_inter = str_replace("", '\\s', $recherche_inter); // mais on cherche quand même l'expression complète, même si elle // comporte des mots de moins de quatre lettres $recherche = rtrim(preg_quote($recherche) . preg_replace(',\\s+,' . $u, '|', $recherche_inter), '|'); $recherche_trans = translitteration($recherche); } $preg = '/' . str_replace('/', '\\/', $recherche_trans) . '/' . $options['preg_flags']; } // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite // ou si l'expression reguliere est invalide if (!$is_preg or @preg_match($preg, '') === FALSE) { $methode = 'LIKE'; $u = $GLOBALS['meta']['pcre_u']; // echapper les % et _ $q = str_replace(array('%', '_'), array('\\%', '\\_'), trim($recherche)); // eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses $recherche = preg_quote($recherche); $recherche_trans = translitteration($recherche); $recherche_mod = $recherche_trans; // les expressions entre " " sont un mot a chercher tel quel // -> on remplace les espaces par un _ et on enleve les guillemets // corriger le like dans le $q if (preg_match(',["][^"]+["],Uims', $q, $matches)) { foreach ($matches as $match) { $word = preg_replace(",\\s+,Uims", "_", $match); $word = trim($word, '"'); $q = str_replace($match, $word, $q); } } // corriger la regexp if (preg_match(',["][^"]+["],Uims', $recherche_mod, $matches)) { foreach ($matches as $match) { $word = preg_replace(",\\s+,Uims", "[\\s]", $match); $word = trim($word, '"'); $recherche_mod = str_replace($match, $word, $recherche_mod); } } $q = sql_quote("%" . preg_replace(",\\s+," . $u, "%", $q) . "%"); $preg = '/' . preg_replace(",\\s+," . $u, ".+", trim($recherche_mod)) . '/' . $options['preg_flags']; } else { $methode = 'REGEXP'; $q = sql_quote(trim($recherche, '/')); } // tous les caracteres transliterables de $q sont remplaces par un joker // permet de matcher en SQL meme si on est sensible aux accents (SQLite) $q_t = $q; for ($i = 0; $i < spip_strlen($q); $i++) { $char = spip_substr($q, $i, 1); if (!is_ascii($char) and $char_t = translitteration($char) and $char_t !== $char) { $q_t = str_replace($char, $is_preg ? "." : "_", $q_t); } } $q = $q_t; // fix : SQLite 3 est sensible aux accents, on jokerise les caracteres // les plus frequents qui peuvent etre accentues // (oui c'est tres dicustable...) if (isset($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type']) and strncmp($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type'], 'sqlite', 6) == 0) { $q_t = strtr($q, "aeuioc", $is_preg ? "......" : "______"); // si il reste au moins un char significatif... if (preg_match(",[^'%_.],", $q_t)) { $q = $q_t; } } return $expression[$key] = array($methode, $q, $preg); }
/** * Copier un document * * @param string $ext L'extension du fichier * @param string $dest le nom sous lequel le sauvegarder * @param string $source le fichier sur le serveur (/var/tmp/xyz34) * @param string $dans Où le copier * @return string */ function cfg_copier_document($ext, $dest, $source, $dans='_cfg') { $dest = preg_replace(',\.\.+,', '.', $dest); // pas de .. dans le nom du doc $dir = cfg_creer_repertoire_cfg($dans); $dest = preg_replace("/[^._=-\w\d]+/", "_", translitteration(preg_replace("/\.([^.]+)$/", "", preg_replace("/<[^>]*>/", '', basename($dest))))); // ne pas accepter de noms de la forme -r90.jpg qui sont reserves // pour les images transformees par rotation (action/documenter) $dest = preg_replace(',-r(90|180|270)$,', '', $dest); $newFile = $dir . $dest .'.'.$ext; return _COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $newFile) : deplacer_fichier_upload($source, $newFile); }
function translitteration_complexe($texte) { return translitteration($texte, 'AUTO', 'complexe'); }
function afficher_liste_plugins_distants($liste){ $res = ""; if (!$liste) return ""; $menu = array(); $compte = 0; $afficher_plugin_distant = charger_fonction('afficher_plugin_distant','plugins'); $url_page = self(); foreach ($liste as $url => $info) { $titre = $info[0]; $titre = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($titre)))))); $menu[$titre] = $afficher_plugin_distant($url_page, $url, $info, _request('plugin')==$url); } ksort($menu); $res .= "<h3>"._T('plugins_compte',array('count' => count($menu)))."</h3>" . '<p>'._T('plugin_info_automatique_select',array('rep'=>joli_repertoire(_DIR_PLUGINS_AUTO))).'</p>' . "<ul class='liste-items plugins distants'>".join("\n",$menu)."</ul>"; return $res; }
function recherche_en_base($recherche='', $tables=NULL, $options=array(), $serveur='') { include_spip('base/abstract_sql'); if (!is_array($tables)) { $liste = liste_des_champs(); if (is_string($tables) AND $tables != '') { $toutes = array(); foreach(explode(',', $tables) as $t) if (isset($liste[$t])) $toutes[$t] = $liste[$t]; $tables = $toutes; unset($toutes); } else $tables = $liste; } include_spip('inc/autoriser'); // options par defaut $options = array_merge(array( 'preg_flags' => 'UimsS', 'toutvoir' => false, 'champs' => false, 'score' => false, 'matches' => false, 'jointures' => false ), $options ); $results = array(); if (!strlen($recherche) OR !count($tables)) return array(); include_spip('inc/charsets'); $recherche = translitteration($recherche); $is_preg = false; if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/'){ // c'est une preg $preg = $recherche.$options['preg_flags']; $is_preg = true; } else $preg = '/'.str_replace('/', '\\/', $recherche).'/' . $options['preg_flags']; // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite // ou si l'expression reguliere est invalide if (!$is_preg OR (@preg_match($preg,'')===FALSE) ) { $methode = 'LIKE'; $u = $GLOBALS['meta']['pcre_u']; // eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses $recherche = str_replace( array('(',')','?','[', ']', '+', '*', '/'), array('\(','\)','[?]', '\[', '\]', '\+', '\*', '\/'), $recherche); $recherche_mod = $recherche; // echapper les % et _ $q = str_replace(array('%','_'), array('\%', '\_'), trim($recherche)); // les expressions entre " " sont un mot a chercher tel quel // -> on remplace les espaces par un _ et on enleve les guillemets if (preg_match(',["][^"]+["],Uims',$q,$matches)){ foreach($matches as $match){ // corriger le like dans le $q $word = preg_replace(",\s+,Uims","_",$match); $word = trim($word,'"'); $q = str_replace($match,$word,$q); // corriger la regexp $word = preg_replace(",\s+,Uims","[\s]",$match); $word = trim($word,'"'); $recherche_mod = str_replace($match,$word,$recherche_mod); } } $q = sql_quote( "%" . preg_replace(",\s+,".$u, "%", $q) . "%" ); $preg = '/'.preg_replace(",\s+,".$u, ".+", trim($recherche_mod)).'/' . $options['preg_flags']; } else { $methode = 'REGEXP'; $q = sql_quote(substr($recherche,1,-1)); } $jointures = $options['jointures'] ? liste_des_jointures() : array(); foreach ($tables as $table => $champs) { $requete = array( "SELECT"=>array(), "FROM"=>array(), "WHERE"=>array(), "GROUPBY"=>array(), "ORDERBY"=>array(), "LIMIT"=>"", "HAVING"=>array() ); $_id_table = id_table_objet($table); $requete['SELECT'][] = "t.".$_id_table; $a = array(); // Recherche fulltext foreach ($champs as $champ => $poids) { if (is_array($champ)){ spip_log("requetes imbriquees interdites"); } else { if (strpos($champ,".")===FALSE) $champ = "t.$champ"; $requete['SELECT'][] = $champ; $a[] = $champ.' '.$methode.' '.$q; } } if ($a) $requete['WHERE'][] = join(" OR ", $a); $requete['FROM'][] = table_objet_sql($table).' AS t'; $s = sql_select( $requete['SELECT'], $requete['FROM'], $requete['WHERE'], implode(" ",$requete['GROUPBY']), $requete['ORDERBY'], $requete['LIMIT'], $requete['HAVING'], $serveur ); while ($t = sql_fetch($s,$serveur)) { $id = intval($t[$_id_table]); if ($options['toutvoir'] OR autoriser('voir', $table, $id)) { // indiquer les champs concernes $champs_vus = array(); $score = 0; $matches = array(); $vu = false; foreach ($champs as $champ => $poids) { $champ = explode('.',$champ); $champ = end($champ); if ($n = ($options['score'] || $options['matches']) ? preg_match_all($preg, translitteration_rapide($t[$champ]), $regs, PREG_SET_ORDER) : preg_match($preg, translitteration_rapide($t[$champ])) ) { $vu = true; if ($options['champs']) $champs_vus[$champ] = $t[$champ]; if ($options['score']) $score += $n * $poids; if ($options['matches']) $matches[$champ] = $regs; if (!$options['champs'] AND !$options['score'] AND !$options['matches']) break; } } if ($vu) { if (!isset($results[$table])) $results[$table] = array(); $results[$table][$id] = array(); if ($champs_vus) $results[$table][$id]['champs'] = $champs_vus; if ($score) $results[$table][$id]['score'] = $score; if ($matches) $results[$table][$id]['matches'] = $matches; } } } // Gerer les donnees associees if (isset($jointures[$table]) AND $joints = recherche_en_base( $recherche, $jointures[$table], array_merge($options, array('jointures' => false)) ) ) { foreach ($joints as $table_liee => $ids_trouves) { if (!$rechercher_joints = charger_fonction("rechercher_joints_${table}_${table_liee}","inc",true)){ $cle_depart = id_table_objet($table); $cle_arrivee = id_table_objet($table_liee); $table_sql = preg_replace('/^spip_/', '', table_objet_sql($table)); $table_liee_sql = preg_replace('/^spip_/', '', table_objet_sql($table_liee)); if ($table_liee == 'document') $s = sql_select("id_objet as $cle_depart, $cle_arrivee", "spip_documents_liens", array("objet='$table'",sql_in('id_'.${table_liee}, array_keys($ids_trouves))), '','','','',$serveur); else $s = sql_select("$cle_depart,$cle_arrivee", "spip_${table_liee_sql}_${table_sql}", sql_in('id_'.${table_liee}, array_keys($ids_trouves)), '','','','',$serveur); } else list($cle_depart,$cle_arrivee,$s) = $rechercher_joints($table,$table_liee,array_keys($ids_trouves), $serveur); while ($t = is_array($s)?array_shift($s):sql_fetch($s)) { $id = $t[$cle_depart]; $joint = $ids_trouves[$t[$cle_arrivee]]; if (!isset($results[$table])) $results[$table] = array(); if (!isset($results[$table][$id])) $results[$table][$id] = array(); if ($joint['score']) $results[$table][$id]['score'] += $joint['score']; if ($joint['champs']) foreach($joint['champs'] as $c => $val) $results[$table][$id]['champs'][$table_liee.'.'.$c] = $val; if ($joint['matches']) foreach($joint['matches'] as $c => $val) $results[$table][$id]['matches'][$table_liee.'.'.$c] = $val; } } } } return $results; }
/** * http://code.spip.net/@test_login * * @param string $nom * @param string $mail * @return string */ function test_login($nom, $mail) { include_spip('inc/charsets'); $nom = strtolower(translitteration($nom)); $login_base = preg_replace("/[^\\w\\d_]/", "_", $nom); // il faut eviter que le login soit vraiment trop court if (strlen($login_base) < 3) { $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail))); $login_base = preg_replace("/[^\\w\\d]/", "_", $mail); } if (strlen($login_base) < 3) { $login_base = 'user'; } $login = $login_base; for ($i = 1;; $i++) { if (!sql_countsel('spip_auteurs', "login='******'")) { return $login; } $login = $login_base . $i; } return $login; }
function sommaire_id_ancre_ex($index, &$titre, $hn) { // traiter le format {{{Mon titre<mon_ancre>}}} (ou alt='Mon titre<mon_ancre>') if(preg_match(',<(\w+)>$,', $titre, $r) || preg_match(',<(\w+)>(?=\'),', $titre, $r)) { $titre = str_replace($r[0], '', $titre); return $r[1]; } // calculer les ancres d'apres le titre $a = strtolower(translitteration(sommaire_nettoyer_titre($titre))); $a = trim(preg_replace(',[^a-z0-9_]+,', '_', $a), '_'); return strlen($a)>2?$a:"sommaire_$index"; }
/** * Traitement de l'export des donnees auteurs. * * @param string $criteres de selection des auteurs * * @return array $retour nbre auteurs exportes et message de confirmation d'action. */ function exec_adhauteurs_export() { // Preparation affichage des choix type d'export $criteres_tot = _request('criteres'); $criteres = explode('|', $criteres_tot, 7); // Preparation de l'export des criteres (mise en forme dans le fichier out) // -- saison -- if (intval($criteres[2])) { $lib_criteres = sql_getfetsel('titre', 'spip_adhsaisons', array('id_saison=' . intval($criteres[2]))); $export_crit[0] = array('Saison', $lib_criteres); } else { $export_crit[0] = array('Saison', 'active'); } // -- technique -- if (intval($criteres[3])) { $adhwhere = array("type = 'niveau_Technique'"); $adhwhere = array_merge($adhwhere, array("id_mot = " . intval($criteres[3]))); $lib_criteres = sql_getfetsel('titre', 'spip_mots', $adhwhere); $export_crit[1] = array('Techbase', $lib_criteres); } else { $export_crit[1] = array('Techbase', '<<Tous>>'); } // -- encadrement -- if (intval($criteres[4])) { $adhwhere = array("type='Niveau_Encadrement'"); $adhwhere = array_merge($adhwhere, array("id_mot = " . intval($criteres[4]))); $lib_criteres = sql_getfetsel('titre', 'spip_mots', $adhwhere); $export_crit[2] = array('Encadrant', $lib_criteres); } else { $export_crit[2] = array('Encadrant', '<<Tous>>'); } // -- niveau -- if (intval($criteres[5])) { $lib_criteres = sql_getfetsel('titre', 'spip_adhnivs', array('id_niveau =' . intval($criteres[5]))); $export_crit[3] = array('Niveau', $criteres[6], $lib_criteres); } else { $export_crit[3] = array('Niveau', '<<Tous>>'); } $export_crit[4] = array('Champ', $criteres[0], $criteres[1]); /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - exec_adhauteurs_export - Pt05 - "; adhclub_log("$debug1.", true); adhclub_log("criteres tot= $criteres_tot.", true); adhclub_log("criteres 0= $criteres[0].", true); adhclub_log("criteres 1= $criteres[1].", true); adhclub_log("criteres 2= $criteres[2].", true); adhclub_log("criteres 3= $criteres[3].", true); adhclub_log("criteres 4= $criteres[4].", true); adhclub_log("criteres 5= $criteres[5].", true); adhclub_log("criteres 6= $criteres[6].", true); adhclub_log("criteres 7= $criteres[7].", true); adhclub_log("FIN $debug1.", true); */ $retour = _request('retour'); $delim = _request('delim'); if ($delim == 'TAB') { $delim = "\t"; } if (!$retour) { $retour = generer_url_ecrire('adh_adherents'); } $titre = _T("adhclub:exporter_user_nb", array('nb_auteurs' => $nb_auteurs)); if (!$delim) { $icone = _DIR_PLUGIN_ADHCLUB . "img_pack/adh_export-24.png"; // // Affichage de la page // $commencer_page = charger_fonction('commencer_page', 'inc'); pipeline('exec_init', array('args' => $_GET, 'data' => '')); echo $commencer_page($titre, "adhclub"); echo debut_gauche('', true); $raccourcis = recuperer_fond("prive/inclure/adh_menu_tous", $contexte); echo bloc_des_raccourcis($raccourcis); echo pipeline('affiche_gauche', array('args' => array('exec' => 'adhauteurs_export', 'sql_adh_auteurs' => $sql_adh_auteurs), 'data' => '')); echo creer_colonne_droite("", true); echo pipeline('affiche_droite', array('args' => array('exec' => 'adhauteurs_export', 'sql_adh_auteurs' => $sql_adh_auteurs), 'data' => '')); echo debut_droite("", true); $milieu = ''; $milieu .= "<div class='entete-formulaire'>"; // Icones retour if ($retour) { $milieu .= icone_verticale(_T('icone_retour'), $retour, $icone, "rien.gif", $GLOBALS['spip_lang_left']); } $milieu .= gros_titre($titre, '', false); $milieu .= "</div>"; $milieu .= "<div class='formulaire_spip'>"; $action = generer_url_ecrire("adhauteurs_export", "criteres={$criteres_tot}&retour={$retour}"); $milieu .= "\n<form action='{$action}' method='post' class='formulaire_editer'><div>" . form_hidden($action); $milieu .= "<ul><li><label for='delim'>" . _T("adhclub:export_format") . "</label>"; $milieu .= "<select name='delim' id='delim'>\n"; $milieu .= "<option value=','>" . _T("adhclub:export_classique") . "</option>\n"; $milieu .= "<option value=';'>" . _T("adhclub:export_excel") . "</option>\n"; $milieu .= "<option value='TAB'>" . _T("adhclub:export_tabulation") . "</option>\n"; $milieu .= "</select></li></ul>"; $milieu .= "<p class='boutons'><input type='submit' class='submit' name='ok' value='" . _T('bouton_download') . "' /></p>\n"; $milieu .= "</div></form>"; $milieu .= "</div>"; echo pipeline('affiche_milieu', array('args' => array('exec' => 'adhauteurs_export', 'criteres' => $criteres_tot, 'retour' => $retour), 'data' => $milieu)); echo fin_gauche(), fin_page(); exit; } // Debut de l'export des donnees // Recuperation de la requete des adherents suivant filtrage (array de la forme SELECT..) $sql_adh_auteurs = adh_recherche($criteres[0], $criteres[1], 'spip_auteurs', $criteres[2], $criteres[3], $criteres[4], $criteres[5], $criteres[6], true); if ($sql_adh_auteurs) { // JR 20/03/2013 - Definir les colonnes a extraire pour $adh_select $adhselect_l = array("au.id_auteur", "au.nom_famille", "au.prenom", "au.sexe", "au.naissance", "au.fonction as licence", "au.mobile", "au.telephone", "au.email", "au.certiflimite as date_certif", "au.certifaspirine as allergie_aspirine", "au.certifqualif as certif_restreint"); $adhfrom_l = array("spip_auteurs au"); $adhwhere_l = array("au.id_auteur IN(" . $sql_adh_auteurs . ")"); // -- Si la saison est explicite, // on recherche les données Cotisations et Assurances associees a chaque auteur if (intval($criteres[2])) { $adhselect_l = array_merge($adhselect_l, array("co_l.id_coti", "co_l.titre as cotisation", "co_l.mnt_cotis", "as_l.id_assur", "as_l.titre as assurance", "as_l.mnt_assur")); $adhfrom_l = array_merge($adhfrom_l, array("spip_adhcotis co_l", "spip_adhcotis_liens ca_l", "spip_adhassurs as_l", "spip_adhassurs_liens aa_l")); $adhwhere_l = array_merge($adhwhere_l, array("au.id_auteur=ca_l.id_objet", "ca_l.objet='auteur'", "ca_l.id_coti=co_l.id_coti", "co_l.id_saison=" . intval($criteres[2]), "co_l.complement='non'", "au.id_auteur=aa_l.id_objet", "aa_l.objet='auteur'", "aa_l.id_assur=as_l.id_assur", "as_l.id_saison=" . intval($criteres[2]))); } /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - Pt25 - "; adhclub_log("$debug1.", true); $debug2 = sql_get_select($adhselect_l, $adhfrom_l, sql_in('au.id_auteur', $sql_adh_auteurs)); adhclub_log("debug2=$debug2.", true); adhclub_log("adhwhere_l=$adhwhere_l.", true); $debug3 = sql_get_select($adhselect_l, $adhfrom_l, $adhwhere_l); adhclub_log("debug3=$debug3.", true); adhclub_log("FIN $debug1.", true); */ if ($export_auteurs = sql_allfetsel($adhselect_l, $adhfrom_l, $adhwhere_l)) { foreach ($export_auteurs as $ligne) { $list_entete = array(); $list_valeur = array(); foreach ($ligne as $k => $v) { /*$debug1= "DEBUG adhclub JR : exec/adhauteurs_export - Pt35 - "; adhclub_log("$debug1.", true); adhclub_log("k= $k , v= $v.", true); adhclub_log("FIN $debug1.", true);*/ $list_entete = array_merge($list_entete, array($k)); $list_valeur = array_merge($list_valeur, array($v)); } // Ecriture de l'entete des colonnes. if ($nb_auteurs == 0) { // JR-2013/08/01-Mise en forme des criteres en tete du fichier exporte. // JR-25/03/2015-Utilisation des F(spip_bonux) existantes. $output = exporter_csv_ligne(array('CRITERES'), $delim); $output .= exporter_csv_ligne(array('-_-_-_-', '-_-_-_-_-_-_-_-_-_-_-_-'), $delim); $output .= exporter_csv_ligne($export_crit[0], $delim); $output .= exporter_csv_ligne($export_crit[1], $delim); $output .= exporter_csv_ligne($export_crit[2], $delim); $output .= exporter_csv_ligne($export_crit[3], $delim); $output .= exporter_csv_ligne($export_crit[4], $delim); $output .= exporter_csv_ligne(array('-_-_-_-', '-_-_-_-_-_-_-_-_-_-_-_-'), $delim); // JR-20130801-Entetes de colonnes. $output .= exporter_csv_ligne($list_entete, $delim); } // Ecriture des lignes de donnees. $output .= exporter_csv_ligne($list_valeur, $delim); ++$nb_auteurs; } $charset = $GLOBALS['meta']['charset']; $file_csv = "export_auteurs_" . date('Ymd_His'); // @todo-JR-25/03/2015-Utilisation des F(spip_bonux) existantes. Attention remplissage criteres. //$filename = inc_exporter_csv($file_csv, ' ', $delim); $filename = preg_replace(',[^-_\\w]+,', '_', translitteration(textebrut(typo($file_csv)))); // Excel ? if ($delim == ',') { $extension = 'csv'; } else { // Extension 'csv' si delim = ';' (et pas forcément 'xls' !) if ($delim == ';') { $extension = 'csv'; } else { $extension = 'xls'; } } # Excel n'accepte pas l'utf-8 ni les entites html... on fait quoi? include_spip('inc/charsets'); $output = unicode2charset(charset2unicode($output), 'iso-8859-1'); $charset = 'iso-8859-1'; } Header("Content-Type: text/comma-separated-values; charset={$charset}"); Header("Content-Disposition: attachment; filename={$filename}.{$extension}"); //Header("Content-Type: text/plain; charset=$charset"); Header("Content-Length: " . strlen($output)); echo $output; exit; //*/ } else { include_spip('inc/minipres'); echo minipres(); } }
/** * http://doc.spip.org/@test_login * * @param string $nom * @param string $mail * @return string */ function test_login($nom, $mail) { include_spip('inc/charsets'); $nom = strtolower(translitteration($nom)); $login_base = preg_replace("/[^\\w\\d_]/", "_", $nom); // il faut eviter que le login soit vraiment trop court if (strlen($login_base) < 3) { $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail))); $login_base = preg_replace("/[^\\w\\d]/", "_", $mail); } if (strlen($login_base) < 3) { $login_base = 'user'; } // eviter aussi qu'il soit trop long (essayer d'attraper le prenom) if (strlen($login_base) > 10) { $login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/", '\\1', $login_base); $login_base = substr($login_base, 0, 13); } $login = $login_base; for ($i = 1;; $i++) { if (!sql_countsel('spip_auteurs', "login='******'")) { return $login; } $login = $login_base . $i; } return $login; }
function adhclub_imp_nettoie_key($key) { return translitteration($key); }
/** * csv -> tableau * @param string $u * @return array|bool */ function inc_csv_to_array_dist($u) { include_spip('inc/csv'); list($entete, $csv) = analyse_csv($u); array_unshift($csv, $entete); include_spip('inc/charsets'); foreach ($entete as $k => $v) { $v = strtolower(preg_replace(',\\W+,', '_', translitteration($v))); foreach ($csv as &$item) { $item[$v] =& $item[$k]; } } return $csv; }
function translitteration_complexe($texte, $chiffres=false) { $texte = translitteration($texte,'AUTO','complexe'); if ($chiffres) { $texte = preg_replace("/[aeiuoyd]['`?~.^+(-]{1,2}/eS", "translitteration_chiffree('\\0')", $texte); } return $texte; }
function inc_recherche_to_array_dist($recherche, $options = array()) { // options par defaut $options = array_merge(array('score' => true, 'champs' => false, 'toutvoir' => false, 'matches' => false, 'jointures' => false), $options); include_spip('inc/rechercher'); include_spip('inc/autoriser'); $requete = array("SELECT" => array(), "FROM" => array(), "WHERE" => array(), "GROUPBY" => array(), "ORDERBY" => array(), "LIMIT" => "", "HAVING" => array()); $table = sinon($options['table'], 'article'); if ($options['champs']) { $champs = $options['champs']; } else { $l = liste_des_champs(); $champs = $l['article']; } $serveur = $options['serveur']; list($methode, $q, $preg) = expression_recherche($recherche, $options); $jointures = $options['jointures'] ? liste_des_jointures() : array(); $_id_table = id_table_objet($table); // c'est un pis-aller : ca a peu de chance de marcher, mais mieux quand meme que en conservant la ',' // (aka ca marche au moins dans certains cas comme avec spip_formulaires_reponses_champs) if (strpos($_id_table, ",") !== false) { $_id_table = explode(',', $_id_table); $_id_table = reset($_id_table); } $requete['SELECT'][] = "t." . $_id_table; $a = array(); // Recherche fulltext foreach ($champs as $champ => $poids) { if (is_array($champ)) { spip_log("requetes imbriquees interdites"); } else { if (strpos($champ, ".") === FALSE) { $champ = "t.{$champ}"; } $requete['SELECT'][] = $champ; $a[] = $champ . ' ' . $methode . ' ' . $q; } } if ($a) { $requete['WHERE'][] = join(" OR ", $a); } $requete['FROM'][] = table_objet_sql($table) . ' AS t'; $results = array(); $s = sql_select($requete['SELECT'], $requete['FROM'], $requete['WHERE'], implode(" ", $requete['GROUPBY']), $requete['ORDERBY'], $requete['LIMIT'], $requete['HAVING'], $serveur); while ($t = sql_fetch($s, $serveur) and (!isset($t['score']) or $t['score'] > 0)) { $id = intval($t[$_id_table]); if ($options['toutvoir'] or autoriser('voir', $table, $id)) { // indiquer les champs concernes $champs_vus = array(); $score = 0; $matches = array(); $vu = false; foreach ($champs as $champ => $poids) { $champ = explode('.', $champ); $champ = end($champ); // translitteration_rapide uniquement si on est deja en utf-8 $value = $GLOBALS['meta']['charset'] == 'utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ]); if ($n = $options['score'] || $options['matches'] ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER) : preg_match($preg, $value)) { $vu = true; if ($options['champs']) { $champs_vus[$champ] = $t[$champ]; } if ($options['score']) { $score += $n * $poids; } if ($options['matches']) { $matches[$champ] = $regs; } if (!$options['champs'] and !$options['score'] and !$options['matches']) { break; } } } if ($vu) { if (!isset($results)) { $results = array(); } $results[$id] = array(); if ($champs_vus) { $results[$id]['champs'] = $champs_vus; } if ($score) { $results[$id]['score'] = $score; } if ($matches) { $results[$id]['matches'] = $matches; } } } } // Gerer les donnees associees // ici on est un peu naze : pas capables de reconstruire une jointure complexe // on ne sait passer que par table de laison en 1 coup if (isset($jointures[$table]) and $joints = recherche_en_base($recherche, $jointures[$table], array_merge($options, array('jointures' => false)))) { include_spip('action/editer_liens'); $trouver_table = charger_fonction('trouver_table', 'base'); $cle_depart = id_table_objet($table); $table_depart = table_objet($table, $serveur); $desc_depart = $trouver_table($table_depart, $serveur); $depart_associable = objet_associable($table); foreach ($joints as $table_liee => $ids_trouves) { // on peut definir une fonction de recherche jointe pour regler les cas particuliers if (!($rechercher_joints = charger_fonction("rechercher_joints_{$table}_{$table_liee}", "inc", true) or $rechercher_joints = charger_fonction("rechercher_joints_objet_{$table_liee}", "inc", true) or $rechercher_joints = charger_fonction("rechercher_joints_{$table}_objet_lie", "inc", true))) { $cle_arrivee = id_table_objet($table_liee); $table_arrivee = table_objet($table_liee, $serveur); $desc_arrivee = $trouver_table($table_arrivee, $serveur); // cas simple : $cle_depart dans la table_liee if (isset($desc_arrivee['field'][$cle_depart])) { $s = sql_select("{$cle_depart}, {$cle_arrivee}", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); } elseif (isset($desc_depart['field'][$cle_arrivee])) { $s = sql_select("{$cle_depart}, {$cle_arrivee}", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); } elseif ($l = objet_associable($table_liee)) { list($primary, $table_liens) = $l; $s = sql_select("id_objet as {$cle_depart}, {$primary} as {$cle_arrivee}", $table_liens, array("objet='{$table}'", sql_in($primary, array_keys($ids_trouves))), '', '', '', '', $serveur); } elseif ($l = $depart_associable) { list($primary, $table_liens) = $l; $s = sql_select("{$primary} as {$cle_depart}, id_objet as {$cle_arrivee}", $table_liens, array("objet='{$table_liee}'", sql_in('id_objet', array_keys($ids_trouves))), '', '', '', '', $serveur); } elseif ($t = $trouver_table($table_arrivee . "_" . $table_depart, $serveur) or $t = $trouver_table($table_depart . "_" . $table_arrivee, $serveur)) { $s = sql_select("{$cle_depart},{$cle_arrivee}", $t["table_sql"], sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); } } else { list($cle_depart, $cle_arrivee, $s) = $rechercher_joints($table, $table_liee, array_keys($ids_trouves), $serveur); } while ($t = is_array($s) ? array_shift($s) : sql_fetch($s)) { $id = $t[$cle_depart]; $joint = $ids_trouves[$t[$cle_arrivee]]; if (!isset($results)) { $results = array(); } if (!isset($results[$id])) { $results[$id] = array(); } if (isset($joint['score']) and $joint['score']) { if (!isset($results[$id]['score'])) { $results[$id]['score'] = 0; } $results[$id]['score'] += $joint['score']; } if (isset($joint['champs']) and $joint['champs']) { foreach ($joint['champs'] as $c => $val) { $results[$id]['champs'][$table_liee . '.' . $c] = $val; } } if (isset($joint['matches']) and $joint['matches']) { foreach ($joint['matches'] as $c => $val) { $results[$id]['matches'][$table_liee . '.' . $c] = $val; } } } } } return $results; }
/** * Envoi d'un mail * * @param string $destinataire * @param string $sujet * @param string|array $corps * - au format string, c'est un corps d'email au format texte, comme supporte nativement par le core * - au format array, c'est un corps etendu qui peut contenir * - string texte : le corps d'email au format texte * - string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) * - array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- * --- chargee de convertir en texte encodee les pieces jointes --- * - array pieces_jointes : listes de pieces a embarquer dans l'email, chacune au format array : * - string chemin : chemin file system pour trouver le fichier a embarquer * - string nom : nom du document tel qu'apparaissant dans l'email * - string encodage : encodage a utiliser, parmi 'base64', '7bit', '8bit', 'binary', 'quoted-printable' * - string mime : mime type du document * --- Non implemente ici --- * - string html : le corps d'email au format html * - string nom_envoyeur : un nom d'envoyeur pour completer l'email from * - string cc : destinataires en copie conforme * - string bcc : destinataires en copie conforme cachee * - string adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = '', $headers = '') { if (!email_valide($destinataire)) { return false; } if ($destinataire == _T('info_mail_fournisseur')) { return false; } // tres fort // Fournir si possible un Message-Id: conforme au RFC1036, // sinon SpamAssassin denoncera un MSGID_FROM_MTA_HEADER $email_envoi = $GLOBALS['meta']['email_envoi']; if (!email_valide($email_envoi)) { spip_log('Meta email_envoi invalide. Le mail sera probablement vu comme spam.'); $email_envoi = $destinataire; } $parts = ''; if (is_array($corps)) { $texte = $corps['texte']; $from = isset($corps['from']) ? $corps['from'] : $from; $headers = isset($corps['headers']) ? $corps['headers'] : $headers; if (is_array($headers)) { $headers = implode("\n", $headers); } if ($corps['pieces_jointes'] and function_exists('mail_embarquer_pieces_jointes')) { $parts = mail_embarquer_pieces_jointes($corps['pieces_jointes']); } } else { $texte = $corps; } if (!$from) { $from = $email_envoi; } // ceci est la RegExp NO_REAL_NAME faisant hurler SpamAssassin if (preg_match('/^["\\s]*\\<?\\S+\\@\\S+\\>?\\s*$/', $from)) { $from .= ' (' . str_replace(')', '', translitteration(str_replace('@', ' at ', $from))) . ')'; } // nettoyer les é ’, &emdash; etc... // les 'cliquer ici' etc sont a eviter; voir: // http://mta.org.ua/spamassassin-2.55/stuff/wiki.CustomRulesets/20050914/rules/french_rules.cf $texte = nettoyer_caracteres_mail($texte); $sujet = nettoyer_caracteres_mail($sujet); // encoder le sujet si possible selon la RFC if (init_mb_string()) { # un bug de mb_string casse mb_encode_mimeheader si l'encoding interne # est UTF-8 et le charset iso-8859-1 (constate php5-mac ; php4.3-debian) $charset = $GLOBALS['meta']['charset']; mb_internal_encoding($charset); $sujet = mb_encode_mimeheader($sujet, $charset, 'Q', "\n"); mb_internal_encoding('utf-8'); } if (function_exists('wordwrap') && preg_match(',multipart/mixed,', $headers) == 0) { $texte = wordwrap($texte); } list($headers, $texte) = mail_normaliser_headers($headers, $from, $destinataire, $texte, $parts); if (_OS_SERVEUR == 'windows') { $texte = preg_replace("@\r*\n@", "\r\n", $texte); $headers = preg_replace("@\r*\n@", "\r\n", $headers); $sujet = preg_replace("@\r*\n@", "\r\n", $sujet); } spip_log("mail {$destinataire}\n{$sujet}\n{$headers}", 'mails'); // mode TEST : forcer l'email if (defined('_TEST_EMAIL_DEST')) { if (!_TEST_EMAIL_DEST) { return false; } else { $texte = "Dest : {$destinataire}\r\n" . $texte; $destinataire = _TEST_EMAIL_DEST; } } return @mail($destinataire, $sujet, $texte, $headers); }