Dépôt officiel du core SPIP * Copie possible par svn sur svn://trac.rezo.net/spip * Les svn:externals sont présent dans https://git.spip.net/SPIP/[nom du plugin dist]
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
4.8 KiB

<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2019 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
/**
* Gestion de la recherche ajax du mini navigateur de rubriques
*
* Cette possibilité de recherche apparaît s'il y a beaucoup de rubriques dans le site.
*
* @package SPIP\Core\Rechercher
**/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
Pour eviter aux scripts Ajax de charger systématiquement les 130Ko totalisés par inc/minipres.php inc/texte.php inc/filtres.php et inc/charsets.php (et pour faciliter la lecture de ecrire/index.php aux nouveaux venus), cette suite d'inclusions ne sera bientot plus opérées par ecrire/index;php. Cette opération devait transparente pour le noyau, mais pourra etre perceptible pour les extensions de SPIP définissant ou complétant l'espace privé, notamment en créant des fichiers dans un répertoire exec/. Pour se préparer à ce changement, ces extensions ont deux possibilités: - la plus simple: rajouter dans leurs fichiers le {{{include_spip('inc/minipres/')}}} qui sera bientot retiré de ecrire/index.php - la plus pertinente: tester chacun de ces fichiers pour regarder s'ils ont besoin ou non de ces 130Ko. Pour ce faire on peut utiliser le shell-script suivant, où la variable {{{session}}} doit etre affectée à une session valide sur votre machine: #!/bin/sh session="require('../tmp/sessions/521_0a154a3fdb1dfa9443d8cec28e7c5743.php');" for i in ??*.php do z=../_$i.php sed "s,<\?php,<\?php require 'inc_version.php';spip_connect();include_spip('inc/sessions');$session," $i > $z f=$(basename $i .php) echo "<?php exec_${f}_dist(); ?>" >> $z echo ">>>>>>>>>>>>>$i" php -q $z |grep Fatal rm $z done Il faut aussi executer ce script avec {{{session=''}}} pour bien faire. Les messages de fonctions indéfinies qui pourraient arriver pendant ces exécutions signalent qu'une au moins des 4 inclusions éliminées est indispensable au script considéré, il faut alors l'ajouter à l'endroit approprié. Le présent dépot ajoute les inclusions repérées par ce shell-script. Elle sont donc superflues jusqu'au remplacement de inc/minipres par inc/lang dans index.php.
16 years ago
include_spip('inc/actions');
include_spip('inc/texte');
Pour eviter aux scripts Ajax de charger systématiquement les 130Ko totalisés par inc/minipres.php inc/texte.php inc/filtres.php et inc/charsets.php (et pour faciliter la lecture de ecrire/index.php aux nouveaux venus), cette suite d'inclusions ne sera bientot plus opérées par ecrire/index;php. Cette opération devait transparente pour le noyau, mais pourra etre perceptible pour les extensions de SPIP définissant ou complétant l'espace privé, notamment en créant des fichiers dans un répertoire exec/. Pour se préparer à ce changement, ces extensions ont deux possibilités: - la plus simple: rajouter dans leurs fichiers le {{{include_spip('inc/minipres/')}}} qui sera bientot retiré de ecrire/index.php - la plus pertinente: tester chacun de ces fichiers pour regarder s'ils ont besoin ou non de ces 130Ko. Pour ce faire on peut utiliser le shell-script suivant, où la variable {{{session}}} doit etre affectée à une session valide sur votre machine: #!/bin/sh session="require('../tmp/sessions/521_0a154a3fdb1dfa9443d8cec28e7c5743.php');" for i in ??*.php do z=../_$i.php sed "s,<\?php,<\?php require 'inc_version.php';spip_connect();include_spip('inc/sessions');$session," $i > $z f=$(basename $i .php) echo "<?php exec_${f}_dist(); ?>" >> $z echo ">>>>>>>>>>>>>$i" php -q $z |grep Fatal rm $z done Il faut aussi executer ce script avec {{{session=''}}} pour bien faire. Les messages de fonctions indéfinies qui pourraient arriver pendant ces exécutions signalent qu'une au moins des 4 inclusions éliminées est indispensable au script considéré, il faut alors l'ajouter à l'endroit approprié. Le présent dépot ajoute les inclusions repérées par ce shell-script. Elle sont donc superflues jusqu'au remplacement de inc/minipres par inc/lang dans index.php.
16 years ago
/**
* Prépare la fonction de recherche ajax du mini navigateur de rubriques
*
* @uses exec_rechercher_args() Formate le rendu de la recherche.
9 years ago
* @uses ajax_retour()
**/
function exec_rechercher_dist() {
$id = intval(_request('id'));
$exclus = intval(_request('exclus'));
$rac = spip_htmlentities(_request('rac'));
$type = _request('type');
$do = _request('do');
if (preg_match('/^\w*$/', $do)) {
$r = exec_rechercher_args($id, $type, $exclus, $rac, $do);
} else {
$r = '';
}
ajax_retour($r);
}
/**
* Formate le rendu de la recherche ajax du mini navigateur de rubriques
*
* @see calcul_branche_in()
* @see proposer_item()
*
* @param int $id
* @param string $type
* @param string|int|array $exclus
* @param string|bool $rac
* @param string $do
* @return string
**/
function exec_rechercher_args($id, $type, $exclus, $rac, $do) {
if (!$do) {
$do = 'aff';
}
$points = $rub = array();
$where = preg_split(",\s+,", $type);
if ($where) {
foreach ($where as $k => $v) {
$where[$k] = "'%" . substr(str_replace("%", "\%", sql_quote($v, '', 'string')), 1, -1) . "%'";
}
$where_titre = ("(titre LIKE " . join(" AND titre LIKE ", $where) . ")");
$where_desc = ("(descriptif LIKE " . join(" AND descriptif LIKE ", $where) . ")");
$where_id = ("(id_rubrique = " . intval($type) . ")");
if ($exclus) {
include_spip('inc/rubriques');
$where_exclus = " AND " . sql_in('id_rubrique', calcul_branche_in($exclus), 'NOT');
} else {
$where_exclus = '';
}
foreach (array(
3 => $where_titre,
2 => $where_desc,
1 => $where_id,
) as $point => $recherche) {
$res = sql_select("id_rubrique, id_parent, titre", "spip_rubriques", "$recherche$where_exclus");
while ($row = sql_fetch($res)) {
$id_rubrique = $row["id_rubrique"];
if (!isset($rub[$id_rubrique])) {
$rub[$id_rubrique] = array();
}
$rub[$id_rubrique]["titre"] = typo($row["titre"]);
$rub[$id_rubrique]["id_parent"] = $row["id_parent"];
if (!isset($points[$id_rubrique])) {
$points[$id_rubrique] = 0;
}
$points[$id_rubrique] = $points[$id_rubrique] + $point;
}
}
}
if ($points) {
arsort($points);
$style = " style='background-image: url(" . chemin_image('secteur-12.png') . ")'";
foreach ($rub as $k => $v) {
$rub[$k]['atts'] = ($v["id_parent"] ? $style : '')
. " class='petite-rubrique'";
}
}
return (proposer_item($points, $rub, $rac, $type, $do));
}
/**
* Résultat de la recherche intéractive demandée par la fonction JS
* `onkey_rechercher`
*
* @note
* `onkey_rechercher()` testera s'il comporte une seule balise au premier niveau
* car cela qui indique qu'un seul résultat a été trouvé.
*
* Attention donc à composer le message d'erreur avec au moins 2 balises.
*
* @param array $ids
* @param array|string $titles
* @param string|bool $rac
* @param string $type
* @param string $do
* @return string
**/
function proposer_item($ids, $titles, $rac, $type, $do) {
if (!$ids) {
return "<br /><br /><div style='padding: 5px; color: red;'><b>"
. spip_htmlentities($type)
. "</b> : " . _T('avis_aucun_resultat') . "</div>";
}
$ret = '';
$info = generer_url_ecrire('informer', "type=rubrique&rac=$rac&id=");
$onClick = "aff_selection(this.firstChild.title,'$rac" . "_selection','$info', event)";
$ondbClick = "$do(this.firstChild.firstChild.nodeValue,this.firstChild.title,'selection_rubrique', 'id_parent');";
foreach ($ids as $id => $bof) {
$titre = strtr(str_replace("'", "&#8217;", str_replace('"', "&#34;", textebrut($titles[$id]["titre"]))), "\n\r",
" ");
$ret .= "<div class='highlight off'\nonclick=\"changerhighlight(this); "
. $onClick
. "\"\nondblclick=\""
. $ondbClick
. $onClick
. " \"><div"
. $titles[$id]["atts"]
. " title='$id'>&nbsp; "
. $titre
. "</div></div>";
}
return $ret;
}