338 lines
9.8 KiB
PHP
338 lines
9.8 KiB
PHP
<?php
|
||
session_start();
|
||
|
||
$env = parse_ini_file(__DIR__ . '/../.env');
|
||
$senha_correta = $env['PASSWORD'] ?? '';
|
||
|
||
if (isset($_POST['senha'])) {
|
||
if ($_POST['senha'] === $senha_correta) {
|
||
$_SESSION['logado'] = true;
|
||
} else {
|
||
$erro = "Senha incorreta.";
|
||
}
|
||
}
|
||
|
||
if (!($_SESSION['logado'] ?? false)) {
|
||
?>
|
||
<form method="POST">
|
||
<h2>Entrar</h2>
|
||
<?php if (!empty($erro)) echo "<p style='color:red'>$erro</p>"; ?>
|
||
<input type="password" name="senha" placeholder="Senha"/>
|
||
<button type="submit">Entrar</button>
|
||
</form>
|
||
<?php
|
||
exit;
|
||
}
|
||
|
||
$jsonPath = __DIR__ . '/slides.json';
|
||
$imagensDir = __DIR__ . '/imagens/';
|
||
$htmlPath = __DIR__ . '/index.html';
|
||
|
||
$slides = [];
|
||
if (file_exists($jsonPath)) {
|
||
$conteudo = file_get_contents($jsonPath);
|
||
$decodificado = json_decode($conteudo, true);
|
||
if (is_array($decodificado)) {
|
||
$slides = $decodificado;
|
||
}
|
||
}
|
||
|
||
// ADICIONAR SLIDE
|
||
if (isset($_POST['add'])) {
|
||
if (!is_dir($imagensDir)) mkdir($imagensDir);
|
||
|
||
$imgName = '';
|
||
if (isset($_FILES['imagem']) && $_FILES['imagem']['error'] === 0) {
|
||
$ext = strtolower(pathinfo($_FILES['imagem']['name'], PATHINFO_EXTENSION));
|
||
$permitidos = ['jpg', 'jpeg', 'png', 'webp', 'apng'];
|
||
if (in_array($ext, $permitidos)) {
|
||
$imgName = uniqid('img_') . ".$ext";
|
||
if (!move_uploaded_file($_FILES['imagem']['tmp_name'], "$imagensDir/$imgName")) {
|
||
die("Erro ao salvar a imagem.");
|
||
}
|
||
} else {
|
||
die("Formato de imagem não permitido.");
|
||
}
|
||
} else {
|
||
die("Erro no envio da imagem.");
|
||
}
|
||
|
||
$slides[] = [
|
||
'imagem' => $imgName,
|
||
'texto' => trim($_POST['texto'] ?? ''),
|
||
'cor' => $_POST['cor'] ?? '',
|
||
'direcao' => $_POST['direcao'] ?? '',
|
||
'link' => trim($_POST['link'] ?? ''),
|
||
];
|
||
|
||
if (file_put_contents($jsonPath, json_encode($slides, JSON_PRETTY_PRINT)) === false) {
|
||
die("Erro ao gravar no slides.json");
|
||
}
|
||
|
||
atualizarHTML($slides, $htmlPath);
|
||
header("Location: " . basename(__FILE__));
|
||
exit;
|
||
}
|
||
|
||
// SALVAR ALTERAÇÕES (editar e reordenar)
|
||
if (isset($_POST['save'])) {
|
||
$novos_slides = [];
|
||
$ids = array_keys($slides);
|
||
$ordem = $_POST['ordem'] ?? [];
|
||
|
||
foreach ($ids as $i) {
|
||
$texto = trim($_POST['texto'][$i] ?? '');
|
||
$cor = $_POST['cor'][$i] ?? '';
|
||
$link = trim($_POST['link'][$i] ?? '');
|
||
$direcao = $_POST['direcao'][$i] ?? '';
|
||
$ord = intval($ordem[$i] ?? 0);
|
||
|
||
$novos_slides[$i] = [
|
||
'imagem' => $slides[$i]['imagem'],
|
||
'texto' => $texto,
|
||
'cor' => $cor,
|
||
'link' => $link,
|
||
'direcao' => $direcao,
|
||
'ordem' => $ord,
|
||
];
|
||
}
|
||
|
||
usort($novos_slides, function($a, $b) {
|
||
return ($a['ordem'] ?? 0) <=> ($b['ordem'] ?? 0);
|
||
});
|
||
|
||
foreach ($novos_slides as &$slide) {
|
||
unset($slide['ordem']);
|
||
}
|
||
|
||
$slides = $novos_slides;
|
||
|
||
if (file_put_contents($jsonPath, json_encode($slides, JSON_PRETTY_PRINT)) === false) {
|
||
die("Erro ao gravar no slides.json");
|
||
}
|
||
|
||
atualizarHTML($slides, $htmlPath);
|
||
header("Location: " . basename(__FILE__));
|
||
exit;
|
||
}
|
||
|
||
// EXCLUIR SLIDE
|
||
if (isset($_GET['delete'])) {
|
||
$index = (int) $_GET['delete'];
|
||
if (isset($slides[$index])) {
|
||
$imgDel = $slides[$index]['imagem'];
|
||
@unlink("$imagensDir/$imgDel");
|
||
array_splice($slides, $index, 1);
|
||
file_put_contents($jsonPath, json_encode($slides, JSON_PRETTY_PRINT));
|
||
atualizarHTML($slides, $htmlPath);
|
||
}
|
||
header("Location: " . basename(__FILE__));
|
||
exit;
|
||
}
|
||
|
||
function atualizarHTML($slides, $htmlPath) {
|
||
$novoConteudo = '<div class="slideshow-container">' . PHP_EOL;
|
||
foreach ($slides as $slide) {
|
||
$botao = '';
|
||
if (!empty(trim($slide['texto'] ?? ''))) {
|
||
$cor = $slide['cor'] ?? '#000';
|
||
$dir = $slide['direcao'] ?? 'up';
|
||
$txt = htmlspecialchars($slide['texto']);
|
||
$link = htmlspecialchars($slide['link'] ?? '#') ?: '#';
|
||
$botao = "<a data-moan-direction=\"$dir\" class=\"moan-link\" href=\"$link\" style=\"background: $cor;\">$txt</a>";
|
||
}
|
||
|
||
$novoConteudo .= <<<HTML
|
||
<div class="slide">
|
||
<img src="./imagens/{$slide['imagem']}" alt=""/>
|
||
$botao
|
||
</div>
|
||
|
||
HTML;
|
||
}
|
||
|
||
$novoConteudo .= <<<HTML
|
||
<a class="prev" onclick="plusSlides(-1)">❮</a>
|
||
<a class="next" onclick="plusSlides(1)">❯</a>
|
||
|
||
<div class="dots">
|
||
HTML;
|
||
|
||
foreach ($slides as $i => $_) {
|
||
$n = $i + 1;
|
||
$novoConteudo .= "<span class=\"dot\" onclick=\"currentSlide($n)\"></span> ";
|
||
}
|
||
|
||
$novoConteudo .= '</div></div>';
|
||
|
||
$html = file_get_contents($htmlPath);
|
||
|
||
$novoHtml = preg_replace(
|
||
'#<div class="slideshow-container">.*?</div>\s*</div>#s',
|
||
$novoConteudo,
|
||
$html
|
||
);
|
||
|
||
file_put_contents($htmlPath, $novoHtml);
|
||
}
|
||
?>
|
||
|
||
<!DOCTYPE html>
|
||
<html lang="pt-br">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<title>Editar Slides</title>
|
||
<style>
|
||
body {
|
||
font-family: sans-serif;
|
||
background: linear-gradient(300deg,deepskyblue,darkviolet,blue);
|
||
background-size: 180% 180%;
|
||
background-repeat: no-repeat;
|
||
background-attachment: fixed;
|
||
animation: gradient-animation 18s ease infinite;
|
||
color: #fff;
|
||
|
||
}
|
||
|
||
@keyframes gradient-animation {
|
||
0% {
|
||
background-position: 0% 50%;
|
||
}
|
||
50% {
|
||
background-position: 100% 50%;
|
||
}
|
||
100% {
|
||
background-position: 0% 50%;
|
||
}
|
||
}
|
||
|
||
h1, h2, table {
|
||
text-align: center;
|
||
}
|
||
|
||
table {
|
||
margin: 0 auto;
|
||
}
|
||
|
||
div.form {
|
||
display: block;
|
||
margin: 0 auto;
|
||
width: 600px;
|
||
max-width: 90%;
|
||
}
|
||
|
||
a {
|
||
color: #fff;
|
||
text-decoration: none;
|
||
font-weight: bold;
|
||
}
|
||
|
||
th, td {
|
||
padding: 5px 10px;
|
||
}
|
||
|
||
button {
|
||
margin: 10px auto;
|
||
display: block;
|
||
background-color: #263748;;
|
||
color: white; /* White text */
|
||
border: none; /* No border */
|
||
padding: 10px 20px; /* Padding around the text */
|
||
font-size: 16px; /* Font size */
|
||
cursor: pointer; /* Changes mouse cursor to a hand on hover */
|
||
border-radius: 5px; /* Slightly rounded corners */
|
||
transition: background-color 0.3s ease; /* Smooth transition for hover effect */
|
||
}
|
||
|
||
button:hover {
|
||
background-color: #444;
|
||
}
|
||
|
||
button:active {
|
||
background-color: #555;
|
||
transform: translateY(1px); /* Slight downward shift for a "pressed" effect */
|
||
}
|
||
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<h1>Gerenciar Slides</h1>
|
||
|
||
<p style="text-align: center;">Use imagens com a proporção 81/46. As dimensões de exibição são 405px de largura por 230px de altura.</p>
|
||
|
||
<div class="form">
|
||
<form method="POST" enctype="multipart/form-data" action="<?= basename(__FILE__) ?>">
|
||
<p><input type="file" name="imagem" required></p>
|
||
<p><input type="text" name="texto" placeholder="Texto do botão (opcional)"></p>
|
||
<p><input type="text" name="link" placeholder="Link do botão (opcional, ex: https://...)"></p>
|
||
<p><input type="color" name="cor" value="#000000"></p>
|
||
<p>
|
||
<select name="direcao">
|
||
<option value="up">De cima</option>
|
||
<option value="from-right">Da direita</option>
|
||
<option value="from-left">Da esquerda</option>
|
||
<option value="down">De baixo</option>
|
||
</select>
|
||
</p>
|
||
<p><button type="submit" name="add">Adicionar Slide</button></p>
|
||
</form>
|
||
</div>
|
||
|
||
<hr>
|
||
|
||
<h2>Editar slides existentes</h2>
|
||
|
||
<form method="POST" action="<?= basename(__FILE__) ?>">
|
||
<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse;">
|
||
<thead>
|
||
<tr>
|
||
<th>Ordem</th>
|
||
<th>Imagem</th>
|
||
<th>Texto do botão</th>
|
||
<th>Link do botão</th>
|
||
<th>Cor do botão</th>
|
||
<th>Direção</th>
|
||
<th>Ações</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<?php foreach ($slides as $i => $s): ?>
|
||
<tr>
|
||
<td>
|
||
<input type="number" name="ordem[<?= $i ?>]" value="<?= $i + 1 ?>" style="width: 50px;">
|
||
</td>
|
||
<td>
|
||
<img src="imagens/<?= $s['imagem'] ?>" style="height:50px;vertical-align:middle;">
|
||
</td>
|
||
<td>
|
||
<input type="text" name="texto[<?= $i ?>]" value="<?= htmlspecialchars($s['texto']) ?>">
|
||
</td>
|
||
<td>
|
||
<input type="text" name="link[<?= $i ?>]" value="<?= htmlspecialchars($s['link'] ?? '') ?>">
|
||
</td>
|
||
<td>
|
||
<input type="color" name="cor[<?= $i ?>]" value="<?= htmlspecialchars($s['cor'] ?: '#000000') ?>">
|
||
</td>
|
||
<td>
|
||
<select name="direcao[<?= $i ?>]">
|
||
<?php
|
||
$dirs = ['up' => 'De cima', 'from-right' => 'Da direita', 'from-left' => 'Da esquerda', 'down' => 'De baixo'];
|
||
foreach ($dirs as $val => $label): ?>
|
||
<option value="<?= $val ?>" <?= ($s['direcao'] === $val) ? 'selected' : '' ?>><?= $label ?></option>
|
||
<?php endforeach; ?>
|
||
</select>
|
||
</td>
|
||
<td>
|
||
<a href="?delete=<?= $i ?>" onclick="return confirm('Excluir este slide?')">Excluir</a>
|
||
</td>
|
||
</tr>
|
||
<?php endforeach; ?>
|
||
</tbody>
|
||
</table>
|
||
|
||
<p><button type="submit" name="save">Salvar alterações</button></p>
|
||
</form>
|
||
|
||
</body>
|
||
</html>
|