Фильтр "ИЛИ" в наборах

#1 17 сентября 2019 в 10:34
Здравствуйте!
Создаю набор для типа контента и выставляю для него несколько условий фильтров. Эти несколько условий работают как "И". Если какой-то вариант, чтобы для определенных фильтров эти услови я работал как "ИЛИ".?

Пример. Есть объявление. В нем есть поле 1 и поле 2. Хочу вывести в наборе все объявления, в которых или поле 1 или поле 2 пустое.
#2 17 сентября 2019 в 12:22
Вроде получилось. но это с помощью правок кода. Возможно кому-то поможет. У меня работает.
Поправил файл /system/core/model.php
Находим public function applyDatasetFilters($dataset, $ignore_sorting = false){
там код
  1.  
  2. switch($filter['condition']){
  3. // общие условия
  4. case 'eq': $this->filterEqual($filter['field'], $filter['value']); break;
меняем на
  1.  
  2. switch($filter['condition']){
  3.  
  4. case 'fi': $this->filter($filter['value']); break;
  5. // общие условия
  6. case 'eq': $this->filterEqual($filter['field'], $filter['value']); break;
  7.  
Так же меняем файл /system/controllers/admin/forms/form_ctypes_dataset.php
вместо кода
  1.  
  2. 'value_items' => array(
  3. 'int' => array(
  4. 'eq' => '=',
  5. 'gt' => '>',
  6. 'lt' => '<',
  7. 'ge' => '≥',
  8. 'le' => '≤',
  9. 'nn' => LANG_FILTER_NOT_NULL,
  10. 'ni' => LANG_FILTER_IS_NULL
  11. ),
  12. 'str' => array(
  13. 'eq' => '=',
  14. 'lk' => LANG_FILTER_LIKE,
  15. 'ln' => LANG_FILTER_NOT_LIKE,
  16. 'lb' => LANG_FILTER_LIKE_BEGIN,
  17. 'lf' => LANG_FILTER_LIKE_END,
  18. 'nn' => LANG_FILTER_NOT_NULL,
  19. 'ni' => LANG_FILTER_IS_NULL
  20. ),
  21. 'date' => array(
  22. 'eq' => '=',
  23. 'gt' => '>',
  24. 'lt' => '<',
  25. 'ge' => '≥',
  26. 'le' => '≤',
  27. 'dy' => LANG_FILTER_DATE_YOUNGER,
  28. 'do' => LANG_FILTER_DATE_OLDER,
  29. 'nn' => LANG_FILTER_NOT_NULL,
  30. 'ni' => LANG_FILTER_IS_NULL
  31.  
вставляем код
  1.  
  2. 'value_items' => array(
  3. 'int' => array(
  4. 'eq' => '=',
  5. 'gt' => '>',
  6. 'lt' => '<',
  7. 'ge' => '≥',
  8. 'le' => '≤',
  9. 'nn' => LANG_FILTER_NOT_NULL,
  10. 'ni' => LANG_FILTER_IS_NULL,
  11. 'fi' => 'My condition'
  12. ),
  13. 'str' => array(
  14. 'eq' => '=',
  15. 'lk' => LANG_FILTER_LIKE,
  16. 'ln' => LANG_FILTER_NOT_LIKE,
  17. 'lb' => LANG_FILTER_LIKE_BEGIN,
  18. 'lf' => LANG_FILTER_LIKE_END,
  19. 'nn' => LANG_FILTER_NOT_NULL,
  20. 'ni' => LANG_FILTER_IS_NULL,
  21. 'fi' => 'My condition'
  22. ),
  23. 'date' => array(
  24. 'eq' => '=',
  25. 'gt' => '>',
  26. 'lt' => '<',
  27. 'ge' => '≥',
  28. 'le' => '≤',
  29. 'dy' => LANG_FILTER_DATE_YOUNGER,
  30. 'do' => LANG_FILTER_DATE_OLDER,
  31. 'nn' => LANG_FILTER_NOT_NULL,
  32. 'ni' => LANG_FILTER_IS_NULL,
  33. 'fi' => 'My condition'
  34.  
После чего можно в наборе в фильтре добавить всего одно поле, любое и выбрать для него тип MyCondition. а в пустом поле справа я написал свое уловие отбора. примерно такое field_01 is null or field_01 = 0 or field_02 is null or field_02 = 0.
#3 18 сентября 2019 в 15:53
vladimird,
Спасибо!
Сделал компонент, добавляющий этот функционал без правки системных файлов:
/blogs/zapiski-dinozavra/komponent-dlja-manipuljaci-filtraciei-i-sortirovkoi-v-datasetah.html
#4 18 сентября 2019 в 16:13
Это просто отлично, спасибо! компонентом гораздо лучше и плюс еще сортировочка получилась.
Эх, когда нибудь кармы наберу и тоже создам свой маленький блог на этом сайте.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.