J’ai essayé de faire apparaître la pagetitle des parents avec le snippet Getfield, mais AS qui accepte bien &docid=’58’(par exemple) ne renvoie rien avec &docid=’[+parent+]’.
Est-ce une limitation ?
Existe-t-il une solution ?
Je pense que cela vient du fait que la fonction par defaut, defaultStripOutput, de AjaxSearch filtre les tags MODx en sortie, donc l’appel [+parent+]. Voici la doc (voir la classe search.class.php - en fin de fichier) :
---- &stripOutput user function (optional)
to transform on fly the result output
by default: defaultStripOutput
StripOutput user function should be define in the config file as follow :
// string functionName(string $text)
// functionName : name of stripOutput function passed as &stripOutput parameter
// $text : string php variable name as results
// return the filtered results
/*
function myStripOutput($text){
Any Php code which filter the results
The following internal functions could be called:
$text = stripTags($text); // strip all the MODx tags
$text = stripJscript($text); // strip jscript
$text = stripLineBreaking($text); // replace line breaking tags with whitespace
$text = stripHtml($text); // strip all the html tags
You could also developp you own filter based on regular expressions.
See http://fr.php.net/manual/en/intro.pcre.php
return $text;
}
*/
By default : defaultStripOutput function will be used if &stripOutput parameter
is not set or if the function is not defined :
function defaultStripOutput($text){
// replace line breaking tags with whitespace
$text = stripLineBreaking($text);
// strip modx sensitive tags
$text = stripTags($text);
// strip Jscript
$text = stripJscripts($text);
// strip html tags. Tags should be correctly ended
$text = stripHTML($text);
return $text;
}
la fonction stripTags prend donc un malin plaisir a supprimer tout ce que vous avez pu écrire d’intelligent avec MODx ...
/**
* stripTags : Remove modx sensitive tags
*/
function stripTags($text){
// Regular expressions of things to remove from search string
$modRegExArray[] = ’~\[\[(.*?)\]\]~’; // [[snippets]]
$modRegExArray[] = ’~\[!(.*?)!\]~’; // [!noCacheSnippets!]
$modRegExArray[] = ’!\[\~(.*?)\~\]!is’; // [~links~]
$modRegExArray[] = ’~\[\((.*?)\)\]~’; // [(settings)]
$modRegExArray[] = ’~{{(.*?)}}~’; // {{chunks}}
$modRegExArray[] = ’~\[\*(.*?)\*\]~’; // [*attributes*]
$modRegExArray[] = ’~\[\+(.*?)\+\]~’; // [+phx+]
// Remove modx sensitive tags
foreach ($modRegExArray as $mReg)$text = preg_replace($mReg,’’,$text);
return $text;
}
Comme les résultats AjaxSearch sont traités avant que le parser ne traite le document, il est fort probable que je filtre l’appel Getfield avant.
Pour le tester c’est simple tu définis dans un fichier de config "maConfig", une fonction "filtreAffichage" sans l’appel à la fonction stripTags, par exemple:
function filtreAffichage($text){
$text = stripJscript($text); // strip jscript
$text = stripLineBreaking($text); // replace line breaking tags with whitespace
$text = stripHtml($text); // strip all the html tags
return $text;
}
et tu ajoutes dans ton appel AjaxSearch &config=`maConfig` &stripOutput=`filtreAffichage`
Tu peux aussi redefinir une fonction stripTags et l’ajouter dans ton fichier de config, simplement en commentant la ligne qui traite [+phx+].
/**
* myStripTags : Remove modx sensitive tags (Except Phx)
*/
function myStripTags($text){
// Regular expressions of things to remove from search string
$modRegExArray[] = '~\[\[(.*?)\]\]~'; // [[snippets]]
$modRegExArray[] = '~\[!(.*?)!\]~'; // [!noCacheSnippets!]
$modRegExArray[] = '!\[\~(.*?)\~\]!is'; // [~links~]
$modRegExArray[] = '~\[\((.*?)\)\]~'; // [(settings)]
$modRegExArray[] = '~{{(.*?)}}~'; // {{chunks}}
$modRegExArray[] = '~\[\*(.*?)\*\]~'; // [*attributes*]
//$modRegExArray[] = '~\[\+(.*?)\+\]~'; // [+phx+] // ligne mis en commentaire
// Remove modx sensitive tags
foreach ($modRegExArray as $mReg)$text = preg_replace($mReg,'',$text);
return $text;
}
Je travaille à la version 1.9 et je me demande maintenant si par défaut la logique voudrais pas que la fonction par défaut laisse tout passer et que ce soit l’utilisateur qui décide ce qui doit être filtré. Autant pour l’input, par sécurité il est logique de tout filtrer autant en sortie, cela ne me semble pas justifié.
Par contre, lors de la recherche d’un terme, l’extrait de texte autour du mot est par défaut de 200 caractères et on ne tient pas compte du fait que potentiellement une instruction html, javascript ou MODx (appel snippet, Phx, link ...) peut être coupé. Il faudrait donc que j’améliore le pgm d’extraction de façon à ne pas potentiellement coupé une instruction ...
Je n’ai pas beaucoup de temps pour regarder cela en ce moment, mais je suis preneur des résultats et avis sur le sujet.