У меня есть цикл php foreach, работающий с записями в базе данных. foreach добавляет новую строку таблицы, показывающую контакты в базе данных, например. имя, адрес и т. д. Я использую ссылку href для запуска сценария ajax/jquery, который добавит эту запись в таблицу списка экипажа. Сценарий находится в цикле foreach, поэтому у меня есть доступ к данным для отправки.
Моя проблема в том, что первая строка работает нормально, а остальные записи не запускают скрипт. Я думаю, это может быть потому, что скрипт не может запускаться с тем же идентификатором? поэтому я добавил идентификатор контактов в файл href.
<a id = "addCrewLink'.$contact->person_id.'" href = "/pages/voyages/crewlists/add.php?item='.$contact->person_id.'&type=crew" class = "btn btn-sm btn-outline-primary">crew</a>
Это не сработало. Я думаю, что мне нужно переместить скрипт из цикла foreach как потому, что он находится над таблицей, которую я хочу обновить, так и потому, что, вероятно, это плохая практика иметь таблицу, полную скриптов!
Можно по ссылке передать параметры и потом одним скриптом ссылку подцепить???
$(document).ready(function() {
$("#addCrewLink<?php echo $contact->person_id;?>").click(function(e) {
e.preventDefault();
var personID = '<?php echo $contact->person_id;?>';
var voyageID = '<?php echo Input::get('voyage'); ?>';
var passageID = '<?php echo Input::get('passage'); ?>';
var role = '<?php echo $contact->role;?>';
$.ajax({
type: "POST",
url: "/pages/voyages/crewlists/add.php",
dataType: 'json',
data:{ person: personID, embarkingAs: role, voyage: voyageID, passage: passageID },
'success': function(data) {
if (data['success']) {
//refresh the tables
$("#crewTable").load(location.href + " #crewTable");
//$("#passengerTable").load(location.href + " #passengerTable");
//send the user a success message
resetToastPosition();
$.toast({
heading: 'Success',
text: 'Waypoint added successfully',
textColor: 'white',
showHideTransition: 'slide',
hideAfter : 7000,
icon: 'success',
loaderBg: '#f96868',
position: 'top-center'
})
} else {
var i;
for (i = 0; i < data['message'].length; i++) {
//scroll to the top
window.scrollTo({ top: 0, behavior: 'smooth' });
this.error(this.xhr, data['message'][i]);
}
}
},
'error': function(jqXHR, textStatus, errorThrown) {
//send the user a fail message
resetToastPosition();
$.toast({
heading: 'Error',
text: textStatus,
textColor: 'white',
showHideTransition: 'slide',
hideAfter : 7000,
icon: 'error',
bgColor: '#f96868',
position: 'top-center',
loaderBg: '#405189'
})
}
})
});
});
Большое спасибо за всю помощь!
С уважением
Мэтт






Почти готово. Мое предложение состояло бы в том, чтобы внести следующие изменения:
add-crew-linkВ итоге что-то вроде:
<a class = "add-crew-link" data-id = "1" href = "..." class = "btn btn-sm btn-outline-primary">crew</a>
<a class = "add-crew-link" data-id = "2" href = "..." class = "btn btn-sm btn-outline-primary">crew</a>
<a class = "add-crew-link" data-id = "3" href = "..." class = "btn btn-sm btn-outline-primary">crew</a>
<a class = "add-crew-link" data-id = "4" href = "..." class = "btn btn-sm btn-outline-primary">crew</a>
Примечание: Добавьте дополнительные атрибуты data- по своему желанию. Например, data-name или data-age, или что-то еще.
Измените обработчик кликов, чтобы настроить таргетинг на все якоря add-crew-link:
$('.add-crew-link').click(function(e) {
Возьмите id и другие атрибуты данных, которые вам нужны, в начале функции обработчика кликов:
var personID = $(this).data('id');
И, конечно же, убедитесь, что функция больше не находится внутри цикла PHP.
Использование отдельного обработчика кликов для каждой ссылки не имеет особого смысла. Вы должны написать одну функцию, которая работает для всех этих ссылок. Начните с выбора их через класс вместо идентификатора. Отдельные данные, которые вам необходимо отправить в каждом случае, могут быть, например, помещены в настраиваемые атрибуты данных самих ссылок, чтобы ваш обработчик кликов мог прочитать их оттуда.