2016-10-07 1 views
3

Я разрабатываю функцию поиска с некоторыми данными с помощью Codeigniter.

Моя модель поиска выглядит следующим образом:

class Search_Model extends CI_Model { 

     public function get_results($search_terms = false) { 

      // Build query 
      foreach ($search_terms as $field => $value) { 
       $this->db->like("{$field}", $value); 
      } 

      // Execute query 
      $query = $this->db->get('exams'); 

      // Return results 
      return $query->result_array(); 
     } 
} 

И контроллер способ поиска выглядит следующим образом:

public function results() { 

      $search_terms = array(
       'first_name' => $this->input->get('first_name', TRUE), 
       'last_name' => $this->input->get('last_name', TRUE), 
       'exam_name' => $this->input->get("exam_name", TRUE) 
      ); 

      $data['title'] = "Search Results"; 
      $data['exams'] = $this->search_model->get_results($search_terms); 

      $this->load->view('templates/header.php', $data); 
      $this->load->view('exams/index.php', $data); 
      $this->load->view('templates/footer.php'); 
} 

поиска работает как надо, но я хочу, чтобы очистить URL, который приходит если я только ищу «Имя»:

search/results?first_name=tim&last_name=&exam_name= 

Как удалить tho se дополнительные параметры, которые не используются в URL?

+0

где вы установили получить URL ??? –

+0

У меня есть индексный метод в контроллере поиска, который задает метод формы GET, так как я хочу видеть условия поиска в URL-адресе –

+1

, вы можете сделать это просто с помощью jquery. сначала добавьте свой код формы в свой вопрос .. –

ответ

0

включают JQuery в вашем заголовке. затем добавьте этот скрипт.

<script> 
$(document).ready(function(){ 
    $('#myform').submit(function(event){ 
     event.preventDefault(); 
     var url = $(this).attr('action')+'?'; 
     var first = false; 
     var second = false; 
     if($('input[name="first_name"]').val()){ 
      url += 'first_name='+$('input[name="first_name"]').val(); 
      first = true; 
     } 
     if($('input[name="last_name"]').val()){ 
      if(first){ 
       url += '&'; 
      } 
      url += 'last_name='+$('input[name="last_name"]').val(); 
      second = true; 
     } 
     if($('input[name="exam_name"]').val()){ 
      if(second){ 
       url += '&'; 
      } 
      url += 'exam_name='+$('input[name="exam_name"]').val(); 
     } 
     window.location.replace(url); 
    }); 
}); 
</script> 

(я не побежал этот сценарий еще, так что дайте мне знать, если у получить какую-либо ошибку синтаксиса или somethign еще.) и, наконец, изменить ваши результаты функции к этому,

public function results() { 

      $search_terms = array(); 

      if(isset($_GET['first_name'])){ 
       $search_terms['first_name'] = $this->input->get('first_name', TRUE); 
      } 
      if(isset($_GET['last_name'])){ 
       $search_terms['last_name'] = $this->input->get('last_name', TRUE); 
      } 
      if(isset($_GET['exam_name'])){ 
       $search_terms['exam_name'] = $this->input->get('exam_name', TRUE); 
      } 

      $data['title'] = "Search Results"; 
      $data['exams'] = $this->search_model->get_results($search_terms); 

      $this->load->view('templates/header.php', $data); 
      $this->load->view('exams/index.php', $data); 
      $this->load->view('templates/footer.php'); 
} 
+0

Я только что вернулся домой и смог попробовать это. После этого решения это действительно сработало. Ответ Yada фильтровал через массив PHP, но параметры все еще отображались в URL-адресе. Используя JS, отформатируйте URL-адрес красиво !! –

+0

@TimothyFisher: большое спасибо за попытку этого. и я рад узнать, что это решило вашу проблему. и извините за недоразумение. просто задаваясь вопросом, кто ниспослал никуда. в любом случае, спасибо. –

4

Самый быстрый способ - просто фильтровать массив $ searh_terms, прежде чем передавать его в модель.

$search_terms = array(
    'first_name' => $this->input->get('first_name', TRUE), 
    'last_name' => $this->input->get('last_name', TRUE), 
    'exam_name' => $this->input->get("exam_name", TRUE) 
); 

// Remove empty search values 
foreach ($search_terms as $key => $value) { 
    if (strlen($value) == 0) { 
     unset($search_terms[$key]); 
    } 
} 
+0

как насчет 'submit = submit_button_value'? Есть ли способ скрыть его от URL-адреса (первый раз при отправке формы)? –

+1

Не будет ли 'array_filter' делать то же самое? –

+0

Это работало лучше всего для меня. Я также посмотрю на 'array_filter', спасибо всем за предложения! –

-1

Вы можете попробовать это:

$mode = array(); 
    if(isset($_GET['first_name'])): 
     $mode[] = 'first_name='.$_GET['first_name']; 
    endif; 

    if(isset($_GET['last_name'])): 
     $mode[] = 'last_name='.$_GET['last_name']; 
    endif; 

    if(isset($_GET['exam_name'])):  
     $mode[] = 'exam_name='.$_GET['exam_name']; 
    endif; 

    //etc... 

    //Then reformulate link 
    if(!empty($mode)){ 
     $link = '?' . implode('&',$mode); 
    }else{ 
     $link = ''; 
    } 

    redirect("form.php".$link); 
-1

просто фильтровать то, что вы отправляете ...

foreach ($search_terms as $field => $value) { 
      if ($value <> ""){ //or the test you like to use... 
       $this->db->like("{$field}", $value); 
      } 
     } 
Смежные вопросы