好的,我找到了问题的原因。
在搜索视图中,要搜索的字符串被清理为:
$q = Sanitize::clean($this->request->params['named']['q']);
'encode' => true
当设置(默认)时,默认情况下在字符串上运行 html_entities 。这将变成例如ö
然后ö
搜索带有 html-entities 的单词。
我通过以下方式得到了解决方法:
$q = $this->request->params['named']['q'];
// Use encode=false on Sanitize::clean to prevent äüöß etc. getting
// replaced by html entities. And strip tags manually first to prevent
// html injected strings.
$q = strip_tags($q);
$q = Sanitize::clean($q, array('encode' => false));
注意:如果像我的情况一样,设置 TinyMCE,'entity_encoding' => 'raw'
则节点表中的 body 字段也将包含 äöü 而不是 htmlentities,IMO 是用 htmlentities 替换它们的更好做法。虽然默认情况下,tinymce 用 htmlentities 替换字符,因此 body 字段将与 Croogo/Cakephp 的默认搜索行为一起使用。但是,例如,在标题字段中搜索不会。
更新
好的,正如标记评论所建议的,消毒和使用蛋糕的分页方法是不必要的,因此可以跳过消毒部分。我还发现使用 htmlspecialchars 作为strip_tags 更好,因为strip_tags 不会处理例如'&',而在body 上,tinyMCE 将它们保存为html_entities。所以更新后的代码如下所示:
$q = htmlspecialchars($this->request->params['named']['q']);
// go on with searching for nodes on paginate-method