вторник, 24 мая 2011 г.

Извращенское решение поиска по неиндексирующемуся контенту. Например штрих-кодам.

Оставляю этот пост лишь для того, чтобы потом поржать. Как нужно делать читайте в самом конце. Так как здесь написано, делать нельзя, ибо это изврат.

Чтобы делать на сайте красивые картинки штрих-кодов использовал модуль Barcode. Он создает CCK поле, в которое пользователь вводит цифры, а на выходе модуль генерирует соответствующую картинку.
Очевидно, что штрих-код вводится не просто так, а чтобы потом сделать по нему поиск товара. И вот тут нас подстерегает кака - несмотря на то, что это CCK - оно не индексируется. Т.е. поиск по нему не сделать. Epic Fail!

И как я только с ним не трахался!

Решение пришло неожиданно.

Создаем новое CCK поле и делаем его скрытым в форме создания продукта. В это поле будет копироваться значение штрих-кода.

При создании продукта, с помощью модуля Rules назначаем нашему созданному полю значение поля штрих-код. Все.

Обязательно (!) выводить наше созданное поле в ноде, а то искать не будет. Все.

Выглядит это так.

Rules -> Node: Content is going to be saved
Do
Populate saved content's field 'field_barcodetext'

PHP код для вставки:


$a = ($node->field_barcode[0]['barcode']);
return array(
  0 => array('value' =>$a, 'view' => $a),
);

Как вы поняли, field_barcode это поле CCK модуля Barcode. В переменной barcode лежит текстовое значение штрих-кода.

field_barcodetext это созданное нами CCK поле для вывода.

Таким образом можно сделать поиск по любому контенту, который не индексируется стандартным модулем Search.

А теперь как нужно делать!
Модуль Search глючит на больших числах. И даже, если контент индексируется в принципе, если это будет число из 13 и более цифр, то он его не найдет. Как оказалось, Barcode индексируется.
Для того, чтобы все получилось необходимо хакнуть модуль Search.

в файле search.module можно заменить два раза вызов
$num = is_numeric($word);
на
$num = is_int($word);
т.к. далее к коде идет преобразование к int: $word = (int)ltrim($word, '-0'); поэтому все значения больше PHP_INT_MAX преобразовываются в этот самый PHP_INT_MAX.

Вот и все.

2 комментария:

  1. Поправочка. Модуль Search воспринимает все числа, которые ввели в строку поиска, как числа. Т.о. максимальная длина штрих-кода может быть только 10 символов, а не 13 как надо. Упираемся в PHP_INT_MAX думаем что делать дальше ;-)

    ОтветитьУдалить
  2. Обновил пост. Читайте как это действительно нужно делать.

    ОтветитьУдалить