Example #1
0
function exec_auteurs_dist()
{
	$tri = preg_replace('/\W/', '', _request('tri'));
	if (!$tri) $tri='nom'; 
	$statut =  _request('statut');
	if (!$statut)  $statut = AUTEURS_DEFAUT . AUTEURS_MIN_REDAC;
	$debut = intval(_request('debut'));

	$recherche = NULL;
	if ($cherche = _request('recherche')) {
		include_spip('inc/rechercher');
		$tables = liste_des_champs();
		$tables = array('auteur'=>$tables['auteur']);
		$recherche = recherche_en_base($cherche, $tables,array('toutvoir'=>true));
		if ($recherche['auteur'])
			$recherche = sql_in('aut.id_auteur', array_keys($recherche['auteur']));
		else {
			$recherche = "aut.id_auteur=0"; // rien trouve !
		}
	}
	$form = formulaire_recherche("auteurs",(($s=_request('statut'))?"<input type='hidden' name='statut' value='$s' />":""));
	exec_auteurs_args($statut, $tri, $debut, $recherche,$form, $cherche);
}
Example #2
0
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;
}
Example #3
0
function remplace_en_base($recherche = '', $remplace = NULL, $tables = NULL, $options = array())
{
    include_spip('inc/modifier');
    // options par defaut
    $options = array_merge(array('preg_flags' => 'UimsS', 'toutmodifier' => false), $options);
    $options['champs'] = true;
    if (!is_array($tables)) {
        $tables = liste_des_champs();
    }
    $results = recherche_en_base($recherche, $tables, $options);
    $preg = '/' . str_replace('/', '\\/', $recherche) . '/' . $options['preg_flags'];
    foreach ($results as $table => $r) {
        $_id_table = id_table_objet($table);
        foreach ($r as $id => $x) {
            if ($options['toutmodifier'] or autoriser('modifier', $table, $id)) {
                $modifs = array();
                foreach ($x['champs'] as $key => $val) {
                    if ($key == $_id_table) {
                        next;
                    }
                    $repl = preg_replace($preg, $remplace, $val);
                    if ($repl != $val) {
                        $modifs[$key] = $repl;
                    }
                }
                if ($modifs) {
                    objet_modifier_champs($table, $id, array('champs' => array_keys($modifs)), $modifs);
                }
            }
        }
    }
}
/**
 * Calcule une liste des paquets en fonctions de critères de recherche
 *
 * Cette liste :
 * - est sans doublons, ie on ne garde que la version la plus récente
 * - correspond aux critères
 * - est compatible avec la version SPIP installée sur le site
 * - ne liste pas ceux étant déjà installés (ces paquets peuvent toutefois être affichés)
 * - est triée par nom ou score
 *
 * @uses  liste_des_champs()
 * @uses  recherche_en_base()
 *
 * @param string $phrase
 *     Texte de la recherche
 * @param string $categorie
 *     Type de catégorie de plugin (auteur, date...)
 * @param string $etat
 *     État de plugin (stable, test...)
 * @param string|int $depot
 *     Identifiant de dépot
 * @param string $version_spip
 *     Version de SPIP dont le paquet doit être compatible
 * @param array $exclusions
 *     Liste d'identifiants de plugin à ne pas intégrer dans la liste
 * @param bool $afficher_exclusions
 *     Afficher aussi les paquets déjà installés (true)
 *     ou ceux qui ne le sont pas (false) ?
 * @param bool $doublon
 *     Afficher toutes les versions de paquet (true)
 *     ou seulement la plus récente (false) ?
 * @param string $tri
 *     Ordre du tri : nom | score
 *
 * @return array
 *     Tableau classé par pertinence de résultat
 *     - 'prefixe' => tableau de description du paquet (si pas de doublons demandé)
 *     - n => tableau de descriptions du paquet (si doublons autorisés)
 **/
function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $depot, $version_spip = '', $exclusions = array(), $afficher_exclusions = false, $doublon = false, $tri = 'nom')
{
    include_spip('inc/rechercher');
    $plugins = array();
    $scores = array();
    $ids_paquets = array();
    // On prepare l'utilisation de la recherche en base SPIP en la limitant aux tables spip_plugins
    // et spip_paquets  si elle n'est pas vide
    if ($phrase) {
        $liste = liste_des_champs();
        $tables = array('plugin' => $liste['plugin']);
        $options = array('jointures' => true, 'score' => true);
        // On cherche dans tous les enregistrements de ces tables des correspondances les plugins qui
        // correspondent a la phrase recherchee
        // -- On obtient une liste d'id de plugins et d'id de paquets
        $resultats = array('plugin' => array(), 'paquet' => array());
        $resultats = recherche_en_base($phrase, $tables, $options);
        // -- On prepare le tableau des scores avec les paquets trouves par la recherche
        if ($resultats) {
            // -- On convertit les id de plugins en id de paquets
            $ids = array();
            if (isset($resultats['plugin']) and $resultats['plugin']) {
                $ids_plugin = array_keys($resultats['plugin']);
                $where[] = sql_in('id_plugin', $ids_plugin);
                $ids = sql_allfetsel('id_paquet, id_plugin', 'spip_paquets', $where);
            }
            // -- On prepare les listes des id de paquet et des scores de ces memes paquets
            if (isset($resultats['paquet']) and $resultats['paquet']) {
                $ids_paquets = array_keys($resultats['paquet']);
                foreach ($resultats['paquet'] as $_id => $_score) {
                    $scores[$_id] = intval($resultats['paquet'][$_id]['score']);
                }
            }
            // -- On merge les deux tableaux de paquets sans doublon en mettant a jour un tableau des scores
            foreach ($ids as $_ids) {
                $id_paquet = intval($_ids['id_paquet']);
                $id_plugin = intval($_ids['id_plugin']);
                if (array_search($id_paquet, $ids_paquets) === false) {
                    $ids_paquets[] = $id_paquet;
                    $scores[$id_paquet] = intval($resultats['plugin'][$id_plugin]['score']);
                } else {
                    $scores[$id_paquet] = intval($resultats['paquet'][$id_paquet]['score']) + intval($resultats['plugin'][$id_plugin]['score']);
                }
            }
        }
    } else {
        if ($ids_paquets = sql_allfetsel('id_paquet', 'spip_paquets')) {
            $ids_paquets = array_map('reset', $ids_paquets);
            foreach ($ids_paquets as $_id) {
                $scores[$_id] = 0;
            }
        }
    }
    // Maintenant, on continue la recherche en appliquant, sur la liste des id de paquets,
    // les filtres complementaires : categorie, etat, exclusions et compatibilite spip
    // si on a bien trouve des resultats precedemment ou si aucune phrase n'a ete saisie
    // -- Preparation de la requete
    if ($ids_paquets) {
        $from = array('spip_plugins AS t1', 'spip_paquets AS t2', 'spip_depots AS t3');
        $select = array('t1.nom AS nom', 't1.slogan AS slogan', 't1.prefixe AS prefixe', 't1.id_plugin AS id_plugin', 't2.id_paquet AS id_paquet', 't2.description AS description', 't2.compatibilite_spip AS compatibilite_spip', 't2.lien_doc AS lien_doc', 't2.auteur AS auteur', 't2.licence AS licence', 't2.etat AS etat', 't2.logo AS logo', 't2.version AS version', 't2.nom_archive AS nom_archive', 't3.url_archives AS url_archives');
        $where = array('t1.id_plugin=t2.id_plugin', 't2.id_depot=t3.id_depot');
        if ($ids_paquets) {
            $where[] = sql_in('t2.id_paquet', $ids_paquets);
        }
        if ($categorie and $categorie != 'toute_categorie') {
            $where[] = 't1.categorie=' . sql_quote($categorie);
        }
        if ($etat and $etat != 'tout_etat') {
            $where[] = 't2.etat=' . sql_quote($etat);
        }
        if ($depot and $depot != 'tout_depot') {
            $where[] = 't2.id_depot=' . sql_quote($depot);
        }
        if ($exclusions and !$afficher_exclusions) {
            $where[] = sql_in('t2.id_plugin', $exclusions, 'NOT');
        }
        if ($resultats = sql_select($select, $from, $where)) {
            while ($paquets = sql_fetch($resultats)) {
                $prefixe = $paquets['prefixe'];
                $version = $paquets['version'];
                $nom = extraire_multi($paquets['nom']);
                $slogan = extraire_multi($paquets['slogan']);
                $description = extraire_multi($paquets['description']);
                if (svp_verifier_compatibilite_spip($paquets['compatibilite_spip'], $version_spip)) {
                    // Le paquet remplit tous les criteres, on peut le selectionner
                    // -- on utilise uniquement la langue du site
                    $paquets['nom'] = $nom;
                    $paquets['slogan'] = $slogan;
                    $paquets['description'] = $description;
                    // -- on ajoute le score si on a bien saisi une phrase
                    if ($phrase) {
                        $paquets['score'] = $scores[intval($paquets['id_paquet'])];
                    } else {
                        $paquets['score'] = 0;
                    }
                    // -- on construit l'url de l'archive
                    $paquets['url_archive'] = $paquets['url_archives'] . '/' . $paquets['nom_archive'];
                    // -- on gere les exclusions si elle doivent etre affichees
                    if ($afficher_exclusions and in_array($paquets['id_plugin'], $exclusions)) {
                        $paquets['installe'] = true;
                    } else {
                        $paquets['installe'] = false;
                    }
                    // -- On traite les doublons (meme plugin, versions differentes)
                    if ($doublon) {
                        $plugins[] = $paquets;
                    } else {
                        // ajout
                        // - si pas encore trouve
                        // - ou si sa version est inferieure (on garde que la derniere version)
                        if (!isset($plugins[$prefixe]) or !$plugins[$prefixe] or $plugins[$prefixe] and spip_version_compare($plugins[$prefixe]['version'], $version, '<')) {
                            $plugins[$prefixe] = $paquets;
                        }
                    }
                }
            }
        }
        // On trie le tableau par score décroissant ou nom croissant
        $fonction = 'svp_trier_par_' . $tri;
        if ($doublon) {
            usort($plugins, $fonction);
        } else {
            uasort($plugins, $fonction);
        }
    }
    return $plugins;
}
Example #5
0
function exec_recherche_dist() {

	$recherche = _request('recherche');
	$recherche_aff = entites_html($recherche);

	$commencer_page = charger_fonction('commencer_page', 'inc');
	echo $commencer_page(_T('titre_page_recherche', array('recherche' => $recherche_aff)));

	if (strlen($recherche)) {
		include_spip('inc/rechercher');
		include_spip('base/abstract_sql');

		$tables = liste_des_champs();
		//unset($tables['document']);
		unset($tables['forum']);
		unset($tables['syndic_article']);

		$results = recherche_en_base($recherche, $tables, array('jointures' => true, 'score' => false)); // true => a gerer dans l'affichage, autant faire un squelette

/*		$modifier = false;
		foreach ($results as $table => $r) {
			foreach ($r as $id => $x) {
				$modifier |= autoriser('modifier', $table, $id);
			}
		}
*/

		// Ajouter la recherche par identifiant
		if (preg_match(',^[0-9]+$,', $recherche)
		AND $id = intval($recherche))
		foreach ($tables as $table => $x) {
			$t = sql_countsel(table_objet_sql($table), id_table_objet($table)."=".sql_quote($id));
			if ($t
			AND autoriser('voir', $table, $id)
			AND !isset($results[$table][$id]))
				$results[$table][$id] = array();
		}

	}
	
	echo debut_grand_cadre(true);

	echo formulaire_recherche("recherche");

/*
	// Si on est autorise a modifier, proposer le choix de REMPLACER
	// Il faudra aussi pouvoir indiquer sur quels elements on veut effectuer le remplacement...
	if ($modifier) {
	echo '<br /><input type="text" size="10" value="'.entites_html(_request('remplacer')).'" name="remplacer" class="spip_recherche" />';
	}
*/

	if ($results) {
		echo "<span class='verdana1'><b>"._T('info_resultat_recherche')."</b></span><br />";
		echo "<h1>$recherche_aff</h1>";
		include_spip('inc/afficher_objets');

		foreach($results as $table => $r) {
			switch ($table) {
			case 'article':
				$titre = _T('info_articles_trouves');
				$order = 'date DESC';
				break;
			case 'breve':
				$titre = _T('info_breves_touvees');
				$order = 'date_heure DESC';
				break;
			case 'rubrique':
				$titre = _T('info_rubriques_trouvees');
				$order = 'date DESC';
				break;
			case 'site':
				$titre = _T('info_sites_trouves');
				$order = 'date DESC';
				break;
			case 'auteur':
				$titre = _T('info_auteurs_trouves');
				$order = 'nom';
				break;
			case 'mot':
				$titre = _T('titre_page_mots_tous');
				$order = 'titre';
				break;
			case 'document':
				$titre = _T('titre_documents_joints');
				$order = "id_$table";
				break;
			case 'groupes_mot':
				$titre = _T('titre_groupe_mots');
				$order = 'titre';
				break;
			default:
				$titre = _T("autres");
				$order = "id_$table";
				break;
			}

			echo afficher_objets($table,$titre,
				array(
					// gasp: la requete spip_articles exige AS articles...
					'FROM' => table_objet_sql($table).' AS '.table_objet($table),
					'WHERE' => sql_in(
						table_objet($table).'.'.id_table_objet($table),
						array_keys($r)
					),
					'ORDER BY' => $order
				)
			);
		}

	}
	else
		if (strlen($recherche))
			echo "<p class='verdana1'>"._T('avis_aucun_resultat')."</p>";

	echo fin_grand_cadre(true), fin_page();
}