Главная > CodeIgniter, jQuery > Ajax-фильтрация. CodeIgniter, jQuery. Часть 2.

Ajax-фильтрация. CodeIgniter, jQuery. Часть 2.


В первой части статьи мы разобрались с исходными данными и сформулировали задачи, которые необходимо выполнить для реализации ajax-фильтрации.

1. Добавить select со списком годов и пунктом «Все».

2. Написать на jQuery обработчик на изменение года в данном select.

3. В данном обработчике получить год, который был выбран и отправить ajax-запрос на сервер с параметром «год выпуска».

4. В контроллере Ajax написать метод, который будет обрабатывать наш ajax-запрос.

Напоминаю ссылку на готовый пример: Ajax-фильтрация

Первые три пункта мы реализуем в отображении cars.php

1. Добавляем select:


Год: <select id="year">
   <option value="all">Все</option>
   <option value="2009">2009</option>
   <option value="2010">2010</option>
</select>


2. Подключаем библиотеку jQuery (если, она еще не подключена у Вас). И создаем обработчик на изменение элемента с id=”year”:


<script type="text/javascript"
             src="<?=$base_url?>/res/js/jquery-1.3.2.min.js"></script>

<script>
   $(document).ready(function(){
      $('#year').change(function(){
         alert($(this).val());
      });
   });
</script>

Напомню, что переменная $base_url получает свое значение (из config.php) в суперконтроллере MY_Controller таким образом :


$this->data['base_url'] = $this->config->item('base_url');

А в наше отображение cars.php попадает из метода index контроллера Ajax вместе с другими данными вот таким образом:


$this->data['results'] = $this->car_model->get_all();
$this->data['inner_view'] = "cars";
$this->load->view('main', $this->data);

Т.е. в родительское отображение main передается весь массив $this->data, который содержит:

- имя внутреннего отображения (cars – в нем мы выводим нашу таблицу с авто)

- базовый url из config.php

- массив объектов  – это данные о наших авто.

Итак, сейчас у нас при изменении года появляется сообщение со значением выбранного года. Т.е. мы уже начали реализовывать пункт 3. Осталось отправить ajax-запрос, что бы завершить выполнение нашего пункта 3.

3. Вот окончательный код отображения cars.php, а ниже немного разъяснений:


<script>
$(document).ready(function(){
   $('#year').change(function(){
      $('#cars').load("<?=site_url('ajax/ajax_filter');?>",
                          {year:$(this).val()},
                          function(){
                          });
   });
});
</script>
<center><h3>Ajax-фильтрация. JQuery, CodeIgniter.</h3></center>
<br/>Год: <select>
   <option value="all">Все</option>
   <option value="2009">2009</option>
   <option value="2010">2010</option>
</select>

<div id="cars">
<table>
      <tr>
         <th>Марка</th>
         <th>Год</th>
         <th>Цена</th>
      </tr>
   <?foreach($results as $res):?>
      <tr>
         <td><?=$res->name?></td>
         <td><?=$res->year?></td>
         <td><?=$res->price?></td>
      </tr>
   <?endforeach;?>
</table>
</div>

Нашу таблицу с информацией, мы заключили в блок с помощью тегов <div></div>. И присвоили этому блоку уникальный идентификатор id=”cars”.

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


$('#cars').load("<?=site_url('ajax/ajax_filter');?>",
                     {year:$(this).val()},
                     function(){
                     });

Т.е. в блок с идентификатором id=”cars” мы с помощью функции load загружаем результат, возвращаемый функцией ajax_filter контроллера ajax. Эту функцию мы напишем в следующем пункте 4.

Функция load – выполняет ajax-запрос.

1 параметр – url, куда мы посылаем запрос. Для нашего примера – это
«<?=site_url(’ajax/ajax_filter’);?>».

2 параметр – [data], данные, отправляемые вместе с запросом на сервер. В нашем случае – это год выпуска автомобиля.

3 параметр – [callback], функция-колбэк, которая выполняется после завершения запроса и получения ответа. В нашем примере эта функция ничего не выполняет. Ее можно было и не писать.

4. Создаем метод, который будет обрабатывать наш ajax-запрос. По url запроса (’ajax/ajax_filter’) видно, что этот метод должен называться ajax_filter и располагаться в контроллере ajax:


function ajax_filter()
{
   $result = array();
   $year = $this->input->post('year');
   $where = '';
   if($year != 'all' ){
      $where = array('year'=>"{$year}");
   }
   $result['cars'] = $this->car_model->get_all($where);
   $this->load->view('ajax',$result);
}

В данном методе:

- инициализируем массив результата $result

- получаем год выпуска, который мы передали вторым параметром в функцию load.

- делаем проверку на то, выбран ли пункт «все» или конкретный год.

- в $result['cars'] получаем все автомобили согласно полученному условию

- передаем полученный результат в отображение ‘ajax’

Теперь осталось создать отображение ajax.php со следующим содержимым:


<table>
      <tr>
         <th>Марка</th>
         <th>Год</th>
         <th>Цена</th>
      </tr>
   <?foreach($cars as $car):?>
      <tr>
         <td><?=$car->name?></td>
         <td><?=$car->year?></td>
         <td><?=$car->price?></td>
      </tr>
   <?endforeach;?>
</table>

Здесь мы выводим таблицу, которая полностью заменит в отображении cars содержимое блока с id=”cars”.

Обратите внимание, что цикл foreach пробегает по массиву $cars, а не по $result.

Итак, мы реализовали поставленную задачу – ajax-фильтрация данных, т.е. фильтрация без перезагрузки web-страницы. Работающий пример здесь: Ajax-фильтрация



  1. Комментариев пока нет.
  1. Трекбеков пока нет.