Я пытаюсь создать динамически зависимый раскрывающийся список с помощью Ajax и CodeIgniter 4. Однако мне не удалось заставить его работать. Можете ли вы помочь мне понять, что не так? Я пытаюсь следовать этому руководству онлайн: ССЫЛКА
Ошибка на консоли
jquery.min.js:2
POST http://localhost/sidsci/public/sd/getAjaxBrgy 500 (Internal Server Error)
База данных
mcb_id | mcb_name | mcb_brgy
Вид
<div class = "form-row">
<div class = "form-group col-md-6">
<label><b>Municipal / City<span class = "text-danger">*</span></b></label>
<select name = "s_muncity" class = "form-control" id = "s_muncity" required>
<option value = "">-Select-</option>
<?php foreach($mcb as $mcb_row):?>
<option value = "<?= $mcb_row->mcb_name;?>"><?= $mcb_row->mcb_name;?></option>
<?php endforeach;?>
</select>
</div>
<div class = "form-group col-md-6">
<label><b>Barangay<span class = "text-danger">*</span></b></label>
<select class = "form-control" name = "s_brgy" id = "s_brgy" required></select>
</div>
</div>
$('#s_muncity').change(function(){
var mcb_name = $(this).val();
$.ajax({
url:'<?=base_url('/sd/getAjaxBrgy')?>',
method: 'POST',
data: {mcb_name: mcb_name},
dataType: 'json',
success: function(response){
$('#s_brgy').find('option').not(':first').remove();
$.each(response,function(index,data){
$('#s_brgy').append('<option value = "'+data['mcb_brgy']+'">'+data['mcb_brgy']+'</option>');
});
}
});
});
Контроллер
public function getAjaxBrgy(){
$model = new McbModel();
$postData = array(
'mcb_name' => $this->request->getPost('mcb_name'),
);
$data = $model->getBrgyData($postData);
echo json_encode($data);
}
Модель
public function getBrgyData($postData) {
$sql = 'select mcb_brgy from mcb where mcb_name ='.$postData['mcb_name'];
$query = $this->db->query($sql);
return $query->getResult();
}
У меня также есть <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
в заголовке.
@Марлин, я уже отредактировал это. это mcb_brgy
.
В разметке представления надежно идентифицируйте параметры, назначив идентификатор базы данных в качестве значения атрибута параметра value
. В подавляющем большинстве случаев отношения должны строиться на идентификаторах, а не на именах.
<div class = "form-row">
<div class = "form-group col-md-6">
<label for = "s_muncity">
<b>Municipal / City<span class = "text-danger">*</span></b>
</label>
<select name = "s_muncity" class = "form-control" id = "s_muncity" required>
<option value = "">-Select-</option>
<?php foreach ($mcb as $mcb_row) { ?>
<?php printf('<option value = "%d">%s</option>', $mcb_row->mcb_id, $mcb_row->mcb_name); ?>
<?php } ?>
</select>
</div>
<div class = "form-group col-md-6">
<label for = "s_brgy"><b>Barangay<span class = "text-danger">*</span></b></label>
<select class = "form-control" name = "s_brgy" id = "s_brgy" required>
<option value = "">-Select-</option>
</select>
</div>
</div>
Если в вашем Javascript вы не собираетесь использовать mcb_id в качестве значений параметров, полностью опустите значение атрибута value
— нет смысла повторять текст параметра в качестве атрибута value
. Этот ajax-запрос представляет собой просто «чтение» данных (а не «запись») данных, поэтому общепринятой практикой является выполнение запроса GET, а не запроса POST.
$('#s_muncity').change(function() {
$.get(
'<?php echo base_url("/sd/getAjaxBrgy/"); ?>' + $(this).val(),
function (response) {
$('#s_brgy').find('option').not(':first').remove();
$.each(response, function(index, data) {
$('#s_brgy').append(
'<option>' + data.mcb_brgy + '</option>'
);
});
},
'json'
);
});
Контроллер
public function getAjaxBrgy(int $mcbId)
{
echo json_encode(
(new McbModel())->getBrgy(['mcb_id' => $mcbId])
);
}
Модель: (ваша предыдущая попытка не заключалась в цитировании передаваемой переменной - я предполагаю, что значение не было целым числом или числом с плавающей запятой)
public function getBrgy(array $where, string $order = 'mcb_name'): array
{
return $this->db
->table('mcb_brgy')
->orderBy($order)
->getWhere($where)
->getResult();
}
При этом я вообще не буду выполнять никаких запросов AJAX!
Поскольку у вас уже есть один набор результатов, содержащий все данные таблицы базы данных, вам следует объявить объект поиска в JavaScript как константу. Свойствами будут значения mcb_id, а значения для каждого mcb_id будут подмассивом, содержащим все связанные значения mcb_brgy.
Все, что вам нужно, будет доступно для мгновенного доступа к Javascript, и вам не придется беспокоить свой сервер.
Заполнение поиска:
const mcbLookup = <?php echo json_encode(
array_reduce(
$mcv,
function ($result, $row) {
$result[$row->mcb_id][] = $row->mcb_brgy;
return $result;
},
[]
)
); ?>;
Добавляем слушателя:
$('#s_muncity').change(function(){
$('#s_brgy').find('option').not(':first').remove();
$.each(
mcbLookup[$(this).val()],
function(index, data) {
$('#s_brgy').append('<option>' + data.mcb_brgy + '</option>');
}
);
});
Вы говорите, что в вашей базе данных есть столбец с именем
mcb_barangay
, но вы используетеselect mcb_brgy ...
в своем запросе, что немного отличается. Вы уверены, что имя столбца, который вы используете в своем запросе, правильное?