Костыль для ajaxSearch
В 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, и что там может быть еще. Увы, мне лень :( Отсюда и название — костыль.
