Доброе время суток. Есть вопрос по CB User List, в частности по фильтру. Проблема в том что он не работает по полю с типом Check Box (Multiple). Другие поля не пробовал, да и не подходят они мне.
Дело было так:
Создаю в CВ Fild Manager новое поле, допустим "Увлечения" с типом Check Box (Multiple);
Задаю несколько десятков значений.
Регистрируюсь на сайте и отмечаю несколько значений.
Создаю новый UserList, в CB List Management.
В поле Filter в первом выпадающем списке выбираю созданное мной выше поле.
Во втором выпадающем списке выбираю Like. Как мне кажется этот параметр указывает на то что выбираться будут те записи поле "Увлечения" которых содержит искомое слово, указанное в третьем поле.
В общем при выборе любого типа фильтрации кроме Great Then список пуст(запись не находится)
При выборе Great Then и наличии нескольких пользователей, выводятся все, у которых отмечено несколько позиций в поле "Увлечения", причем независимо от того что отмечено.
Заглянул в базу данных, там в поле где хранится информация о критериях фильтрации информация записана не словами а двухзначными числами через знак процента что-то вида s(%2%57%57Like%87%45%56). Пытался подправить в базе критерий отбора вручную выбираю LIKE. Сохраняю. Но в листе по прежнему пусто.
Мои параметры Joomla 1.5.17 + CB 1.2.2 Кодировка базы данных UTF 8
--------------------------------------------------Ну ближе к делу.
Как оказалось CB-фильтр не дружит с кирилицей. Искал решение на многих форумах но ничего толкового не нашел. Все попытки исправить данную ситуацию или решить в лоб или обойти не давали результата.
Моя идея может оказаться очередной идеей обойти проблему и я надеюсь удачной, насколько она реализуема решать профессионалам, я в этом ламер.
А теперь сама
ИДЕЯ.
Я подумал раз CB фильтр не понимает кирилицы, ну так и не нада, ему можно подсунуть для фильтрации его любимую латиницу и пусть фильтрует себе на здровье.
Привязываться я буду к Check Box (Multiple), ибо именно фильтр типа LIKE по полю данного типа мне очень нужен.
Так вот идея заключается в том чтобы в промежуток после получения данных из формы типа Check Box (Multiple) заполняемой пользователем и перед занесением их в БД MySQL вставить процедуру транслитерации этих данных в латиницу. Данные будут представлять из себя массив из одного и более слов в кирилице, которые и должны быть транслитированы.
Код функции транслитерации, найденый мной в просторах гугла:
function UpLow(&$string,$registr='up'){
$upper = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ';
$lower = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz';
if($registr == 'up') $string = strtr($string,$lower,$upper);
else $string = strtr($string,$upper,$lower);
} //function UpLow(&$string,$registr='up') может и не пригодится, но на всякий случай выложил.
function rus2lat($s) { // Функция обратимой перекодировки кириллицы в транслит.
// Сначала всё переводим в верхний регистр, причём не с помощью глючной strtoupper
UpLow($s);
//а потом только кириллицу в нижний
$s=str_replace('ЫА','yha',$s);
$s=str_replace('ЫО','yho',$s);
$s=str_replace('ЫУ','yhu',$s);
$s=str_replace('Ё','yo',$s);
$s=str_replace('Ж','zh',$s);
$rus = 'АБВГДЕЗИЙКЛМНОПРСТУФХЦ';
$lat = 'abvgdezijklmnoprstufxc';
$s = strtr($s, $rus, $lat);
$s=str_replace('Ч','ch',$s);
$s=str_replace('Ш','sh',$s);
$s=str_replace('Щ','shh',$s);
$s=str_replace('Ъ','qh',$s);
$s=str_replace('Ы','y',$s);
$s=str_replace('Ь','q',$s);
$s=str_replace('Э','eh',$s);
$s=str_replace('Ю','yu',$s);
$s=str_replace('Я','ya',$s);
$s=str_replace(' ','_',$s); // сохраняем пробел от перехода в %20
$s=str_replace(',','.h',$s); // сохраняем запятую
$s=str_replace('"','"',$s); // сохраняем кавычки
$s=rawurlencode($s); // Разрешённые символы URL - латинские буквы, точка, минус и подчёркивание
return $s;
} // function rus2lat($s)
Что мы результате получаем. В базе данных теперь у нас латиница, и по ней можно фильтровать наши поля в CB USER List. Чтобы латиница была только в нужном нам столбце можно организовать проверку по имени поля, а в админке добавить возможность выбора в виде чекбокса адаптировать или нет данное поле для фильтра. Так же нужно чтобы в админке была возможность посмотреть вариант данных в латинице(будет нужно для того чтобы создавать фильтры, хотя с другой стороны можно будет в MySQL глянуть).
Но если данные будут транслитированы то и отображаться в профиле они будут тоже латиницей. Для того чтобы такого не происходило перед выводом этих данных, их нужно будет транслитировать обратно. Код обратной транслитерации приведен ниже:
function lat2rus($s) { // Функция обратной перекодировки транслита в кириллицу
$s=rawurldecode($s);
$s=str_replace('.h',',',$s);// возвращаем запятую
$s=str_replace('_',' ',$s);// возвращаем пробел
$s=str_replace('yh','Ы',$s);
$s=str_replace('yu','Ю',$s);
$s=str_replace('ya','Я',$s);
$s=str_replace('yo','Ё',$s);
$s=str_replace('shh','Щ',$s);
$s=str_replace('eh','Э',$s);
$s=str_replace('sh','Ш',$s);
$s=str_replace('ch','Ч',$s);
$s=str_replace('qh','Ъ',$s);
$s=str_replace('zh','Ж',$s);
$lat = 'abvgdezijklmnoprstufxcyq';
$rus = 'АБВГДЕЗИЙКЛМНОПРСТУФХЦЫЬ';
$s = strtr($s, $lat, $rus);
return $s;
} // function lat2rus($s)
Прямая и обратная транслитерации полностью обратимы на 100% - проверено!
Вот и все.
Только вот осуществить идею мне пока не по силам, не достаточно знаний (((