2011-01-27 7 views
1

私は、CodeIgniter & jQueryでajaxを使用して動的フィルタシステムを作成しようとしています。CodeIgniter/jQueryデータベースフィルタシステム

私のデータベースから取得したアイテムのリストと、これらのアイテムをフィルタするためのチェックボックスのリストがあります。 複数のチェックボックスを選択して、さまざまなフィルタを使用できるようにしたいと考えています。

フィルターチェックボックスをクリックすると、フォームをシリアル化しますが、これをコードシグニチャーに渡す方法と対処方法がわかりません。 これまで、私はこれを試して、シリアル化されたデータをクエリ文字列に渡しました。

$('#filter input').bind('change', function(){ 
    var f = $('#filter').serialize(); 
    $('#list').load('http://localhost/testing/filter?'+f); 
}); 

私のシリアル化されたフォームは、フィルタのチェックボックスに対応して以下を返します。 CodeIgniterので

cat_0=1&cat_1=1 

私は簡単にデータベースを照会し、フィルタに一致する項目を返し、このSQLクエリを作成することができます。

SELECT * FROM `items` WHERE `category` ='0' OR `category` ='1' 

私の主な問題は、シリアル化されたフォームからCodeIgniterにカテゴリ情報を取得していることでしょう。または、フィルタリングのもう1つの効率的な方法があります。 ご協力いただければ幸いです。私の問題は、クエリ文字列を受け取っていなかったおかげで

EDIT

は、それはCIでそれに対処する方法でした。私はこれをやり終えた。かなり面倒ですので、誰かが改善を見ていれば教えてください。ありがとう

受信したクエリ文字列のカテゴリを使用してSQLクエリを作成しました。

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 "</pre>"; 
    }  
} 

EDIT PART 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'; 
+0

、私はあなたが.htaccessファイルを実行すると、URLからそれを削除していると仮定していますか? – jondavidjohn

答えて

1

あなたのURLが正しい場合は、URIセグメントベースのURLですCodeIgniterので「クエリ文字列」を使用しようとしています。ライン151上のごsystem/applicaiton/config/config.php

TRUEに、この値は、このライン

$config['enable_query_strings'] = FALSE; 

変更すること、それはあなたがURLからデータを取得し$this->input->get('cat_0');$this->input->get('cat_1');を使用することができますかどうかを確認する必要があります。

また、URLが正しいことを確認するには、任意のデータを渡してブラウザに直接入力して、404または500というメッセージが表示されないようにしてください。 。あなたの例のために、この方法は動作するはずですが、​​を介してデータを送信するための正しい方法は、2番目のパラメータとして渡しするので、

NOTE

$('#list').load('path/to/file', f);

EDIT

これは、私があなたがしようとしていることを達成する方法です。CodeigniterのActiveRecordクラスを利用することで、あなたがしようとしているように徐々にクエリを構築するのが面倒になります。

function filter(){ 

    foreach($_GET as $key=>$value) { 
     if ($value == 1) { 
      $key = explode('_',$key); 
      $this->db->or_where('category', $key[1]); 
     } 
    } 

    if(count($_GET) > 0){ 
     $query = $this->db->get('items'); 
     echo "<pre>"; 
      print_r($query->result()); 
     echo "</pre>"; 
    } else { 
     echo "no items."; 
    }  
} 
+0

私はクエリ文字列のために私のcodeIgniterセットアップを持っているので、CIの中で私はちょうど$ _GETをループして、関連する項目をリストを返す前に追加する必要がありますか?私は実際に前にスイッチのステートメントでこれをやっていましたが、それは少し長めになったと思っていました。私はテスト用に.load()を使用しています。いったん動作したら、私はajaxに切り替えるでしょう。 – michael

+0

更新された答え、an on a side noteは、 '.load()'から '$ .ajax'に切り替える必要はなく、' .load() 'ははるかに少ないコードで、あなたの使用に完全に合っています。 load() 'は単なるショートカットajax関数です。 – jondavidjohn

+0

助けてくれてありがとう。私は$ _GET変数を直接使用することには注意していましたが、なぜそれが間違っていると思ったのですか。私はちょうど.loadに固執すると思う、私はそれが私がアニメーションをロードするために使用できる完全なコールバックを持っていることを認識していない。助けてくれてありがとう。 – michael

-1

より良い方法は、コントローラにデータを渡すことです。私はそのURL内のindex.phpが表示されていないので、

$('#filter input').bind('change', function(){ 
    var f = $('#filter').serialize(); 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost/testing/filter", 
     data: "value="+f,  
     dataType: "json", 
     success: function(data){ 
      //code after success. 
     } 
    }); 
}); 
+0

'.load()'はajaxのショートカットであるだけでなく、通常の '$ .ajax()'関数を使用しています。 – jondavidjohn

+0

私は素早くテストするために負荷を使用していました – michael

+0

それでも間違っています、なぜあなたは 'value ='をデータパラメータに追加していますか?あなたはなぜそれが '' json ''を期待しているのでしょうか? – jondavidjohn