added feature to update inserted information, fixed bug that was inserting new rows after each refresh of the page and optimized get_customfield_values , it was sending many requests and optimized to 1.

This commit is contained in:
Lasha Kapanadze 2025-08-21 20:39:31 +04:00
parent 2c514a8ab6
commit 24cda34681
5 changed files with 363 additions and 112 deletions

View File

@ -1,5 +1,5 @@
<?php <?php
require_once dirname(__DIR__, 2) . '/vendor/autoload.php'; // Torna al livello di public require_once dirname(__DIR__, 2) . '/vendor/autoload.php';
require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php'; require_once dirname(__FILE__) . '/class/VisualLimsApiClient.class.php';
header('Content-Type: application/json'); header('Content-Type: application/json');
@ -9,20 +9,30 @@ error_reporting(E_ALL);
try { try {
$api = VisualLimsApiClient::getInstance(); $api = VisualLimsApiClient::getInstance();
// ID del campo custom passato da GET oppure default // მივიღოთ მრავლობითი field_ids
$customFieldId = isset($_GET['field_id']) && is_numeric($_GET['field_id']) ? intval($_GET['field_id']) : 156; $fieldIds = [];
if (isset($_GET['field_ids'])) {
$fieldIds = array_filter(array_map('intval', explode(',', $_GET['field_ids'])));
}
// Endpoint con $expand per ottenere i valori // თუ არ გადმოგვცეს -> ერთი default
$endpoint = "CustomField($customFieldId)?\$expand=CustomFieldsValues"; if (empty($fieldIds)) {
$fieldIds = [156];
}
// Recupera i dati dal server $results = [];
$data = $api->get($endpoint);
// Salva la risposta in un file per debug foreach ($fieldIds as $customFieldId) {
file_put_contents(__DIR__ . '/customfield_values_response.json', json_encode($data)); $endpoint = "CustomField($customFieldId)?\$expand=CustomFieldsValues";
$data = $api->get($endpoint);
// Output JSON al client $results[$customFieldId] = $data['CustomFieldsValues'] ?? [];
echo json_encode($data); }
// Debug ფაილი
file_put_contents(__DIR__ . '/customfield_values_response.json', json_encode($results));
echo json_encode($results);
} catch (Exception $e) { } catch (Exception $e) {
http_response_code(500); http_response_code(500);
echo json_encode([ echo json_encode([

View File

@ -19,11 +19,11 @@ if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['template_id']) || !i
exit; exit;
} }
$template_id = intval($_POST['template_id']); $template_id = intval($_POST['template_id']) ?? $_SESSION['template_id'];
$selected_rows = $_POST['selected_rows']; $selected_rows = $_POST['selected_rows'] ?? $_SESSION['selected_rows'];
$columns = json_decode($_POST['columns'], true); // Header dell'XLS $columns = json_decode($_POST['columns'], true) ?? $_SESSION['columns']; // Header dell'XLS
$rows = json_decode($_POST['rows'], true); // Dati dell'XLS $rows = json_decode($_POST['rows'], true) ?? $_SESSION['rows']; // Dati dell'XLS
$newFilename = htmlspecialchars($_POST['filename']); $newFilename = htmlspecialchars($_POST['filename']) ?? $_SESSION['filename'];
// Log dei dati ricevuti // Log dei dati ricevuti
error_log("Received Data - Template ID: $template_id, Selected Rows: " . json_encode($selected_rows)); error_log("Received Data - Template ID: $template_id, Selected Rows: " . json_encode($selected_rows));
@ -58,70 +58,72 @@ foreach ($allMappings as $mapping) {
} }
} }
// Inserisci le righe selezionate in datadb (solo campi generici con templateid) //// Inserisci le righe selezionate in datadb (solo campi generici con templateid)
$insertedIds = []; //$insertedIds = [];
foreach ($selected_rows as $rowIndex) { //foreach ($selected_rows as $rowIndex) {
$row = $rows[$rowIndex]; // $row = $rows[$rowIndex];
$values = [ // $values = [
$template_id, // templateid // $template_id, // templateid
$importReferenceCode, // importreferencecode // $importReferenceCode, // importreferencecode
$newFilename, // filename_import // $newFilename, // filename_import
'i', // status // 'i', // status
$user_id, // user_id // $user_id, // user_id
null, // limscode // null, // limscode
date('Y-m-d') // importdate // date('Y-m-d') // importdate
]; // ];
$sql = "INSERT INTO datadb (templateid, importreferencecode, filename_import, status, user_id, limscode, importdate) VALUES (?, ?, ?, ?, ?, ?, ?)"; // $sql = "INSERT INTO datadb (templateid, importreferencecode, filename_import, status, user_id, limscode, importdate) VALUES (?, ?, ?, ?, ?, ?, ?)";
$stmt = $pdo->prepare($sql); // $stmt = $pdo->prepare($sql);
$stmt->execute($values); // $stmt->execute($values);
//
// $iddatadb = $pdo->lastInsertId();
// $insertedIds[] = $iddatadb;
//
// // Inserisci tutti i campi (automatici e manuali) in import_data_details
// foreach ($allMappings as $mapping) {
// $fieldValue = null;
// if (!$mapping['is_manual']) { // Campi automatici dall'XLS
// $excelColumn = trim($mapping['excel_column']);
// $excelColumnIndex = array_search($excelColumn, array_map('trim', $columns));
// if ($excelColumnIndex !== false && isset($row[$excelColumnIndex]) && $row[$excelColumnIndex] !== '') {
// $fieldValue = $row[$excelColumnIndex];
// error_log("Found Excel column '$excelColumn' at index $excelColumnIndex, value: " . var_export($fieldValue, true));
// } else {
// $fieldValue = $mapping['manual_default'] ?? '';
// error_log("Excel column '$excelColumn' not found or empty, using default: " . var_export($fieldValue, true));
// }
// switch ($mapping['data_type']) {
// case 'INT':
// $fieldValue = is_numeric($fieldValue) ? (int)$fieldValue : ($mapping['manual_default'] ?? 0);
// break;
// case 'DATE':
// $fieldValue = !empty($fieldValue) ? date('Y-m-d', strtotime($fieldValue)) : ($mapping['manual_default'] === 'today' ? date('Y-m-d') : ($mapping['manual_default'] ?? ''));
// break;
// case 'CHAR':
// $fieldValue = !empty($fieldValue) ? substr((string)$fieldValue, 0, 1) : ($mapping['manual_default'] ?? '');
// break;
// case 'Testo':
// case 'VARCHAR':
// default:
// $fieldValue = !empty($fieldValue) ? htmlspecialchars((string)$fieldValue) : ($mapping['manual_default'] ?? '');
// break;
// }
// } else { // Campi manuali
// $fieldValue = $mapping['manual_default'] ?? '';
// if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today') {
// $fieldValue = date('Y-m-d');
// }
// }
// if ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) {
// error_log("Required field missing for mapping ID: " . $mapping['id'] . ", field: " . $mapping['field_label']);
// }
// error_log("Inserting into import_data_details - Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true) . ", Is Manual: " . $mapping['is_manual'] . ", Excel Column: " . ($mapping['excel_column'] ?? 'N/A') . ", Manual Default: " . ($mapping['manual_default'] ?? 'N/A'));
// $stmt = $pdo->prepare("INSERT INTO import_data_details (id, mapping_id, field_value) VALUES (?, ?, ?)");
// $stmt->execute([$iddatadb, $mapping['id'], $fieldValue]);
// error_log("Inserted into import_data_details for ID $iddatadb, Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true));
// }
//}
$iddatadb = $pdo->lastInsertId(); $insertedIds = $_POST['inserted_ids'] ?? $_SESSION['inserted_ids'];
$insertedIds[] = $iddatadb;
// Inserisci tutti i campi (automatici e manuali) in import_data_details
foreach ($allMappings as $mapping) {
$fieldValue = null;
if (!$mapping['is_manual']) { // Campi automatici dall'XLS
$excelColumn = trim($mapping['excel_column']);
$excelColumnIndex = array_search($excelColumn, array_map('trim', $columns));
if ($excelColumnIndex !== false && isset($row[$excelColumnIndex]) && $row[$excelColumnIndex] !== '') {
$fieldValue = $row[$excelColumnIndex];
error_log("Found Excel column '$excelColumn' at index $excelColumnIndex, value: " . var_export($fieldValue, true));
} else {
$fieldValue = $mapping['manual_default'] ?? '';
error_log("Excel column '$excelColumn' not found or empty, using default: " . var_export($fieldValue, true));
}
switch ($mapping['data_type']) {
case 'INT':
$fieldValue = is_numeric($fieldValue) ? (int)$fieldValue : ($mapping['manual_default'] ?? 0);
break;
case 'DATE':
$fieldValue = !empty($fieldValue) ? date('Y-m-d', strtotime($fieldValue)) : ($mapping['manual_default'] === 'today' ? date('Y-m-d') : ($mapping['manual_default'] ?? ''));
break;
case 'CHAR':
$fieldValue = !empty($fieldValue) ? substr((string)$fieldValue, 0, 1) : ($mapping['manual_default'] ?? '');
break;
case 'Testo':
case 'VARCHAR':
default:
$fieldValue = !empty($fieldValue) ? htmlspecialchars((string)$fieldValue) : ($mapping['manual_default'] ?? '');
break;
}
} else { // Campi manuali
$fieldValue = $mapping['manual_default'] ?? '';
if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today') {
$fieldValue = date('Y-m-d');
}
}
if ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) {
error_log("Required field missing for mapping ID: " . $mapping['id'] . ", field: " . $mapping['field_label']);
}
error_log("Inserting into import_data_details - Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true) . ", Is Manual: " . $mapping['is_manual'] . ", Excel Column: " . ($mapping['excel_column'] ?? 'N/A') . ", Manual Default: " . ($mapping['manual_default'] ?? 'N/A'));
$stmt = $pdo->prepare("INSERT INTO import_data_details (id, mapping_id, field_value) VALUES (?, ?, ?)");
$stmt->execute([$iddatadb, $mapping['id'], $fieldValue]);
error_log("Inserted into import_data_details for ID $iddatadb, Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true));
}
}
// Recupera i dati appena inseriti con i nomi degli utenti // Recupera i dati appena inseriti con i nomi degli utenti
$stmt = $pdo->prepare(" $stmt = $pdo->prepare("
@ -436,7 +438,7 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
<?php include('include/topbar.php'); ?> <?php include('include/topbar.php'); ?>
<div class="page-wrapper"> <div class="page-wrapper">
<div class="page-content"> <div class="page-content">
<?php //include('top_stat_widget.php'); <?php //include('top_stat_widget.php');
?> ?>
<div class="mb-3 text"> <div class="mb-3 text">
<a href="historical_trf.php?id=<?= $template_id ?>&status=i" class="btn btn-warning me-2">Imported (i)</a> <a href="historical_trf.php?id=<?= $template_id ?>&status=i" class="btn btn-warning me-2">Imported (i)</a>
@ -448,6 +450,9 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div> <div>
<h6 class="mb-0">Modifica Dati Importati</h6> <h6 class="mb-0">Modifica Dati Importati</h6>
<div id="unsavedChanges" style="display:none; color: red; font-weight: bold; margin:10px 0;">
⚠️ Unsaved changes detected! Please save before leaving this page.
</div>
</div> </div>
</div> </div>
</div> </div>
@ -731,6 +736,38 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
<script src="photos.js"></script> <script src="photos.js"></script>
<script src="parts.js"></script> <script src="parts.js"></script>
<script src="tracking.js"></script> <script src="tracking.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const inputs = document.querySelectorAll(".cell-input, .dropdown-select, .carrier-select, .awb-input");
const unsavedDiv = document.getElementById("unsavedChanges");
let hasChanges = false;
// როცა მნიშვნელობა შეიცვლება
inputs.forEach(el => {
el.addEventListener("change", () => {
hasChanges = true;
unsavedDiv.style.display = "block";
});
});
// როცა save ღილაკს დააჭერს
document.querySelectorAll(".save-btn").forEach(btn => {
btn.addEventListener("click", () => {
hasChanges = false;
unsavedDiv.style.display = "none";
});
});
// სურვილისამებრ: გაფრთხილება გვერდიდან გასვლისას
window.addEventListener("beforeunload", function (e) {
if (hasChanges) {
e.preventDefault();
e.returnValue = "";
}
});
});
</script>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
const inputs = document.querySelectorAll('.cell-input'); const inputs = document.querySelectorAll('.cell-input');
@ -757,6 +794,7 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
formData.append(name, input.value); formData.append(name, input.value);
}); });
formData.append('iddatadb', iddatadb); formData.append('iddatadb', iddatadb);
formData.append('mapping', JSON.stringify(<?= json_encode($allMappings) ?>));
fetch('save_edited_row.php', { fetch('save_edited_row.php', {
method: 'POST', method: 'POST',
@ -772,6 +810,7 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
cell.classList.add('flash-success'); cell.classList.add('flash-success');
}); });
setTimeout(() => cells.forEach(cell => cell.classList.remove('flash-success')), 500); setTimeout(() => cells.forEach(cell => cell.classList.remove('flash-success')), 500);
alert('Salvataggio avvenuto con successo!');
} else { } else {
alert('Errore durante il salvataggio: ' + data.message); alert('Errore durante il salvataggio: ' + data.message);
} }
@ -858,23 +897,32 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
if (dropdowns.length === 0) return; if (dropdowns.length === 0) return;
// Recupera i dati solo per i field_id univoci // Recupera i dati solo per i field_id univoci
const uniqueFieldIds = [...new Set(Array.from(dropdowns).map(d => d.getAttribute('data-field-id')))].filter(fieldId => fieldId); const uniqueFieldIds = [
for (const fieldId of uniqueFieldIds) { ...new Set(Array.from(dropdowns).map(d => d.getAttribute('data-field-id')))
if (!dropdownData[fieldId]) { ].filter(fieldId => fieldId);
try {
const response = await fetch(`get_customfield_values.php?field_id=${fieldId}`); const missingFieldIds = uniqueFieldIds.filter(fieldId => !dropdownData[fieldId]);
const data = await response.json();
if (data.error) { if (missingFieldIds.length > 0) {
console.error('Errore per field_id', fieldId, ':', data.error); try {
continue; const response = await fetch(
`get_customfield_values.php?field_ids=${missingFieldIds.join(",")}`
);
const data = await response.json();
if (data.error) {
console.error("Errore fetch multiplo:", data.error);
} else {
for (const fieldId of Object.keys(data)) {
dropdownData[fieldId] = data[fieldId] || [];
} }
dropdownData[fieldId] = data.CustomFieldsValues || [];
} catch (error) {
console.error('Errore nel fetch per field_id', fieldId, ':', error);
} }
} catch (error) {
console.error("Errore generale nel fetch multiplo:", error);
} }
} }
// Popola tutti i dropdown con i dati recuperati // Popola tutti i dropdown con i dati recuperati
dropdowns.forEach(dropdown => { dropdowns.forEach(dropdown => {
const fieldId = dropdown.getAttribute('data-field-id'); const fieldId = dropdown.getAttribute('data-field-id');
@ -1066,4 +1114,4 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
</script> --> </script> -->
</body> </body>
</html> </html>

View File

@ -0,0 +1,157 @@
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/import_debug.log');
if (!file_exists(__DIR__ . '/import_debug.log')) {
file_put_contents(__DIR__ . '/import_debug.log', "Inizio importazione alle " . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
}
// Log iniziale
error_log("Inizio importazione alle " . date('Y-m-d H:i:s'));
include('include/headscript.php');
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['template_id']) || !isset($_POST['selected_rows']) || !isset($_POST['filename'])) {
header("Location: xlstemplates_grid.php?status=error&message=" . urlencode("Richiesta non valida"));
exit;
}
$template_id = intval($_POST['template_id']);
$selected_rows = $_POST['selected_rows'];
$columns = json_decode($_POST['columns'], true); // Header dell'XLS
$rows = json_decode($_POST['rows'], true); // Dati dell'XLS
$newFilename = htmlspecialchars($_POST['filename']);
$_SESSION['template_id'] = $template_id;
$_SESSION['selected_rows'] = $selected_rows;
$_SESSION['columns'] = $columns;
$_SESSION['rows'] = $rows;
$_SESSION['filename'] = $newFilename;
error_log("Received Data - Template ID: $template_id, Selected Rows: " . json_encode($selected_rows));
error_log("Columns: " . json_encode($columns));
error_log("Rows: " . json_encode($rows));
$user_id = $iduserlogin ?? 1; // Default a 1 se non definito
$db = DBHandlerSelect::getInstance();
$pdo = $db->getConnection();
// Genera un UUID univoco per importreferencecode
$importReferenceCode = date('YmdHis') . '-' . uniqid();
// Recupera tutti i mapping dal template
$stmt = $pdo->prepare("SELECT id, excel_column, data_type, is_required, manual_default, is_manual, field_label, field_id, main_field FROM template_mapping WHERE template_id = ?");
$stmt->execute([$template_id]);
$allMappings = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (empty($allMappings)) {
header("Location: import_xls.php?id=$template_id&status=error&message=" . urlencode("Nessun mapping trovato per il template"));
exit;
}
// Trova il campo main_field
$mainFieldMapping = null;
foreach ($allMappings as $mapping) {
if ($mapping['main_field'] == 1) {
$mainFieldMapping = $mapping;
break;
}
}
// Inserisci le righe selezionate in datadb (solo campi generici con templateid)
$insertedIds = [];
foreach ($selected_rows as $rowIndex) {
$row = $rows[$rowIndex];
$values = [
$template_id, // templateid
$importReferenceCode, // importreferencecode
$newFilename, // filename_import
'i', // status
$user_id, // user_id
null, // limscode
date('Y-m-d') // importdate
];
$sql = "INSERT INTO datadb (templateid, importreferencecode, filename_import, status, user_id, limscode, importdate) VALUES (?, ?, ?, ?, ?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute($values);
$iddatadb = $pdo->lastInsertId();
$insertedIds[] = $iddatadb;
// Inserisci tutti i campi (automatici e manuali) in import_data_details
foreach ($allMappings as $mapping) {
$fieldValue = null;
if (!$mapping['is_manual']) { // Campi automatici dall'XLS
$excelColumn = trim($mapping['excel_column']);
$excelColumnIndex = array_search($excelColumn, array_map('trim', $columns));
if ($excelColumnIndex !== false && isset($row[$excelColumnIndex]) && $row[$excelColumnIndex] !== '') {
$fieldValue = $row[$excelColumnIndex];
error_log("Found Excel column '$excelColumn' at index $excelColumnIndex, value: " . var_export($fieldValue, true));
} else {
$fieldValue = $mapping['manual_default'] ?? '';
error_log("Excel column '$excelColumn' not found or empty, using default: " . var_export($fieldValue, true));
}
switch ($mapping['data_type']) {
case 'INT':
$fieldValue = is_numeric($fieldValue) ? (int)$fieldValue : ($mapping['manual_default'] ?? 0);
break;
case 'DATE':
$fieldValue = !empty($fieldValue) ? date('Y-m-d', strtotime($fieldValue)) : ($mapping['manual_default'] === 'today' ? date('Y-m-d') : ($mapping['manual_default'] ?? ''));
break;
case 'CHAR':
$fieldValue = !empty($fieldValue) ? substr((string)$fieldValue, 0, 1) : ($mapping['manual_default'] ?? '');
break;
case 'Testo':
case 'VARCHAR':
default:
$fieldValue = !empty($fieldValue) ? htmlspecialchars((string)$fieldValue) : ($mapping['manual_default'] ?? '');
break;
}
} else { // Campi manuali
$fieldValue = $mapping['manual_default'] ?? '';
if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today') {
$fieldValue = date('Y-m-d');
}
}
if ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) {
error_log("Required field missing for mapping ID: " . $mapping['id'] . ", field: " . $mapping['field_label']);
}
error_log("Inserting into import_data_details - Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true) . ", Is Manual: " . $mapping['is_manual'] . ", Excel Column: " . ($mapping['excel_column'] ?? 'N/A') . ", Manual Default: " . ($mapping['manual_default'] ?? 'N/A'));
$stmt = $pdo->prepare("INSERT INTO import_data_details (id, mapping_id, field_value) VALUES (?, ?, ?)");
$stmt->execute([$iddatadb, $mapping['id'], $fieldValue]);
error_log("Inserted into import_data_details for ID $iddatadb, Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true));
}
}
$_SESSION['inserted_ids'] = $insertedIds;
$params = [
'template_id' => $template_id,
'filename' => $newFilename,
];
?>
<form id="redirectForm" action="import_edit2.php" method="post">
<input type="hidden" name="template_id" value="<?= htmlspecialchars($template_id) ?>">
<input type="hidden" name="filename" value="<?= htmlspecialchars($newFilename) ?>">
<?php foreach ($selected_rows as $row): ?>
<input type="hidden" name="selected_rows[]" value="<?= htmlspecialchars($row) ?>">
<?php endforeach; ?>
<?php foreach ($insertedIds as $id): ?>
<input type="hidden" name="inserted_ids[]" value="<?= htmlspecialchars($id) ?>">
<?php endforeach; ?>
<input type="hidden" name="columns" value='<?= json_encode($columns) ?>'>
<input type="hidden" name="rows" value='<?= json_encode($rows) ?>'>
</form>
<script>
document.getElementById('redirectForm').submit();
</script>
<?php
exit;

View File

@ -164,12 +164,12 @@ error_log("Loaded template: " . print_r($template, true));
<!--end wrapper--> <!--end wrapper-->
<!-- search modal --> <!-- search modal -->
<?php //include('include/searchmodal.php'); <?php //include('include/searchmodal.php');
?> ?>
<!-- end search modal --> <!-- end search modal -->
<!--start switcher--> <!--start switcher-->
<?php //include('include/themeswitcher.php'); <?php //include('include/themeswitcher.php');
?> ?>
<!--end switcher--> <!--end switcher-->
<?php include('jsinclude.php'); ?> <?php include('jsinclude.php'); ?>
@ -205,7 +205,7 @@ error_log("Loaded template: " . print_r($template, true));
errorContainer.style.display = 'block'; errorContainer.style.display = 'block';
} else { } else {
let html = ` let html = `
<form id="selectRowsForm" action="import_edit2.php" method="POST"> <form id="selectRowsForm" action="import_insert.php" method="POST">
<input type="hidden" name="template_id" value="${data.template_id}"> <input type="hidden" name="template_id" value="${data.template_id}">
<input type="hidden" name="columns" value='${JSON.stringify(data.columns)}'> <input type="hidden" name="columns" value='${JSON.stringify(data.columns)}'>
<input type="hidden" name="rows" value='${JSON.stringify(data.rows)}'> <input type="hidden" name="rows" value='${JSON.stringify(data.rows)}'>
@ -326,4 +326,4 @@ error_log("Loaded template: " . print_r($template, true));
</script> </script>
</body> </body>
</html> </html>

View File

@ -14,28 +14,64 @@ try {
$db = DBHandlerSelect::getInstance(); $db = DBHandlerSelect::getInstance();
$pdo = $db->getConnection(); $pdo = $db->getConnection();
// Prepara i dati da aggiornare $data = $_POST;
$updates = []; $details = [];
$values = [];
foreach ($_POST as $key => $value) { // 1. POST-დან ამოვიღოთ მხოლოდ details
if ($key !== 'iddatadb') { foreach ($data as $key => $value) {
$updates[] = "$key = ?"; if (preg_match('/^details(\d+)field_value$/', $key, $matches)) {
$values[] = htmlspecialchars($value); $id = $matches[1];
$details[$id] = $value;
} }
} }
$values[] = $iddatadb;
if (empty($updates)) { // 2. DB-დან წამოვიღოთ არსებული მნიშვნელობები
throw new Exception('Nessun dato da aggiornare'); $stmt = $pdo->prepare("SELECT mapping_id, field_value FROM import_data_details WHERE id = ?");
$stmt->execute([$iddatadb]);
$currentValues = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$currentValues[$row['mapping_id']] = $row['field_value'];
} }
$sql = "UPDATE datadb SET " . implode(', ', $updates) . " WHERE iddatadb = ?"; // 3. შევადაროთ POST-ს და DB-ს
$stmt = $pdo->prepare($sql); $changed = [];
$stmt->execute($values); foreach ($details as $id => $newValue) {
$oldValue = $currentValues[$id] ?? null;
if ($oldValue !== $newValue) {
$changed[$id] = [
'old' => $oldValue,
'new' => $newValue
];
}
}
// 4. თუ არის ცვლილებები → UPDATE
if (!empty($changed)) {
$updateStmt = $pdo->prepare("
UPDATE import_data_details
SET field_value = :newValue
WHERE id = :iddatadb AND mapping_id = :mappingId
");
foreach ($changed as $mappingId => $values) {
$updateStmt->execute([
':newValue' => $values['new'],
':iddatadb' => $iddatadb,
':mappingId' => $mappingId
]);
}
$response['success'] = true;
$response['message'] = "Updated successfully";
$response['changed'] = $changed; // Debug / optional
} else {
$response['success'] = true;
$response['message'] = "No changes found";
}
$response['success'] = true;
$response['message'] = 'Riga aggiornata con successo';
} catch (Exception $e) { } catch (Exception $e) {
$response['success'] = false;
$response['message'] = $e->getMessage(); $response['message'] = $e->getMessage();
error_log("Errore in save_edited_row.php: " . $e->getMessage()); error_log("Errore in save_edited_row.php: " . $e->getMessage());
} }