banzai72

Отключить чекбоксом показ объявлений определенной группы

Recommended Posts

Посоветуйте пожалуйста, что лучше прописать, что бы отключить чекбоксом показ объявлений определенной группы ?

К примеру кодом :

<input style="float:left;" class="checkbox" type="checkbox" name="group_id" value="18" /><label class="ch"><strong><font color="#B22222">ТОЛЬКО ГРУППА 18</font></strong></label>

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

А как лучше прописать, что бы при нажатии на чекбокс в фильтре мы находили все объявления кроме пользователя группы 18 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, banzai72 сказал:

Посоветуйте пожалуйста, что лучше прописать, что бы отключить чекбоксом показ объявлений определенной группы ?

К примеру кодом :

<input style="float:left;" class="checkbox" type="checkbox" name="group_id" value="18" /><label class="ch"><strong><font color="#B22222">ТОЛЬКО ГРУППА 18</font></strong></label>

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

А как лучше прописать, что бы при нажатии на чекбокс в фильтре мы находили все объявления кроме пользователя группы 18 ?

Может в data добавить какой-нить параметр - чекбокс, например с названием no_view, по наличию которого и будет определяться - показывать объявление или нет. В вывод объявлений добавить условие, по которому будет определяться наличие статуса - чекбокса и условия вывода - показывать или не показывать. В условие можно добавить перечисление групп пользователей, кому именно показывать/не показывать. Наверное можно решить вопрос и с объемом информации к показу - одним группам не показывать, другим группам - основную информацию, третьим группам - полную информацию. Или, как вариант, одним группам будет даваться возможность отправить заявку (платная подписка), другим будет эта возможность предоставляться спустя сутки (агенты-халявщики), третьим - никогда (незарегистрированные, может собственники).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, Chernetskiy сказал:

Может в data добавить какой-нить параметр - чекбокс, например с названием no_view, по наличию которого и будет определяться - показывать объявление или нет. В вывод объявлений добавить условие, по которому будет определяться наличие статуса - чекбокса и условия вывода - показывать или не показывать. В условие можно добавить перечисление групп пользователей, кому именно показывать/не показывать. Наверное можно решить вопрос и с объемом информации к показу - одним группам не показывать, другим группам - основную информацию, третьим группам - полную информацию. Или, как вариант, одним группам будет даваться возможность отправить заявку (платная подписка), другим будет эта возможность предоставляться спустя сутки (агенты-халявщики), третьим - никогда (незарегистрированные, может собственники).

Не совсем. Смысл не тот. Нужно просто в фильтре, если сотрудник хочет, нажатием данного чекбокса не видеть объявления пользователя 18 *в нашем случае это объявления от собственников). Что бы видеть только объявления агентов.

Тоесть кодом, котопый я написал выше мы видим только собственников а нужен код при которым мы будем видеть объявления всех групп кроме собственников )))))))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Задача своlbтся к стандартной задаче добавления нового элемента формы поиска и обеспечения фильтрации по нему (это если такое поведение должно быть именно с фильтра)

Делается в два шага:

1. собственно добавление элемента на форму

Для этого выбираем имя параметра под которым признак будет проходить в запросах. Например hide_smth. Для большей гибкости мы не будем водить этот параметр по конкретному значению, как в примере =18. Потому что если завтра мы решим как-то расширить диапазон тех, кого прячем, нам не нужно будет править это 18 на 20 или изголяться, что бы сложить туда идешки двух групп. Логику определения, что спрятать, мы уберем в код, который будет формировать запрос. А снаружи оставим только просто параметр, наличие которого будет нам говорить не "что именно нужно спрятать", а "что нам нужно в целом что-то спрятать, а ты сам реши уже что именно".

ПС. Использование в той же переменной name="group_id" value="18" конкретного значения 18 приводит еще к тому, что подменяя 18 на другие ИД (15, 1, 22) я смогу управлять фильтрацией снаружи, без учета того, что хотел владелец сайта предоставить мне. Это не всегда критично, но иногда может вылезти очень сильно боком (особенно если код обработчик просто принимает это число из запроса и ставит его в условия фильтрации без каких либо внутренних проверок).

ППС. Суть создания элементов поисковых форм и их обработчиков состоит не в том, что бы дать пользователю все возможности самому там ковыряться и играть вариантами, а в том, что бы дать ему ровно столько, сколько вы считаете нужным и он не мог выйти за рамки.

Поэтому на форме мы размещаем хтмл вида

<input class="checkbox" type="checkbox" name="hide_smth" value="1"{if intval($smarty.get.hide_smth)==1} checked="checked"{/if} /><label class="ch">Не показыват ЭТИХ</label>

2. прописывание логики поиска

Что бы наш параметр учелся в поиске, мы должны его перехватить и обработать. Для этого мы используем или tempalte_search или локализацию grid_constructor.

Для варианта tempalte_search внутри public function getParams() перехватываем параметр

if(1===intval($this->getRequestValue('hide_smth'))){
$params['hide_smth'] = 1;
}

и добавляем обработку внутри public function run()

if(isset($params['hide_smth'])){
	$DBC=DBC::getInstance();
	$hide_users=array();
    /*получаем ИД юзеров из "запрещенных" групп*/
    /*вместо 1,2,3,4 через запятую поставить ИД этих групп*/
    $query='SELECT `user_id` FROM '.DB_PREFIX.'_user WHERE `group_id` IN (1,2,3,4)';
    $stmt=$DBC->query($query);
    if($stmt){
        while($ar=$DBC->fetch($stmt)){
            $hide_users[]=$ar['user_id'];
        }
    }
	/*Если юзеров из запрещенных групп более нуля, то добавляем условие в выборку объектов*/
	/*с исключением этих юзеров*/
    if(!empty($hide_users)){
        $where_array[]=DB_PREFIX.'_data.iser_id NOT IN ('.implode(',', $hide_users).')';
    }

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
30 минут назад, abushyk сказал:

Задача своlbтся к стандартной задаче добавления нового элемента формы поиска и обеспечения фильтрации по нему (это если такое поведение должно быть именно с фильтра)

Делается в два шага:

1. собственно добавление элемента на форму

Для этого выбираем имя параметра под которым признак будет проходить в запросах. Например hide_smth. Для большей гибкости мы не будем водить этот параметр по конкретному значению, как в примере =18. Потому что если завтра мы решим как-то расширить диапазон тех, кого прячем, нам не нужно будет править это 18 на 20 или изголяться, что бы сложить туда идешки двух групп. Логику определения, что спрятать, мы уберем в код, который будет формировать запрос. А снаружи оставим только просто параметр, наличие которого будет нам говорить не "что именно нужно спрятать", а "что нам нужно в целом что-то спрятать, а ты сам реши уже что именно".

ПС. Использование в той же переменной name="group_id" value="18" конкретного значения 18 приводит еще к тому, что подменяя 18 на другие ИД (15, 1, 22) я смогу управлять фильтрацией снаружи, без учета того, что хотел владелец сайта предоставить мне. Это не всегда критично, но иногда может вылезти очень сильно боком (особенно если код обработчик просто принимает это число из запроса и ставит его в условия фильтрации без каких либо внутренних проверок).

ППС. Суть создания элементов поисковых форм и их обработчиков состоит не в том, что бы дать пользователю все возможности самому там ковыряться и играть вариантами, а в том, что бы дать ему ровно столько, сколько вы считаете нужным и он не мог выйти за рамки.

Поэтому на форме мы размещаем хтмл вида


<input class="checkbox" type="checkbox" name="hide_smth" value="1"{if intval($smarty.get.hide_smth)==1} checked="checked"{/if} /><label class="ch">Не показыват ЭТИХ</label>

2. прописывание логики поиска

Что бы наш параметр учелся в поиске, мы должны его перехватить и обработать. Для этого мы используем или tempalte_search или локализацию grid_constructor.

Для варианта tempalte_search в 

Спасибо. Но к сожалению это первый ваш совет который я не понял и не смог реализовать (((

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
<input class="checkbox" type="checkbox" name="hide_smth" value="18"{if intval($smarty.get.hide_smth)==1} checked="checked"{/if} /><label class="ch">Не показывать группу 18</label>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

самое главное, что я пытаюсь пояснить - не раскрывайте карты.

Что означает с точки зрения сайта "не показывать каких-то юзеров" - это значит определить что есть заказ на непоказ со стороны клиента и решить кого следует исключить из выдачи.

Это же самое с точки зрения клиента должно означать "передай признак, что ты хотел бы скрыть каких-то пользователей, обозначенных как собственники". Т.е. клиент должен вообще не понимать как обозначены собственники (привет group_id=18), потому что это не его дело и потому, что сегодня собственники в группе 18, а завтра в 18 и 22, а послезавтра группы вооще не будут отражать принадлежность к собственнику и у каждого юзера в данных профиля появится галочка "Я собственник". Он просто просит сайт сделать это, а как, кого и по каким условиям - сайт решит сам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сделал value="18" , вставил в фильтр. Но к сожалению так и не понял, что ещё мне нужно сделать, что бы с применением этого чекбокса не показывать объявления группы 18

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если что-то не понятно, то пишите в какой части - в теоретических выкладках, или в примерах реализации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, banzai72 сказал:

что ещё мне нужно сделать, что бы с применением этого чекбокса не показывать объявления группы 18

давайте вернемся к стартовому посту. что вы сделали, что бы по отметке вашего чекбокса показывались только 18-тигрупповые? Плотому что если в лоб, то вам нужно сделать для непоказа то же самое, только инвертировать условие отбора. Типа было В 18-й, а станет НЕ В 18-й

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, abushyk сказал:

Если что-то не понятно, то пишите в какой части - в теоретических выкладках, или в примерах реализации.

Если честно то мне стыдно, но не понятно ничего кроме того, что вставить в фильтр код:

<input class="checkbox" type="checkbox" name="hide_smth" value="18"{if intval($smarty.get.hide_smth)==1} checked="checked"{/if} /><label class="ch">Не показывать группу 18</label>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, abushyk сказал:

давайте вернемся к стартовому посту. что вы сделали, что бы по отметке вашего чекбокса показывались только 18-тигрупповые?

Ничего. Я просто посмотрел, что у меня в фильтре есть вот такой код на количестве комнат:

<input style="float:left;" class="checkbox" type="checkbox" name="room_count[]" value="1" /><label class="ch">1</label>

и подправил его под свои нужды вот так:

<input style="float:left;" class="checkbox" type="checkbox" name="group_id" value="18" /><label class="ch"><strong><font color="#B22222">ТОЛЬКО СОБСТВЕННИКИ</font></strong></label>

И получилось

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это у меня в специальном фильтре, который показывается на сайте только зарегистрированным пользователям(только сотрудникам).

standart_search_form2.tpl

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, abushyk сказал:

давайте вернемся к стартовому посту. что вы сделали, что бы по отметке вашего чекбокса показывались только 18-тигрупповые? Плотому что если в лоб, то вам нужно сделать для непоказа то же самое, только инвертировать условие отбора. Типа было В 18-й, а станет НЕ В 18-й

Видимо это сложно для меня. Помогите пожалуйста

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21 час назад, abushyk сказал:

Задача своlbтся к стандартной задаче добавления нового элемента формы поиска и обеспечения фильтрации по нему (это если такое поведение должно быть именно с фильтра)

Делается в два шага:

1. собственно добавление элемента на форму

Для этого выбираем имя параметра под которым признак будет проходить в запросах. Например hide_smth. Для большей гибкости мы не будем водить этот параметр по конкретному значению, как в примере =18. Потому что если завтра мы решим как-то расширить диапазон тех, кого прячем, нам не нужно будет править это 18 на 20 или изголяться, что бы сложить туда идешки двух групп. Логику определения, что спрятать, мы уберем в код, который будет формировать запрос. А снаружи оставим только просто параметр, наличие которого будет нам говорить не "что именно нужно спрятать", а "что нам нужно в целом что-то спрятать, а ты сам реши уже что именно".

ПС. Использование в той же переменной name="group_id" value="18" конкретного значения 18 приводит еще к тому, что подменяя 18 на другие ИД (15, 1, 22) я смогу управлять фильтрацией снаружи, без учета того, что хотел владелец сайта предоставить мне. Это не всегда критично, но иногда может вылезти очень сильно боком (особенно если код обработчик просто принимает это число из запроса и ставит его в условия фильтрации без каких либо внутренних проверок).

ППС. Суть создания элементов поисковых форм и их обработчиков состоит не в том, что бы дать пользователю все возможности самому там ковыряться и играть вариантами, а в том, что бы дать ему ровно столько, сколько вы считаете нужным и он не мог выйти за рамки.

Поэтому на форме мы размещаем хтмл вида


<input class="checkbox" type="checkbox" name="hide_smth" value="1"{if intval($smarty.get.hide_smth)==1} checked="checked"{/if} /><label class="ch">Не показыват ЭТИХ</label>

2. прописывание логики поиска

Что бы наш параметр учелся в поиске, мы должны его перехватить и обработать. Для этого мы используем или tempalte_search или локализацию grid_constructor.

Для варианта tempalte_search внутри public function getParams() перехватываем параметр


if(1===intval($this->getRequestValue('hide_smth'))){
$params['hide_smth'] = 1;
}

и добавляем обработку внутри public function run()


if(isset($params['hide_smth'])){
	$DBC=DBC::getInstance();
	$hide_users=array();
    /*получаем ИД юзеров из "запрещенных" групп*/
    /*вместо 1,2,3,4 через запятую поставить ИД этих групп*/
    $query='SELECT `user_id` FROM '.DB_PREFIX.'_user WHERE `group_id` IN (1,2,3,4)';
    $stmt=$DBC->query($query);
    if($stmt){
        while($ar=$DBC->fetch($stmt)){
            $hide_users[]=$ar['user_id'];
        }
    }
	/*Если юзеров из запрещенных групп более нуля, то добавляем условие в выборку объектов*/
	/*с исключением этих юзеров*/
    if(!empty($hide_users)){
        $where_array[]=DB_PREFIX.'_data.iser_id NOT IN ('.implode(',', $hide_users).')';
    }

}

 

В standart_search_form2.tpl  вставил :

<input style="float:left;" class="checkbox" type="checkbox" name="group_id" value="18" /><label class="ch"><strong><font color="#B22222">ТОЛЬКО СОБСТВЕННИКИ</font></strong></label><br><br>    
<input class="checkbox" type="checkbox" name="hide_smth" value="1"{if intval($smarty.get.hide_smth)==1} checked="checked"{/if} /><label class="ch">Все кроме собственников</label>

 

 

 

В  /home/uqirahbm/public_html/template/frontend/real-spaces/main/template_search.php         сделал так:

 

 

<?php
class Template_Search extends SiteBill {
    public function getParams(){

        $params=array();
        
        if(1===intval($this->getRequestValue('hide_smth'))){
$params['hide_smth'] = 1;
}

        
        if($this->getRequestValue('land_square_min') != '' ){
            $params['land_square_min'] = $this->getRequestValue('land_square_min');
        }
        
        if($this->getRequestValue('srch_word') != '' ){
            $params['srch_word'] = $this->getRequestValue('srch_word');
        }
        
        if($this->getRequestValue('land_square_max') != '' ){
            $params['land_square_max'] = $this->getRequestValue('land_square_max');
        }
        if(intval($this->getRequestValue('group_id')) >0 ){
            $params['group_id'] = intval($this->getRequestValue('group_id'));
        }
        return $params;
    }

    public function run(){
        $params=$this->getParams();
        $where_array=array();
        require_once(SITEBILL_DOCUMENT_ROOT.'/apps/system/lib/model/model.php');
        $data_model = new Data_Model();
        $data_model_array = $data_model->get_kvartira_model(false);
        $data_model_array=$data_model_array['data'];

        if(isset($params['hide_smth'])){
    $DBC=DBC::getInstance();
    $hide_users=array();
    /*получаем ИД юзеров из "запрещенных" групп*/
    /*вместо 1,2,3,4 через запятую поставить ИД этих групп*/
    $query='SELECT `user_id` FROM '.DB_PREFIX.'_user WHERE `group_id` IN (18)';
    $stmt=$DBC->query($query);
    if($stmt){
        while($ar=$DBC->fetch($stmt)){
            $hide_users[]=$ar['user_id'];
            
        }
    }
    /*Если юзеров из запрещенных групп более нуля, то добавляем условие в выборку объектов*/
    /*с исключением этих юзеров*/
    if(!empty($hide_users)){
        $where_array[]=DB_PREFIX.'_data.iser_id NOT IN ('.implode(',', $hide_users).')';
    }

}
        
        if(isset($params['land_square_min']) && isset($data_model_array['land_square'])){
            $where_array[]=DB_PREFIX."_data.land_square >= ".$params['land_square_min'];
        }
        
        if(isset($params['srch_word'])){
            $where_array[]= '('.DB_PREFIX.'_data.text LIKE \'%' . $params['srch_word'] . '%\''.' OR '.DB_PREFIX.'_data.address LIKE \'%' . $params['srch_word'] . '%\''.' 
            OR '.DB_PREFIX.'_data.street_id in (select street_id from '.DB_PREFIX.'_street where name like \'%' . $params['srch_word'] . '%\')
            OR '.DB_PREFIX.'_data.city_id in (select city_id from '
                .DB_PREFIX.'_city where name like \'%' . $params['srch_word'] . '%\')
            OR '.DB_PREFIX.'_data.district_id in (select district_id from '.DB_PREFIX.'_district where name like \'%' . $params['srch_word'] . '%\')
            OR '.DB_PREFIX.'_data.Mikrorayony_id in (select Mikrorayony_id from '.DB_PREFIX.'_Mikrorayony where name like \'%' . $params['srch_word'] . '%\')
            OR '.DB_PREFIX.'_data.complex_id in (select complex_id from '.DB_PREFIX.'_complex where name like \'%' . $params['srch_word'] . '%\') )
            ';
        }
        
        if(isset($params['land_square_max']) && isset($data_model_array['land_square'])){
            $where_array[]=DB_PREFIX."_data.land_square <= ".$params['land_square_max'];
        }
        if(isset($params['group_id'])){
            $where_array[]=DB_PREFIX."_data.user_id IN (SELECT user_id FROM ".DB_PREFIX."_user WHERE group_id=".$params['group_id'].")";
        }
        
        if($params['phone'] == 1 && isset($data_model_array['phone'])){
            $where_array[]=DB_PREFIX.'_data.owner_phone ='.$params['phone'];

    

 }

$phone = trim($this->getRequestValue('phone'));if(''!==$phone){   $params['phone'] = $phone;  }    if(isset($params['phone'])){            $where_array[]='('.DB_PREFIX.'_data.owner_phone LIKE "%'.$params['phone'].'%")';        }
        return array(
            'where'=>$where_array,
            'params'=>$params        
        );
    }
}

Не получилось. при использовании данного чекбокса не выдает не одного объявления (

Подскажите пожалуйста, что я не так понял, не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

УРА!!! ПОЛУЧИЛОСЬ!!! СПАСИБО!

Ошибка была в :


    /*Если юзеров из запрещенных групп более нуля, то добавляем условие в выборку объектов*/
    /*с исключением этих юзеров*/
    if(!empty($hide_users)){
        $where_array[]=DB_PREFIX.'_data.iser_id NOT IN ('.implode(',', $hide_users).')';
    }

}

 

iser заменил на user

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 13.09.2018 в 13:03, abushyk сказал:

давайте вернемся к стартовому посту. что вы сделали, что бы по отметке вашего чекбокса показывались только 18-тигрупповые? Плотому что если в лоб, то вам нужно сделать для непоказа то же самое, только инвертировать условие отбора. Типа было В 18-й, а станет НЕ В 18-й

Это наверное будет слишком нагло с моей стороны, но я попробую спросить.....

Как можно сделать то же самое с новостройками. Поставить в фильтр чекбокс "Только новостройки". Название колонки новостройки у меня в data "new_flat"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас