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


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


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

#1 andibrag

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

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

Отправлено 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.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.


#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 327 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 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.MEGATAVR.com Художественная ковка, витражи, мозаика, фрески.

www.iGal.pro Уникальный мангал.






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

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