'source', 'N'=>'nb', 'V'=>'mem_size', 'I'=>'num_hits'];
$index = ($indexes[$tri] ?? $indexes['N']);
usort (
$liste_squelettes,
function ($s1, $s2) use ($index, $asc_or_desc) {
return ($asc_or_desc=='A') ? ($s1[$index] <=> $s2[$index]) : ($s2[$index] <=> $s1[$index]);
}
);
return $liste_squelettes;
}
/**
* @param string $type_liste
* affiche l'entête du tableau des résultats du scanner
*/
function xray_scanner_head (string $type_liste) {
echo '
';
if ($type_liste == 'squelettes') {
echo '', sortheader ('Q', 'Squelette') . ' |
Compilé |
', sortheader ('N', 'Nb Caches') . ' |
', sortheader ('I', 'Hits') . ' |
', sortheader ('V', 'Taille') . ' | ';
} else {
echo 'Caches - ', sortheader ('S', 'tri par Squelette') . ' | ',
'', sortheader ('H', 'Hits'), ' | ',
'', sortheader ('Z', 'Size'), ' | ',
'', sortheader ('C', 'Created at'), ' | ',
'', sortheader ('T', 'Timeout'), ' | ',
'Del |
';
}
}
/**
* @param string $search expression recherchée
* @param string $where lieu de recherche
* @return string expression recherchée préparée pour la recherche
*/
function xray_prepare_search (string $search, string $where) : string {
if (!$search) {
return '';
}
// Don't use preg_quote because we want the user to be able to specify a
// regular expression subpattern.
// FIXME : certaines regexp ne sont pas comprises. Depuis la syntaxe simlifiée ?
// Detection of a potential preg error :
if (@preg_match ('~' . antislash ($search) . '~i', null) === false) {
echo 'Error: search expression is not a valid regexp (it needs escaping parentheses etc)
';
$search = preg_quote ($search, '/');
echo "
Warning : search expression has been preg_quoted :
$search
";
}
// Syntaxe simplifiée pour la recherche dans les contextes
// "id_truc=val" est compris comme le "[id_truc] = val" des fournitures de print_r
if (
$where == 'CONTEXTE'
and !preg_match ("/^\[.*\]/", $search)
) {
$search = preg_replace (
"/^(.*)\s*=\s*(.*)$/",
"\\[$1\\]\\s*=>\\s*$2",
$search
);
}
else {
if (substr($search, 0, 1) != '^') {
$search = '^.*'.$search;
}
if (substr($search, -1, 1) != '$') {
$search .= '.*$';
}
}
return '~' . $search . '~i';
}
/**
* Affiche les options de recherche, filtrage et affichage du scanner
*/
function xray_menu_scanner () {
global $MYREQUEST, $MY_SELF;
echo '
';
if (in_array ($MYREQUEST['TYPECACHE'], array('PAGES', 'INCLUSIONS'))
and !function_exists ('xray_reconnaitre_si_cache_est_page')
) {
echo 'Pour reconnaître si un cache correspond à une page ou à une inclusion, il faut définir une fonction xray_reconnaitre_si_cache_est_page($nomcache, $data) dans le fichier de _fonctions.php de votre plugin, avec un code adapté aux types d’urls de votre site.
À défaut, la sélection présentée ici est certainement erronée.';
}
}
/**
* @param string $typecache type de cache affiché
* @param string &$pattern_typecache regexp implémentant le filtrage des typecaches
* @param string &$also_required fonction à appeler en plus
* @param bool &$also_required_bool valeur requise pour le retour de $also_required
*
* Cette fonction prépare les paramètres permettant ensuite le filtrage
*/
function xray_prepare_filtrage (string $typecache ,string &$pattern_typecache, string &$also_required, bool &$also_required_bool) {
switch ($typecache) {
case 'ALL':
$pattern_typecache = '';
break;
case 'NON_SESSIONS':
$pattern_typecache = XRAY_PATTERN_NON_SESSION;
$also_required = 'cache_est_talon';
$also_required_bool = false;
break;
case 'SESSIONS':
$pattern_typecache = XRAY_PATTERN_SESSION;
break;
case 'SESSIONS_AUTH':
$pattern_typecache = XRAY_PATTERN_SESSION_AUTH;
break;
case 'SESSIONS_NONAUTH':
$pattern_typecache = XRAY_PATTERN_SESSION_ANON;
break;
case 'SESSIONS_TALON':
$pattern_typecache = XRAY_PATTERN_NON_SESSION;
$also_required = 'cache_est_talon';
break;
case 'FORMULAIRES':
$pattern_typecache = '~formulaires/~i';
break;
case 'DYNAMIQUES' :
$also_required = 'cache_est_dynamique';
break;
case 'STATIQUES' :
$also_required = 'cache_est_statique';
break;
case 'PAGES' :
$also_required = 'cache_est_page';
break;
case 'INCLUSIONS' :
$also_required = 'cache_est_page';
$also_required_bool = false;
break;
}
}
/**
* @param array|string $searched cache complet, dont on ne cherche qu'une partie, selon $where
* @param string &$search chaine cherchée, modifiée dans le cas "INCLUSIONS"
* @param string $where endroit où l'on cherche
* @return string partie du cache qu est cherchée
*/
function xray_get_searched_part ($searched, string &$search, string $where) {
if ($search and ($search != '~~i') and $where) {
switch ($where) {
case 'ALL' :
return $searched;
case 'HTML' :
if (is_array ($searched)) {
return $searched['texte'] ?? '';
}
break;
case 'CONTEXTE' :
if (is_array ($searched)) {// !textwheel
return $searched['contexte'] ?? '';
}
break;
case 'FICHIER_SOURCE' :
if (is_array ($searched)) { // !textwheel
return $searched['source'] ?? '';
}
break;
case 'FICHIER_SKEL' :
if (is_array ($searched)) { // !textwheel
return $searched['squelette'] ?? '';
}
break;
case 'META' :
if (is_array ($searched)) { // !textwheel
unset($searched['texte']);
return $searched;
}
break;
case 'INCLUSIONS' :
if (is_array($searched)){
$search = '~recuperer_fond[^,]*' . ltrim($search,'~');
return $searched['texte'] ?? '';
}
break;
default :
die("Mauvaise valeur pour where : '$where'");
}
}
return '';
}
/**
* @param $data le cache
* @param string $type_extra le type d'extra demandé
* @return string le texte de l'extra à afficher
*/
function prepare_extra($data, string $type_extra) : string {
$extra = null;
$jolif='xray_joli_cache';
if (is_array($data)) {
switch ($type_extra) {
case 'CONTEXTE':
$jolif='joli_contexte';
$extra = $data['contexte'] ?? '(non défini)';
break;
case 'CONTEXTES_SPECIAUX':
if (isset($data['contexte'])) {
$jolif='joli_contexte';
$extra = $data['contexte'];
foreach (array(
'lang',
'date',
'date_default',
'date_redac',
'date_redac_default'
) as $ki)
unset($extra[$ki]);
} else
$extra = '(non défini)';
break;
case 'HTML_COURT' :
if (isset($data['texte'])) {
$extra = ajuste_longueur_html ($data['texte']);
}
else {
$extra = '(non défini)';
}
break;
case 'SQUELETTE' :
$extra = $data['source'] ?? '(aucune source spécifiée)';
break;
case 'INFO_AUTEUR':
$jolif='joli_contexte';
if (isset($data['contexte'])) {
foreach (array(
'id_auteur',
'email',
'nom',
'statut',
'login'
) as $ki) {
if (isset($data['contexte'][$ki])) {
$extra[$ki] = $data['contexte'][$ki];
}
}
}
break;
case 'INFO_OBJET_SPECIAL':
$jolif='joli_contexte';
if (isset($data['contexte'])) {
$ki = 'id_'.XRAY_OBJET_SPECIAL;
if (isset($data['contexte'][$ki])) {
$extra[$ki] = $data['contexte'][$ki];
}
}
break;
case 'INVALIDEURS':
if (isset ($data['invalideurs'])) {
$extra = $data['invalideurs'];
}
break;
case 'INVALIDEURS_SPECIAUX':
if (isset ($data['invalideurs'])) {
$extra = $data['invalideurs'];
foreach (array(
'cache',
'session'
) as $ki) {
unset($extra[$ki]);
}
}
break;
case 'INCLUSIONS' :
if (!isset ($data['texte'])) {
$extra = '(html non défini)';
}
elseif (preg_match_all("/<\?php\s+echo\s+recuperer_fond\s*\(\s*'([a-z0-9_\-\.\/]+)'/", $data['texte'], $matches)) {
$extra = $matches[1];
}
else {
$extra = '(aucune )';
}
break;
case 'MACROSESSIONS' :
if (!isset ($data['texte'])) {
$extra = '(html non défini)';
}
elseif (preg_match_all("/\bpipelined_session_get\s*\((['\"a-z0-9\s_\-\.\/,]+)\)/", $data['texte'], $matches)) {
$extra = $matches[1];
}
else {
$extra = '(aucune balise #_SESSION ou #_SESSION_SI)';
}
break;
case 'MACROAUTORISER' :
if (!isset ($data['texte'])) {
$extra = '(html non défini)';
}
elseif (preg_match_all("/if\s+\(autoriser\s*\((.+)\)\s*\)\s*{\s*\?>/", $data['texte'], $matches)) {
$extra = $matches[1];
}
else {
$extra = '(aucune balise #_AUTORISER_SI)';
}
break;
}
}
if ($extra) {
return $jolif($extra);
}
return '(rien)';
}