Перейти к содержимому


Сложные фильтры на базе Javascript


Сообщений в теме: 2

#1 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 356 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 02 Май 2011 - 19:45

Сложные фильтры созданы соединением запросов предопределенных фильтров (простановкой галочек напротив необходимого фильтра).
Прикрепленный файл  filters.jpg   56,31К   33 Количество загрузок:
Код проверен на версии 1.9.3. Принцип формирования следующий: если выбрать фильтры, отбирающие записи по одному полю (тип->"Клиенты", тип->"Партнеры" и т.д.), запросы объединяются посредством OR - будут отобранны и Клиенты и Партнеры. Если выделенные фильтры отбирают записи по разным полям (тип->"Клиенты", статус->"Новый") - используется AND - результатом будут только Новые Клиенты.
Для работы скрипта необходимо добавить пустой фильтр с именем "un". Фильтр лучше скрыть во вкладке Доступ. В любое поле, отображаемое в таблице (фильтры будут отображаться только при выводе таблицы, содержащее это поле) добавить следующий php-код:
global $smarty;
$mysrc = '
function pageloaded(){
//код из процедуры pageloaded;
  window.onresize=on_window_resize;
  on_window_resize();
  on_table_load_fixing();
  // сбрасываем снова скролл
  window.onscroll=onMyScroll;
  onMyScroll();
  page_loaded=1;

// Изменение отображения фильтров при загрузке страницы
var filter_innerHTML=document.getElementById("filters").innerHTML;
//Добавляем форму
filter_innerHTML="<form id=\"filter_form\" action=\"/cb_modules/filter.php\" method=\"post\">" + filter_innerHTML + "<input type=\"submit\" name=\"btnFilter\" value=\"Применить фильтр\"></form>";
// Добавляем поля checkbox
var reg=/(<a.+filter=([0-9]+).+<\/a>)/img;
var filter_newHTML=filter_innerHTML.replace(reg,
"<table cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid gray;\"><tr><td>$1</td><td><input name=\"filter$2\" type=\"checkbox\" value=\"$2\"></td></tr></table>");
// Выделяем активное поле checkbox галочкой
//reg=/(<strong.*)(<input)/i;
//filter_newHTML=filter_newHTML.replace(reg,"$1 $2 checked");
//Скрываем фильтр "un"
reg=/(<table.+un.+<\/table>)/img;
filter_newHTML=filter_newHTML.replace(reg, "");
document.getElementById("filters").innerHTML=filter_newHTML;
}';
$smarty->assign('ADDITIONAL_JAVASCRIPT' , $mysrc);

В корневой папке сайта создать папку "cb_modules" и положить в нее следующий файл
Прикрепленный файл  filter.php   3,64К   9 Количество загрузок:
Недостатки:
1. комбинируются только предопределенные фильтры;
2. строка запроса записывается в фильтр un, который является общим для всех пользователей, т.е. при обновлении страницы в браузере, например через F5, пользователь может увидеть не те данные, которые он запрашивал, если фильтром воспользовался другой пользователь;
3. наблюдается некоторая заторможенность страницы
4. сложные фильтры будут выведены только на странице с таблицей, которая содержит вычисляемое поле с кодом, прописанном выше.
5. сложные фильтры не отображаются, если результат не содержит записей (поскольку вычисляемое поле не выводится - код не отрабатывает)

Творческая группа "ТАВР".

www.TAVR.pro Художественная ковка, металлоконструкции.

www.СтолМет.рф Складные столы, стулья и системы для их хранения


#2 ajmal

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 27 Декабрь 2011 - 22:52

Спасибо большое.. то что я искал, мне нужно было многоуровневый фильтр. Но есть вопрос... заранее сорри за тупой вопрос.

1.

Просмотр сообщенияandibrag (02 Май 2011 - 19:45) писал:

Для работы скрипта необходимо добавить пустой фильтр с именем "un". В любое поле, отображаемое в таблице (фильтры будут отображаться только при выводе таблицы, содержащее это поле) добавить следующий php-код:
Вы могли бы дать более детальный расклад, желательно со скриншотами, просто не совсем понятно что, где надо создавать и куда этот код вставлять.
2. Также вопрос, каким образом можно ввести второй уровень фильтров?
Заранее спасибо!

Сообщение отредактировал ajmal: 27 Декабрь 2011 - 23:15


#3 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 356 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 29 Декабрь 2011 - 01:02

Просмотр сообщенияajmal (27 Декабрь 2011 - 22:52) писал:

где надо создавать и куда этот код вставлять
Фильтр Вы добавляете в таблице в режиме настройки.
Код прописываете в вычислениях таблицы, для версии 1.9.5 указать срабатывание при отражении поля, которое является видимым во всех режимах: табличном, просмотре записи и редактировании.
В этом случае сложные фильтры будут всегда видны.
Код сейчас несколько изменен:
global $smarty;
$mysrc = '
function filter_change()
{
// Изменение отображения фильтров при загрузке страницы
var filter_innerHTML=document.getElementById("filters").innerHTML;
//Добавляем форму
filter_innerHTML="<form id=\"filter_form\" action=\"/cb_modules/filter.php\" method=\"post\">" + filter_innerHTML + "<input type=\"submit\" name=\"btnFilter\" value=\"Применить фильтр\"></form>";
// Добавляем поля checkbox
var reg=/(<a.+filter=([0-9]+).+<\/a>)/img;
var filter_newHTML=filter_innerHTML.replace(reg,
"<table cellpadding=\"0\" cellspacing=\"0\" style=\"border:1px solid gray;\"><tr><td>$1</td><td><input name=\"filter$2\" type=\"checkbox\" value=\"$2\"></td></tr></table>");
// Выделяем активное поле checkbox галочкой
//reg=/(<strong.*)(<input)/i;
//filter_newHTML=filter_newHTML.replace(reg,"$1 $2 checked");
//Скрываем фильтр "un"
reg=/(<table.+un.+<\/table>)/img;
filter_newHTML=filter_newHTML.replace(reg, "");
document.getElementById("filters").innerHTML=filter_newHTML;
}
';
if (is_object($smarty)) {$smarty->assign('ADDITIONAL_JAVASCRIPT' , $mysrc);}
запуск функции filter_change() прописан в файле addscr.js
function IncludeJavaScript(jsFile) // подключение любого дополнительного javascript файла
{
  document.write('<script type="text/javascript" src="'
	+ jsFile + '"></scr' + 'ipt>');
}

IncludeJavaScript("/cb/include/jquery/jquery.min.js"); // подключаем jquery
jQuery(function($) {
	$(window).ready(function() {
  // функция содержит преобразование строки фильтров
  if(typeof filter_change == 'function') filter_change();
	});
});

как подключить addscr.js здесь

Цитата

каким образом можно ввести второй уровень фильтров?
что подразумевается под вторым уровнем?

Творческая группа "ТАВР".

www.TAVR.pro Художественная ковка, металлоконструкции.

www.СтолМет.рф Складные столы, стулья и системы для их хранения






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных