HTML SCRIPT UI
이미지 선택 및 취소
큰세상2000
2024. 7. 6. 02:48
반응형
# 조건
- 첫번째 이미지에 "대표이미지" 글자 보이기
- 첨부파일이 있으면 취소 버튼 보이기
- 첨부파일이 있는 상태에서 파일선택하려고 하면 취소 먼저 하라고 알리기
- 파일선택된 위치 기억하기
<style>
.sample-book-cover {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
padding: 20px;
}
.cover-item {
border: 1px solid #ccc;
display: flex;
flex-direction: column;
align-items: center;
background-color: #f0f0f0;
padding: 10px;
}
.preview-container {
position: relative;
width: 100%;
aspect-ratio: 1 / 1;
margin-bottom: 10px;
overflow: hidden;
}
.preview {
width: 100%;
height: 100%;
object-fit: cover;
}
.button-container {
display: flex;
justify-content: space-between;
width: 100%;
}
.file-input {
display: none;
}
.file-button, .cancel-button {
padding: 6px 12px;
background-color: #f8f9fa;
border: 1px solid #ced4da;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
color: #212529;
}
.file-button:hover, .cancel-button:hover {
background-color: #e9ecef;
}
.representative-label {
position: absolute;
top: 5px;
right: 5px;
background-color: rgba(255, 255, 255, 0.7);
padding: 5px 5px;
font-size: 12px;
font-weight: bold;
border-radius: 3px;
}
</style>
<div class="sample-book-cover">
<?php
// 이미지 커버 문자열을 세미콜론으로 나눠 배열로 변환
$aa = explode(";", $imgCover);
// 최대 6개의 이미지 커버를 처리
for ($i = 0; $i <= 5; $i++) {
if ($i <= count($aa) - 1) {
// 배열의 해당 인덱스가 비어있는 경우 빈 문자열 할당
if ($aa[$i] == "") {
$aa[$i] = "";
}
} else {
// 배열의 크기가 6보다 작다면 "noimage.jpg"를 할당
$aa[$i] = "noimage.jpg";
}
?>
<div class="cover-item">
<div class="preview-container">
<!-- 이미지 미리보기 -->
<img src="./mall/item_img/<?php echo trim($aa[$i]); ?>" alt="noImage" class="preview">
<?php if ($i == 0) { ?>
<!-- 첫 번째 이미지는 대표이미지로 표시 -->
<span class="representative-label">대표이미지</span>
<?php } ?>
</div>
<!-- 파일 입력 요소 -->
<input type="file" id="file<?php echo $i; ?>" name="imgcover" class="file-input" onchange="previewImage(this)">
<!-- 기존 이미지 커버를 저장하는 숨겨진 입력 요소 -->
<input type="hidden" name="oldimgcover" value="<?php echo trim($aa[$i]); ?>">
<div class="button-container">
<!-- 파일 선택 버튼 -->
<input type="button" value="파일 선택" onclick="startUpload(<?php echo $i; ?>)" class="file-button">
<!-- 업로드 취소 버튼 -->
<input type="button" value="취소" onclick="cancelUpload(this)"
<?php
// 이미지가 존재하는 경우에만 취소 버튼을 표시
if(trim($aa[$i]) != "") {
echo "style='display:inline-block;'";
} else {
echo "style='display:none;'";
} ?>>
</div>
</div>
<?php
}
?>
</div>
<script>
// 파일 선택 시 이미지 미리보기를 설정하는 함수
function previewImage(input) {
const file = input.files[0]; // 선택한 파일 가져오기
if (file) {
const preview = input.closest('.cover-item').querySelector('.preview'); // 현재 .cover-item에서 .preview 요소 찾기
preview.src = URL.createObjectURL(file); // 선택한 파일을 URL로 변환하여 미리보기 설정
input.closest('.cover-item').querySelector('.cancel-button').style.display = 'inline-block'; // 취소 버튼 표시
}
}
// 업로드 시작 함수, 기존 이미지가 있는 경우 경고 메시지 표시
function startUpload(index) {
const oldImgCovers = document.querySelectorAll('input[name="oldimgcover"]'); // 모든 oldimgcover input 요소 가져오기
if (oldImgCovers[index].value != "") {
alert("\n\n이미지를 변경하시려면 기존 이미지를 취소해주세요."); // 기존 이미지가 있을 경우 경고 메시지 표시
} else {
document.getElementById('file' + index.toString()).click(); // 파일 선택 input 요소 클릭
}
}
// 업로드 취소 함수
function cancelUpload(button) {
const coverItem = button.closest('.cover-item'); // 현재 버튼의 .cover-item 요소 찾기
const input = coverItem.querySelector('.file-input'); // .cover-item 내의 파일 입력 요소 찾기
const preview = coverItem.querySelector('.preview'); // .cover-item 내의 미리보기 이미지 요소 찾기
input.value = ''; // 파일 입력 요소의 값을 비우기
URL.revokeObjectURL(preview.src); // 미리보기 URL 해제
preview.src = ''; // 미리보기 이미지 비우기
const index = Array.from(coverItem.parentNode.children).indexOf(coverItem); // 현재 .cover-item의 인덱스 찾기
// 'oldimgcover' input 요소 찾기
const oldImgCovers = document.querySelectorAll('input[name="oldimgcover"]');
if (index >= 0 && index < oldImgCovers.length) {
const oldImgCover = oldImgCovers[index];
console.log("Old Image Cover Element:", oldImgCover); // 디버그를 위한 콘솔 로그
oldImgCover.value = ""; // oldimgcover input 요소 값 비우기
}
button.style.display = 'none'; // 취소 버튼 숨기기
}
</script>
<?php
// 'originalimgCover'를 세미콜론으로 분리하여 배열로 변환
$imgCover = explode(";", $_POST["limgCover"]);
$oldimgCover = explode(";", $_POST["oldimgCover"]);
$imgcover_string = "";
// 최대 6개의 파일을 처리
for ($i = 1; $i <= 6; $i++) {
// 신규 파일 첨부
if ($imgCover != "" && trim(oldimgCover[$i]) == "") {
$imgcover_string .= trim(imgCover[$i] . ";";
}
// 기존 파일 취소 처리
if ($imgCover == "" && trim(oldimgCover[$i]) != "") {
$imgcover_string .= trim(oldimgCover[$i]) . ";";
}
// 빈 영역 처리
if ($imgCover == "" && trim(oldimgCover[$i]) == "") {
$imgcover_string .= ";";
}
}
// DB에 저장할 순서대로의 이미지 문자열
$imgcover_string
?>
반응형