Поле для диапазона чисел в Drupal 7
Постановка задачи:
Рассмотрим задачу на конкретном примере: у меня на сайте организован фасетный поиск с помощью модуля FacetApi. У материала есть поле "Год", поле участвует в фасетном поиске, то есть производится фильтрация материала по значению поля "Год".
Необходимо: представить поле "Год" так, чтобы пользователь, при заполнении материала, мог:
a). указывать одно значение года для материала,
б). или два значения,
в). или диапазон чисел(годов), например 2000-2010, при этом в фасетный поиск должны попадать все промежуточные значения между "2000" и "2010" (2000, 2001, 2002, ..., 2010);
Способы реализации:
1. Первым делом решил поискать модуль, который бы подходил для реализации вышеописанного. Но мои поиски не увенчались успехом, нет такого модуля, который бы предоставлять тип поля "диапазон". Вариант, как оказалось, "не вариант".
2. Далее, думал как то адаптировать модуль Double field, но тогда бы не получилось бы реализовать пункт "а" из постановки задачи (указывать одно значение года для материала). Вариант, как оказалось, "не вариант".
3. Может, не совсем правильное решение, но оказалось жизнеспособным. Решил сделать словарь таксономии "Года", к материалу добавить поле "Ссылка на термин", с множественным значением, а виджет автодополнение. То есть что мы получаем, есть поле в которое можно вводить года через запятую, на основе введенных значений создаются термины таксономии, по которым можно осуществлять фасетный поиск, но как же организовать автоматизированность ввода, если нам нужно, не тупо вводить 15 значений, а указать диапазон. Для этого предлагаю такое решение: подключить к редактированию ноды свой js файл, который будет отслеживать манипуляции с полем, и завершать ввод при необходимости, преобразуя введенные крайние числа диапазона, в сам диапазон.
Реализация
Создадим свой модуль, который будет подключать к форме редактирования ноды наш js файл. Подробно на создании модуля останавливаться не буду. В ModulName.module пишем:
<?php
// *********************************
// hook_form_alter
// *********************************
function ModulName_form_alter(&$form, &$form_sate, $form_id){
// добавляем свою функцию для подключения JS файла в редактировании ноды
if($form_id == "form_id_edit_name"){ // проверяем id формы, чтобы подключать js файл только на нужной форме
$form['#after_build'][] = ' ModulName_build';
}
}
// *********************************
// Функция подключения js файла
// *********************************
function ModulName_build(&$form, &$form_sate){
$path = drupal_get_path('module', "statefield");
drupal_add_js("$path/ModulName.js");
return $form;
}
?>
На данном этапе, мы подключили js файл, который активизируется при редактировании ноды, определенного типа материала.
Создаем сам ModulName.js:
(function ($) { $(function (){ var $fields = $("#id_field"); // сохраняем в переменную поле "год", из формы редактирования ноды $fields.blur(function(){ // как только с поля снят фокус var $value = $fields.val(); // сохраняем в переменную $value введенные значения var $arr = $value.split(","); // создаем массив из введенных значений var $output_array = []; // создаем пустой массив, понадобится позже if ($arr.length == 2) { // проверяем, если массив содержит два элемента, то предполагаем, что это крайние числа нашего диапазона if ($arr[0] > $arr[1]) { // так же проверяем, чтобы первое введенное значение было больше второго var $difference = $arr[0] - $arr[1], // вычисляем разницу между двумя введенными числами $i; for ($i = 0; $i <= $difference; $i++) { // делаем цикл, содержащий количество итераций равных разнице введенных чисел $output_array[$i] = parseInt($arr[1]) + parseInt($i); // и формируем массив из промежуточных значений } } $fields.val($output_array.join(", ")); // после чего подставляем сформированные промежуточные значения в поле, предварительно преобразовав массив в строку с разделителем "," } }); }); }) (jQuery);
Тестируем:
1. Вводим одно значение:
2. Вводим несколько рандомных значений:
3. Вводим диапазон, первым указываем большое число:
убираем фокус с поля, происходит автозамена
проверяем словарь на предмет добавленных значений:
проверяем поле фасетного поиска:
все ок!