$row) { $line_number = $index + 1; $filename = $row[0] ?? ''; $link = $row[1] ?? ''; $result = $dynamic_qrcode_instance->addQrcodeBatchRow($filename, $link, $id_owner); if ($result['ok']) { $successes[] = $filename; $created_ids[] = $result['id']; } else { $failures[] = ['line' => $line_number, 'filename' => $filename, 'error' => $result['error']]; } } $zip_filename = null; if (!empty($created_ids)) { $db = getDbInstance(); $files = []; foreach ($created_ids as $id) { $db->where('id', $id); $row = $db->getOne('dynamic_qrcodes'); if ($row !== null) { $files[] = SAVED_QRCODE_DIRECTORY . $row['qrcode']; } } $zip_filename = 'qrcodes_' . uniqid() . '.zip'; $zip_path = SAVED_QRCODE_DIRECTORY . 'zip/' . $zip_filename; @unlink($zip_path); $zip = new ZipArchive(); $zip->open($zip_path, ZipArchive::CREATE); foreach ($files as $file) { $content = @file_get_contents($file); if ($content !== false) { $zip->addFromString(basename($file), $content); } } $zip->close(); $_SESSION['generated_zips'][] = $zip_filename; audit_log('batch_qrcode_created', 'dynamic_qrcodes', implode(',', $created_ids)); } $results = [ 'successes' => $successes, 'failures' => $failures, 'zip_filename' => $zip_filename, ]; } ?>