0
0
0
Проблема с фильтром :'(
  • Есть два выпадающих списка (можно выбрать 50, 100, 150 )где указывается диапазон значений, надо выбрать с 50 до 150 (зависает), выбрать с 50 до 100 (работает).


    ORM подсистема не может обработать запрос более 2х логических OR.

    private function setFilters(ormSelect $sel, $section_id, $class_name) {

    в фильтре дописал такой код (modules/structure/macros.php) :

    else if ($field['f_type'] == 90 || $field['f_type'] == 95) {

    // Справочники
    //if (!empty($value)) {
    // $sel->where($fname, '=', $value);
    // $is_filtered = true;
    //}

    $handbook = new ormSelect($fname);

    $i = 0;
    while ($hb = $handbook->getObject()){
    $mas_value[$i] = $hb->id;
    $i++;
    }

    //echo ($value =='' ? 1 : 0);

    $tt1 =0; $tt2 = 0;
    foreach ($mas_value as $n=>$z){
    if ($value == $z) $tt1 = $n;
    if ($value2 == $z) $tt2 = $n;
    }
    //$tt = $tt2 - $tt1;

    $mas_value2 = array();
    for($i = $tt1; $i <= $tt2; $i++){
    $mas_value2[] = $mas_value[$i];
    //if ($i==1) break;
    }

    $where = array();

    foreach ($mas_value2 as $n=>$z){
    $where[] = $sel->val($fname, '=', $z); //зависает при 3х значениях на денвере, на openserver просто не выводит результат.
    }

    $sel->where( $sel->logOr( $where ) );
  • Не совсем понял, что вам нужно в практическом смысле. Зачем использовать справочник (фиксированный список значений), где напрашивается числовое поле? Поставьте плагин с ползунками на JS, получится тоже самое, пользователь выберет только то что вам нужно.

    По коду понял, что вам нужно выбрать объекты, которые имеют одно из указанных значений справочника. Предложенный способ работать не будет, т.к. метод $sel->logOr() работает со статическими значениями. На самом деле в Багире до текущего момента не было возможности выполнить такую выборку. Пришлось немного дописать ormSelect))

    Скачайте и замените у себя этот файл:
    https://github.com/4sidora/Bagira.CMS/commit/41b8217616715e4b8755555392047a1315f43daf

    Пример использования: выбираем всех пользователей у которых пол либо мужской, либо женский. 30, 31 - это id значений справочника sex.

    $sel = new ormSelect('users');
    $sel->where('sex', '=', array(30, 31), 'OR');

    while($obj = $sel->getObject())
    echo $obj->name;

    Таким образом, ваш код, убрав излишества, можно сократить до:

    else if ($field['f_type'] == 90 || $field['f_type'] == 95) {

    $handbook = new ormSelect($fname);

    $list = array();
    while ($hb = $handbook->getObject())
    if ($value == $hb->id || $value2 == $hb->id)
    $list[] = $hb->id;

    $sel->where($fname, '=', $list, 'OR');
  • Спасибо Андрей ^^, сразу видно профессор))
Эта тема была закрыта.
Все темы

Привет, незнакомец!

Похоже, вы новенький! Чтобы пообщаться с нами, кликните на одну из кнопок ниже :)

Войти с Facebook Войти с помощью OpenID Войти с помощью Twitter\a Вход через vkontakte.ru