Files
manjapro_v6/pages/pesan_promo.php
T
2026-08-20 18:39:37 +07:00

1220 lines
74 KiB
PHP

<?php
/*
|--------------------------------------------------------------------------
| Konfigurasi Upload Gambar Promo
|--------------------------------------------------------------------------
*/
$uploadDirectory = "uploads/promo/";
$allowedExtensions = array("jpg", "jpeg", "png", "webp");
$maximumFileSize = 5 * 1024 * 1024; // 5 MB
if (!is_dir($uploadDirectory)) {
mkdir($uploadDirectory, 0755, true);
}
/*
|--------------------------------------------------------------------------
| Fungsi Upload Gambar
|--------------------------------------------------------------------------
*/
function uploadGambarPromo(
$file,
$uploadDirectory,
$allowedExtensions,
$maximumFileSize,
&$errorMessage
) {
$errorMessage = "";
if (
!isset($file) ||
!isset($file["error"]) ||
$file["error"] === UPLOAD_ERR_NO_FILE
) {
return null;
}
if ($file["error"] !== UPLOAD_ERR_OK) {
$errorMessage = "Terjadi kesalahan saat mengunggah gambar.";
return false;
}
if ($file["size"] > $maximumFileSize) {
$errorMessage = "Ukuran gambar maksimal 5 MB.";
return false;
}
$originalName = basename($file["name"]);
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if (!in_array($extension, $allowedExtensions, true)) {
$errorMessage = "Format gambar harus JPG, JPEG, PNG, atau WEBP.";
return false;
}
/*
* Validasi bahwa file benar-benar gambar.
*/
$imageInfo = @getimagesize($file["tmp_name"]);
if ($imageInfo === false) {
$errorMessage = "File yang dipilih bukan gambar yang valid.";
return false;
}
$newFileName = "promo_" . date("YmdHis") . "_" . uniqid() . "." . $extension;
$destination = rtrim($uploadDirectory, "/") . "/" . $newFileName;
if (!move_uploaded_file($file["tmp_name"], $destination)) {
$errorMessage = "Gambar gagal disimpan ke server.";
return false;
}
return $newFileName;
}
/*
|--------------------------------------------------------------------------
| Proses Tambah Data
|--------------------------------------------------------------------------
*/
if (isset($_POST["tambah"])) {
$idDataServer = trim($_POST["id_data_server"] ?? "");
$nama = trim($_POST["nama"] ?? "");
$deskripsi = trim($_POST["deskripsi"] ?? "");
$sendOn = trim($_POST["send_on"] ?? "");
$tanggalMulai = trim($_POST["tanggal_mulai"] ?? "");
$tanggalAkhir = trim($_POST["tanggal_akhir"] ?? "");
$status = trim($_POST["status"] ?? "");
$tanggalMulai = !empty($tanggalMulai)
? date("Y-m-d H:i:s", strtotime($tanggalMulai))
: null;
$tanggalAkhir = !empty($tanggalAkhir)
? date("Y-m-d H:i:s", strtotime($tanggalAkhir))
: null;
$uploadError = "";
$gambar = uploadGambarPromo(
$_FILES["gambar"] ?? null,
$uploadDirectory,
$allowedExtensions,
$maximumFileSize,
$uploadError
);
if ($gambar === false) {
sweetAlert($uploadError, "error");
} elseif (empty($nama)) {
sweetAlert("Nama promo wajib diisi", "error");
} else {
$queryTambah = mysqli_prepare(
$con,
"INSERT INTO master_promo (
id_data_server,
nama,
deskripsi,
gambar,
send_on,
tanggal_mulai,
tanggal_akhir,
status
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
);
mysqli_stmt_bind_param(
$queryTambah,
"ssssssss",
$idDataServer,
$nama,
$deskripsi,
$gambar,
$sendOn,
$tanggalMulai,
$tanggalAkhir,
$status
);
if (mysqli_stmt_execute($queryTambah)) {
sweetAlert("Data promo telah ditambahkan", "success");
} else {
/*
* Hapus gambar apabila penyimpanan database gagal.
*/
if (!empty($gambar)) {
$gambarPath = $uploadDirectory . $gambar;
if (file_exists($gambarPath)) {
unlink($gambarPath);
}
}
sweetAlert("Data promo gagal ditambahkan", "error");
}
mysqli_stmt_close($queryTambah);
}
}
/*
|--------------------------------------------------------------------------
| Proses Edit Data
|--------------------------------------------------------------------------
*/
if (isset($_POST["edit_promo"])) {
$idPromo = (int) ($_POST["id_promo"] ?? 0);
$idDataServer = trim($_POST["id_data_server"] ?? "");
$nama = trim($_POST["nama"] ?? "");
$deskripsi = trim($_POST["deskripsi"] ?? "");
$sendOn = trim($_POST["send_on"] ?? "");
$tanggalMulai = trim($_POST["tanggal_mulai"] ?? "");
$tanggalAkhir = trim($_POST["tanggal_akhir"] ?? "");
$status = trim($_POST["status"] ?? "");
$gambarLama = basename($_POST["gambar_lama"] ?? "");
$tanggalMulai = !empty($tanggalMulai)
? date("Y-m-d H:i:s", strtotime($tanggalMulai))
: null;
$tanggalAkhir = !empty($tanggalAkhir)
? date("Y-m-d H:i:s", strtotime($tanggalAkhir))
: null;
$uploadError = "";
$gambarBaru = uploadGambarPromo(
$_FILES["gambar"] ?? null,
$uploadDirectory,
$allowedExtensions,
$maximumFileSize,
$uploadError
);
if ($gambarBaru === false) {
sweetAlert($uploadError, "error");
} elseif ($idPromo <= 0) {
sweetAlert("ID promo tidak valid", "error");
} elseif (empty($nama)) {
sweetAlert("Nama promo wajib diisi", "error");
} else {
/*
* Jika pengguna tidak memilih gambar baru,
* gunakan gambar lama.
*/
$gambarUntukDatabase = !empty($gambarBaru)
? $gambarBaru
: $gambarLama;
$queryEdit = mysqli_prepare(
$con,
"UPDATE master_promo SET
id_data_server = ?,
nama = ?,
deskripsi = ?,
gambar = ?,
send_on = ?,
tanggal_mulai = ?,
tanggal_akhir = ?,
status = ?
WHERE id = ?"
);
mysqli_stmt_bind_param(
$queryEdit,
"ssssssssi",
$idDataServer,
$nama,
$deskripsi,
$gambarUntukDatabase,
$sendOn,
$tanggalMulai,
$tanggalAkhir,
$status,
$idPromo
);
if (mysqli_stmt_execute($queryEdit)) {
/*
* Setelah data berhasil diperbarui,
* hapus gambar lama apabila ada gambar baru.
*/
if (
!empty($gambarBaru) &&
!empty($gambarLama) &&
$gambarLama !== $gambarBaru
) {
$oldImagePath = $uploadDirectory . $gambarLama;
if (file_exists($oldImagePath)) {
unlink($oldImagePath);
}
}
sweetAlert("Data promo telah diubah", "success");
} else {
/*
* Jika update database gagal,
* hapus gambar baru agar tidak menjadi file sampah.
*/
if (!empty($gambarBaru)) {
$newImagePath = $uploadDirectory . $gambarBaru;
if (file_exists($newImagePath)) {
unlink($newImagePath);
}
}
sweetAlert("Data promo gagal diubah", "error");
}
mysqli_stmt_close($queryEdit);
}
}
/*
|--------------------------------------------------------------------------
| Proses Hapus Data
|--------------------------------------------------------------------------
*/
if (isset($_POST["hapus_promo"])) {
$idPromo = (int) ($_POST["id_promo"] ?? 0);
if ($idPromo > 0) {
/*
* Ambil nama gambar sebelum data dihapus.
*/
$queryGambar = mysqli_prepare(
$con,
"SELECT gambar FROM master_promo WHERE id = ? LIMIT 1"
);
mysqli_stmt_bind_param($queryGambar, "i", $idPromo);
mysqli_stmt_execute($queryGambar);
$resultGambar = mysqli_stmt_get_result($queryGambar);
$dataGambar = mysqli_fetch_assoc($resultGambar);
$namaGambar = basename($dataGambar["gambar"] ?? "");
mysqli_stmt_close($queryGambar);
/*
* Menggunakan fungsi deleteAlert bawaan aplikasi.
* Fungsi ini diasumsikan menangani konfirmasi dan penghapusan data.
*/
deleteAlert("master_promo", $idPromo);
/*
* Apabila deleteAlert langsung menghapus data,
* gambar akan diperiksa dan dihapus setelah record tidak ditemukan.
*/
$queryCek = mysqli_prepare(
$con,
"SELECT id FROM master_promo WHERE id = ? LIMIT 1"
);
mysqli_stmt_bind_param($queryCek, "i", $idPromo);
mysqli_stmt_execute($queryCek);
$resultCek = mysqli_stmt_get_result($queryCek);
$dataMasihAda = mysqli_fetch_assoc($resultCek);
mysqli_stmt_close($queryCek);
if (!$dataMasihAda && !empty($namaGambar)) {
$gambarPath = $uploadDirectory . $namaGambar;
if (file_exists($gambarPath)) {
unlink($gambarPath);
}
}
}
}
?>
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<div class="row">
<div class="col-sm-6">
<h3 class="card-title">Daftar Pesan Promo</h3>
</div>
<div class="col-sm-6">
<ol class="float-sm-right mb-0">
<a
type="button"
class="btn btn-danger btn-sm"
data-toggle="modal"
data-target="#modalTambahPromo"
>
Tambah
</a>
</ol>
</div>
</div>
</div>
<!-- Modal Tambah Promo -->
<div
class="modal fade"
id="modalTambahPromo"
data-backdrop="static"
data-keyboard="false"
tabindex="-1"
aria-labelledby="modalTambahPromoLabel"
aria-hidden="true"
>
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form method="post" enctype="multipart/form-data">
<div class="modal-header bg-primary">
<h5
class="modal-title"
id="modalTambahPromoLabel"
>
Tambah Pesan Promo
</h5>
<button
type="button"
class="close"
data-dismiss="modal"
aria-label="Close"
>
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="row">
<div class="card-body pb-0">
<div class="form-group">
<label>Nama Server</label>
<select
class="form-control"
name="id_data_server"
required
>
<option value="">
-- Pilih Server --
</option>
<?php
$List = new Listdata();
$List->set_list(
"data_server",
$SqlDataWH
);
foreach (
$List->get_list()
as $key => $value
):
?>
<option
value="<?php
echo htmlspecialchars(
$value["id"],
ENT_QUOTES,
"UTF-8"
);
?>"
>
<?php
echo htmlspecialchars(
$value["nama_server"],
ENT_QUOTES,
"UTF-8"
);
?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="form-group">
<label>Nama Promo</label>
<input
type="text"
class="form-control"
name="nama"
placeholder="Masukkan nama promo"
required
>
</div>
<div class="form-group">
<label>Gambar Promo</label>
<div class="custom-file">
<input
type="file"
class="custom-file-input"
id="gambarTambah"
name="gambar"
accept=".jpg,.jpeg,.png,.webp"
>
<label
class="custom-file-label"
for="gambarTambah"
>
Pilih gambar
</label>
</div>
<small class="text-muted">
Format JPG, JPEG, PNG,
atau WEBP. Maksimal 5 MB.
</small>
</div>
<div class="form-group">
<label>Pesan</label>
<textarea
class="form-control"
name="deskripsi"
rows="4"
placeholder="Masukkan deskripsi pesan promo"
></textarea>
</div>
<div class="form-group">
<label>Kirim Saat Setelah</label>
<select
class="form-control"
name="master_template_pesan"
required
>
<option value="">
-- Pilih Server --
</option>
<?php
$List = new Listdata();
$List->set_list(
"master_template_pesan", ' GROUP BY nama'
);
foreach (
$List->get_list()
as $key => $value
):
?>
<option value="<?= $value['nama'] ?>">
<?= $value['nama'] ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label>
Tanggal Mulai
</label>
<input
type="datetime-local"
class="form-control"
name="tanggal_mulai"
>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label>
Tanggal Akhir
</label>
<input
type="datetime-local"
class="form-control"
name="tanggal_akhir"
>
</div>
</div>
</div>
<div class="form-group">
<label>Status</label>
<select
class="form-control"
name="status"
required
>
<option value="Aktif">
Aktif
</option>
<option value="Nonaktif">
Nonaktif
</option>
</select>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-secondary"
data-dismiss="modal"
>
Close
</button>
<input
type="submit"
name="tambah"
class="btn btn-primary"
value="Tambah"
>
</div>
</form>
</div>
</div>
</div>
<!-- END Modal Tambah Promo -->
<div class="card-body">
<div class="table-responsive">
<table
id="example1"
class="table table-bordered table-striped"
>
<thead>
<tr>
<th>Nama Server</th>
<th>Nama Promo</th>
<th>Gambar</th>
<th>Pesan</th>
<th>Kirim Setelah</th>
<th>Tanggal Mulai</th>
<th>Tanggal Akhir</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<?php
/*
* Menggunakan kondisi server yang sudah
* tersedia pada aplikasi.
*/
$queryPromo = "
SELECT *
FROM master_promo
$SqlDataWHId
ORDER BY id DESC
";
$resultPromo = mysqli_query(
$con,
$queryPromo
);
while (
$promo = mysqli_fetch_assoc($resultPromo)
) {
$idPromo = (int) $promo["id"];
/*
* Ambil nama server berdasarkan
* id_data_server.
*/
$namaServer = "-";
if (!empty($promo["id_data_server"])) {
$queryServer = mysqli_prepare(
$con,
"SELECT nama_server
FROM data_server
WHERE id = ?
LIMIT 1"
);
mysqli_stmt_bind_param(
$queryServer,
"s",
$promo["id_data_server"]
);
mysqli_stmt_execute($queryServer);
$resultServer =
mysqli_stmt_get_result(
$queryServer
);
$server =
mysqli_fetch_assoc(
$resultServer
);
if (!empty($server["nama_server"])) {
$namaServer =
$server["nama_server"];
}
mysqli_stmt_close($queryServer);
}
$tanggalMulaiForm = !empty(
$promo["tanggal_mulai"]
)
? date(
"Y-m-d\TH:i",
strtotime(
$promo["tanggal_mulai"]
)
)
: "";
$tanggalAkhirForm = !empty(
$promo["tanggal_akhir"]
)
? date(
"Y-m-d\TH:i",
strtotime(
$promo["tanggal_akhir"]
)
)
: "";
?>
<tr>
<td>
<?php
echo htmlspecialchars(
$namaServer,
ENT_QUOTES,
"UTF-8"
);
?>
</td>
<td>
<?php
echo htmlspecialchars(
$promo["nama"] ?? "-",
ENT_QUOTES,
"UTF-8"
);
?>
</td>
<td class="text-center">
<?php
$namaGambar = basename(
$promo["gambar"] ?? ""
);
$gambarPath =
$uploadDirectory .
$namaGambar;
if (
!empty($namaGambar) &&
file_exists($gambarPath)
) {
?>
<a
href="<?php
echo htmlspecialchars(
$gambarPath,
ENT_QUOTES,
"UTF-8"
);
?>"
target="_blank"
>
<img
src="<?php
echo htmlspecialchars(
$gambarPath,
ENT_QUOTES,
"UTF-8"
);
?>"
alt="Gambar promo"
class="img-thumbnail"
style="
width: 80px;
height: 60px;
object-fit: cover;
"
>
</a>
<?php } else { ?>
<span
class="badge badge-secondary"
>
Tidak ada
</span>
<?php } ?>
</td>
<td style="min-width: 220px;">
<?php
$deskripsi =
$promo["deskripsi"] ?? "";
echo !empty($deskripsi)
? nl2br(
htmlspecialchars(
$deskripsi,
ENT_QUOTES,
"UTF-8"
)
)
: "-";
?>
</td>
<td>
<?php
echo htmlspecialchars(
$promo["send_on"] ?? "-",
ENT_QUOTES,
"UTF-8"
);
?>
</td>
<td>
<?php
echo !empty(
$promo["tanggal_mulai"]
)
? date(
"d-m-Y H:i",
strtotime(
$promo[
"tanggal_mulai"
]
)
)
: "-";
?>
</td>
<td>
<?php
echo !empty(
$promo["tanggal_akhir"]
)
? date(
"d-m-Y H:i",
strtotime(
$promo[
"tanggal_akhir"
]
)
)
: "-";
?>
</td>
<td>
<?php
$statusPromo =
strtolower(
$promo["status"] ?? ""
);
if ($statusPromo === "aktif") {
?>
<span
class="badge badge-success"
>
Aktif
</span>
<?php } else { ?>
<span
class="badge badge-secondary"
>
<?php
echo htmlspecialchars(
$promo["status"]
?: "Nonaktif",
ENT_QUOTES,
"UTF-8"
);
?>
</span>
<?php } ?>
</td>
<td style="white-space: nowrap;">
<a
type="button"
class="btn btn-secondary btn-sm ml-1"
data-toggle="modal"
data-target="#modalEditPromo<?php
echo $idPromo;
?>"
>
Edit
</a>
<form
method="post"
class="d-inline"
onsubmit="return confirm('Yakin ingin menghapus promo ini?');"
>
<input
type="hidden"
name="id_promo"
value="<?php
echo $idPromo;
?>"
>
<button
type="submit"
name="hapus_promo"
class="btn btn-danger btn-sm ml-1"
>
Hapus
</button>
</form>
</td>
</tr>
<!-- Modal Edit Promo -->
<div
class="modal fade"
id="modalEditPromo<?php
echo $idPromo;
?>"
data-backdrop="static"
data-keyboard="false"
tabindex="-1"
aria-labelledby="modalEditPromoLabel<?php
echo $idPromo;
?>"
aria-hidden="true"
>
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form
method="post"
enctype="multipart/form-data"
>
<input
type="hidden"
name="id_promo"
value="<?php
echo $idPromo;
?>"
>
<input
type="hidden"
name="gambar_lama"
value="<?php
echo htmlspecialchars(
$namaGambar,
ENT_QUOTES,
"UTF-8"
);
?>"
>
<div
class="modal-header bg-secondary"
>
<h5
class="modal-title"
id="modalEditPromoLabel<?php
echo $idPromo;
?>"
>
Edit Pesan Promo
</h5>
<button
type="button"
class="close"
data-dismiss="modal"
aria-label="Close"
>
<span
aria-hidden="true"
>
&times;
</span>
</button>
</div>
<div class="modal-body">
<div class="row">
<div
class="card-body pb-0"
>
<div
class="form-group"
>
<label>
Nama Server
</label>
<select
class="form-control"
name="id_data_server"
required
>
<option
value=""
>
-- Pilih Server --
</option>
<?php
$ListEdit =
new Listdata();
$ListEdit->set_list(
"data_server",
$SqlDataWH
);
foreach (
$ListEdit->get_list()
as $key =>
$value
):
$selected =
(
(string) $value[
"id"
] ===
(string) $promo[
"id_data_server"
]
)
? "selected"
: "";
?>
<option
value="<?php
echo htmlspecialchars(
$value[
"id"
],
ENT_QUOTES,
"UTF-8"
);
?>"
<?php
echo $selected;
?>
>
<?php
echo htmlspecialchars(
$value[
"nama_server"
],
ENT_QUOTES,
"UTF-8"
);
?>
</option>
<?php
endforeach;
?>
</select>
</div>
<div
class="form-group"
>
<label>
Pesan
</label>
<textarea
class="form-control"
name="deskripsi"
rows="4"
><?php
echo htmlspecialchars(
$promo[
"deskripsi"
] ?? "",
ENT_QUOTES,
"UTF-8"
);
?></textarea>
</div>
<div
class="form-group"
>
<label>
Gambar Promo
</label>
<?php
if (
!empty(
$namaGambar
) &&
file_exists(
$gambarPath
)
) {
?>
<div
class="mb-2"
>
<img
src="<?php
echo htmlspecialchars(
$gambarPath,
ENT_QUOTES,
"UTF-8"
);
?>"
alt="Gambar promo"
class="img-thumbnail"
style="
width: 150px;
height: 100px;
object-fit: cover;
"
>
</div>
<?php } ?>
<div
class="custom-file"
>
<input
type="file"
class="custom-file-input"
id="gambarEdit<?php
echo $idPromo;
?>"
name="gambar"
accept=".jpg,.jpeg,.png,.webp"
>
<label
class="custom-file-label"
for="gambarEdit<?php
echo $idPromo;
?>"
>
Pilih gambar baru
</label>
</div>
<small
class="text-muted"
>
Kosongkan jika gambar
tidak ingin diganti.
</small>
</div>
<div
class="form-group"
>
<label>
Nama Promo
</label>
<input
type="text"
class="form-control"
name="nama"
value="<?php
echo htmlspecialchars(
$promo[
"nama"
] ?? "",
ENT_QUOTES,
"UTF-8"
);
?>"
required
>
</div>
<div class="form-group">
<label>Kirim Saat Setelah</label>
<select
class="form-control"
name="send_on"
required
>
<option value="">
-- Pilih Server --
</option>
<?php
$List = new Listdata();
$List->set_list(
"master_template_pesan", ' GROUP BY nama'
);
foreach (
$List->get_list()
as $key => $value
):
?>
<option value="<?= $value['nama'] ?>" <?= ($promo["send_on"] == $value["nama"]) ? "selected" : "" ?>>
<?= $value['nama'] ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="row">
<div
class="col-md-6"
>
<div
class="form-group"
>
<label>
Tanggal Mulai
</label>
<input
type="datetime-local"
class="form-control"
name="tanggal_mulai"
value="<?php
echo htmlspecialchars(
$tanggalMulaiForm,
ENT_QUOTES,
"UTF-8"
);
?>"
>
</div>
</div>
<div
class="col-md-6"
>
<div
class="form-group"
>
<label>
Tanggal Akhir
</label>
<input
type="datetime-local"
class="form-control"
name="tanggal_akhir"
value="<?php
echo htmlspecialchars(
$tanggalAkhirForm,
ENT_QUOTES,
"UTF-8"
);
?>"
>
</div>
</div>
</div>
<div
class="form-group"
>
<label>
Status
</label>
<select
class="form-control"
name="status"
required
>
<option
value="Aktif"
<?php
echo (
strtolower(
$promo[
"status"
] ?? ""
) ===
"aktif"
)
? "selected"
: "";
?>
>
Aktif
</option>
<option
value="Nonaktif"
<?php
echo (
strtolower(
$promo[
"status"
] ?? ""
) !==
"aktif"
)
? "selected"
: "";
?>
>
Nonaktif
</option>
</select>
</div>
</div>
</div>
</div>
<div
class="modal-footer"
>
<button
type="button"
class="btn btn-secondary"
data-dismiss="modal"
>
Close
</button>
<button
type="submit"
name="edit_promo"
class="btn btn-warning"
>
Edit
</button>
</div>
</form>
</div>
</div>
</div>
<!-- END Modal Edit Promo -->
<?php } ?>
</tbody>
</table>
</div>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</div>
<!-- /.container-fluid -->
</section>
<!-- /.content -->
<script>
document.addEventListener("DOMContentLoaded", function () {
/*
* Menampilkan nama file pada Bootstrap custom-file-input.
*/
const fileInputs = document.querySelectorAll(".custom-file-input");
fileInputs.forEach(function (input) {
input.addEventListener("change", function () {
const fileName = this.files.length > 0
? this.files[0].name
: "Pilih gambar";
const label = this.nextElementSibling;
if (label) {
label.textContent = fileName;
}
});
});
});
</script>