2

検索できるようにしたいプロジェクトというテーブルのあるアプリがあります。既存のメソッドを使用してモデルを呼び出し、クエリ結果を取得したいと思います。したがって、現在の私のURL形式はexample.com/projects/id/slugであり、すべてのプロジェクトの場合はexample.com/projectsだけです。キーワードを文字列としてメソッドに渡す検索フォームが欲しいのですが。

CIがデフォルトで$_GETを許可しないことを知っています:

セキュリティに関するCodeIgniterのマニュアルから:

GET、POST、およびCOOKIEデータ

システムは従来のURLクエリ文字列ではなくURIセグメントを利用するため、GETデータはCodeIgniterによって単純に許可されません(構成ファイルでクエリ文字列オプションが有効になっている場合を除く)。グローバルGET配列は、システムの初期化中にInputクラスによって設定解除されます。

私の質問は、複数のキーワードでこのようにURIセグメントを使用するにはどうすればよいですか?

検索/キーワード+セカンドキーワード+サードキーワードのようなことはできますか?

フォームを使用して、テキストボックスから上記の形式にキーワードを取得する方法はありますか?

ありがとう、

ビリー

4

3 に答える 3

3

あなたがそのようにそれをしたいのなら...

複数の投稿入力があり、それらが検索専用であると仮定すると、次のようになります。

function search(){

  $url = $this->uri->segment(2);

  if(empty($url)){
      if((isset($_POST) && (!empty($_POST))
      {
         $search_seg = '';

         foreach($_POST as $k => $v){
             // I always make sure to use the CI post w/ 
             // TRUE set in the second param so as to XSS filter the user input
             $var = $this->input->post($k, TRUE);
             // Just incase the user input had a plus in it?
             $var = str_replace('+', '%20', $var)
             // Concatenate the search string
             $search_seg .= $var . '+';
         }

         // Make the url, use substr() to strip the last + off the end 
         $search_seg = 'search/' . substr($search_seg, 0, -1);

         /* Make sure CI's URL helper is enabled
            $this->load->helper('url'); if it hasn't been loaded
            This will give the illusion that the form post went to this URL,
            thus doing what you're looking for... */
         redirect($search_seg, 'location');

      }else{
         // There was no post, do whatever
      }
  }else{
      $search_arr = explode('+', $url);
  }

$ _GET配列を再作成し、CIスタイルのURLで使用する方法はいくつかありますが、上記は説明したとおりに実行されるはずですが、少し複雑です。

追加情報:

検索入力フィールドが1つだけで、たとえば、用語がスペースで区切られている場合は、次のように実行することをお勧めします(正規表現フィルタリングを使用して)...foreach($_POST as $k => $v)...ループを次のように置き換えます。

$keywordinput = $this->input->post('keywords', TRUE);
$keywordinput = trim($keywordinput);

$keywords = explode(' ', $keywordinput);

foreach($keywords as $word){
    if(!empty($word)){
       $word = str_replace('+', '%20', $var)
       $search_seg .= $word . '+';
    }
}
于 2011-01-24T17:14:10.223 に答える
0

$ _POSTを使用することは、複雑なクエリにはより良いオプションかもしれませんが、これは機能するかもしれませんが、URIに特定のパラメーターの順序が必要です(より良い方法があるかもしれません)

/*controller/method/params = search/do_search/Ross/Red/Male */

function do_search($name, $colour, $gender)
{
    $this->db->or_where('name', $name);
    $this->db->or_where('colour', $colour);  
    $this->db->or_where('gender', $gender);
    // etc
}

あまり拡張性や柔軟性はありませんが、単純な検索にはそれで十分かもしれません。

于 2011-01-24T15:11:38.910 に答える
0

URLを次のようにしたい場合-

search/keyword+secondkeyword+thirdkeyword? 

また、ブックマーク可能にする必要がある場合は、javascriptを使用することは私が推測する唯一のオプションです。

javascriptを使用すると、URLの#の後に検索パラメータを設定できるため、最終的なURLは次のようになります-

search#keyword+secondkeyword+thirdkeyword

このアプローチを使用する場合、つまり、ajaxを介して検索結果をロードする場合、つまり、URLが検出されるたびに、javascriptによるurlからのハッシュの後に検索キーワードを取得します。ajaxを介して結果をロードし、結果を表示します。検索条件が変更された場合は、javascriptを使用してハッシュした後、URLに新しいキーワードを追加する必要があるたびに。

#の後にURLのパラメータを取得するための基本的なJavaScriptコードは次のとおりです-

var parameters = window.location.hash;
于 2011-01-24T18:07:55.803 に答える