Иногда нам необходимо связать данные из одного списка с данными в другом.
Суть реализации такова, из представления по средствам Ajax мы передаем запрос в функцию контролера, которая нам возвращает готовый список с результатами.
С алгоритмом определились, теперь давайте перейдем к реализации задуманного.
Для начала нам необходим основной список , предположим что он у вас уже есть. Под основным списком создадим пустой блок, куда будет выводиться дополнительный список.
<label>Назначение платежа</label> <?php // Корневой список print '<select name="root" id="root">'; print '<option selected disabled></option>'; // В моем случаи корневой список формируется из справочника базы foreach ($bdds as $bdds_row) { print '<option value="'.$bdds_row['id'].'">'.$bdds_row['name'].'</option>'; } print '</select>'; ?> // В этом блоке будет формироваться дополнительный список <div id="sub"></div>
Теперь давайте в нашем представлении создадим JavaScript код, который будет обмениваться с контролером.
$(document).ready(function() { $("#root").change(function() { var val = $(this).find("option:selected").val(); $.ajax({ type: "POST", url: "/office/linked", data: "parent_id="+val, cache: false, success: function(txt){ $("#sub").html(txt); } }); }); });
Немного пояснений, данный код будет посылать POST запрос в функцию linked, которая находится в контролере office. Передаваться будет ID в переменной parent_id для записи, выбранной из корневого списка. Результат будет возвращаться в блок с идентификатором sub. Все это будет происходить по событию change для корневого списка с идентификатором root.
Теперь собственно сама функция linked, выглядит она у меня вот так.
public function linked() { $parent_id = $this->input->post('parent_id'); $string = 'SELECT * FROM bdds WHERE parent_id = '.$this->db->escape($parent_id).''; $query_linked = $this->db->query($string); $linked_data = $query_linked->result_array(); print '<label>Подкатегория назначения платежа</label>'; print '<select name=\'sub\'>'; foreach ($linked_data as $link) { print '<option value='.$link['id'].'>'.$link['name'].'</option>'; } print '</select>'; }
Вот собственно и все, как видите ничего сложного в такой реализации нет.