我注意到在搜索带有一些非ascii字符的单词时,Croogo的NodesController :: search()中存在一个错误,例如: “UAO”。如果我搜索'Steuergeräte'(德语)的例子,我得不到任何结果,即使我应该。如果我搜索'Steuergerate'(用德语拼写错误),我会得到想要的结果。这完全是奇怪的。
对db我的直接查询工作正常:
“SELECT * FROM i18n WHERE content LIKE'%Steuergeräte%';”
返回预期记录。
但是这不是unicode-chars的一般问题,例如,搜索日语单词按预期工作。所以这只会影响一些字符。
Cakephp:2.4.0,Croogo:1.4.5
答案 0 :(得分:0)
好的,我找到了问题的原因。
在搜索视图中,使用以下内容清除要搜索的字符串:
$q = Sanitize::clean($this->request->params['named']['q']);
当设置'encode' => true
时,默认情况下,默认情况下,字符串中的html_entities会运行html_entities。这会变成例如ö
进入ö
,然后在其上搜索带有html实体的字词。
我做了一个解决方法:
$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'
那么节点表中的正文字段也会包含äöü而不是htmlentities,IMO要好得多练习用htmlentities取代它们。但默认情况下,tinymce用htmlentities替换chars,因此body字段可以使用Croogo / Cakephp的默认搜索行为。但是,例如,在标题字段中搜索不会。
<强>更新强>
好的,正如标记评论建议的那样,不需要消毒和使用cake的paginate方法,因此可以跳过Sanitize部分。我还发现使用htmlspecialchars甚至更好地作为strip_tags,因为strip_tags不会照顾例如'&amp;',在身体上,tinyMCE将这些保存为html_entities。所以更新后的代码如下所示:
$q = htmlspecialchars($this->request->params['named']['q']);
// go on with searching for nodes on paginate-method