Костыль для ajaxSearch

16 January 2009

В MODx есть сниппет для поиска — ajaxSearch. Как и все остальные стандартные сниппеты, он очень прост в использовании. Об этом может расскажу когда буду делать поиск по этому сайту, а пока расказываю про изобретенный костыль. Сам не забуду что да как, и другим может пригодиться. Если кто доведет до ума — вэлкам.

Проблема следующая: в результатах поиска сниппет иногда выдает на краях цитат спецсимволы. Очевидно, он режет utf-8 символ, в результате чего вместо нормального символа получается дрянь. В ФФ и Опере это выглядит как вопрос в черном ромбике, а в ИЕ как квадратик. Вот — ?.

Найти функцию обрезания (извините) очень просто, она лежит в файле /assets/snippets/ajaxSearch/includes/ajaxSearch.inc.php и гордо зовется SmartSubstr. Не будем вдаваться в задумку авторов и историю названия.

Итак, я решил проверять первый символ и смещать обрезатель если он приходится на блок utf:

if (ord($text[$halfside-1]) == 208 || ord($text[$halfside-1]) == 209)
$halfside++;

Естественно, после этого надо проверить и последний символ тоже:

if (ord($text[$halfside+$length-1]) == 208 || ord($text[$halfside+$length-1]) == 209)
$length++;

Вставляем все это прямо перед return и наслаждаемся, у меня всё исправилось. Если у вас нет, то можете поиграть «плюсадинами». Или вывести коды, возможно у вас какой-нибудь 207. Я не стал вникать и перебирать варианты.

Для веточки else, когда строка обрезается не с двух сторон а только с конца, также вставляем код:

if (ord($text[$length-1]) == 208 || ord($text[$length-1]) == 209)
$length++;

 

Оговорка: конечно, по идее надо делать более правильно для чего неплохо бы воткнуть в спецификации utf-8, разобраться что за 208 и 209, и что там может быть еще. Увы, мне лень :( Отсюда и название — костыль.