Я пытаюсь создать систему динамических фильтров, используя ajax с CodeIgniter & jQuery.
У меня есть список элементов, которые извлекаются из моей базы данных, и список флажков для фильтрации этих элементов.
Я хочу иметь возможность установить несколько флажков, позволяющих использовать различные фильтры.
Когда установлен флажок фильтра, я сериализую форму, но я не уверен, как передать это в codeigniter и как с этим бороться.
До сих пор я пробовал это, передавая сериализованные данные в строке запроса.
$('#filter input').bind('change', function(){
var f = $('#filter').serialize();
$('#list').load('http://localhost/testing/filter?'+f);
});
Моя сериализованная форма возвращает следующее, соответствующее флажкам фильтра.
cat_0=1&cat_1=1
В CodeIgniter я могу легко создать этот sql-запрос, опрашивая базу данных и возвращая элементы, которые соответствуют фильтрам.
SELECT * FROM `items` WHERE `category` ='0' OR `category` ='1'
Я полагаю, что моей главной проблемой является получение информации о категориях из моей сериализованной формы в CodeIgniter. Или есть еще один более эффективный метод фильтрации.
Любая помощь приветствуется. Спасибо
EDIT
Моя проблема не заключалась в получении строки запроса, а в том, как с ней справиться в CI. Я закончил тем, что делал это. Это довольно грязно, так что если кто-то может увидеть улучшения, пожалуйста, дайте мне знать. Спасибо
Я только что создал SQL-запрос, используя категории в полученной строке запроса.
<code>function filter(){
if($this->input->get('cat_0', true)) {
$a[] = " OR `category` = '0'";
}
if($this->input->get('cat_1', true)) {
$a[] = " OR `category` = '1'";
}
if($this->input->get('cat_2', true)) {
$a[] = " OR `category` = '2'";
}
if($this->input->get('cat_3', true)) {
$a[] = " OR `category` = '3'";
}
if($this->input->get('cat_4', true)) {
$a[] = " OR `category` = '4'";
}
if($this->input->get('cat_5', true)) {
$a[] = " OR `category` = '5'";
}
if($this->input->get('cat_6', true)) {
$a[] = " OR `category` = '6'";
}
if(!isset($a)){
echo "no items";
} else {
$sql = 'SELECT * FROM `items` WHERE ';
$a[0] = str_replace(" OR ", "", $a[0]); //remove 'OR' from first
foreach($a as $b){
$sql = $sql.$b;
}
echo "<pre>";
print_r($this->db->query($sql)->result());
echo "
";
}
}
РЕДАКТИРОВАТЬ ЧАСТЬ II
Я возвращаюсь к этому вопросу, теперь мне нужно добавить проверку имени пользователя в запрос. Я попробовал следующее остроумие сейчас удачи.
function filter(){
$this->db->where('username', $this->ion_auth->profile()->username);
foreach($_GET as $key=>$value){
if($value == 1){
$key = explode('_', $key);
$this->db->or_where('cat', $key[1]);
}
}
print_r($this->db->get('items')->result());
}
Это оператор SQL, который мне нужно создать, и он работает в моей базе данных.
SELECT * FROM `items` WHERE `username` = 'tmp_username' AND `cat` = '0' OR `cat` = '6';