Files
acaoopcao/minha-conta.php
T
2026-08-21 22:57:44 +00:00

126 lines
5.5 KiB
PHP

<?php
$titulo_pagina = 'Minha conta';
// Sem $pagina_ativa de propósito: esta página não passa pelo sistema de
// permissões configuráveis (tabela `paginas`) nem pelo bloqueio de
// administrador — qualquer usuário logado pode mudar o próprio nome e senha,
// independente do que o perfil dele permite ver.
require_once __DIR__ . '/includes/config.php';
require_once __DIR__ . '/includes/db.php';
require_once __DIR__ . '/includes/auth.php';
ao_exigir_login();
$ao_usuario_atual = ao_usuario_logado();
$ao_usuario_id = (int) $ao_usuario_atual['id'];
$erro = null;
$sucesso = null;
if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['acao'] ?? '') === 'salvar') {
$nome = trim($_POST['nome'] ?? '');
$senha_atual = (string) ($_POST['senha_atual'] ?? '');
$nova_senha = (string) ($_POST['nova_senha'] ?? '');
$confirmar_nova_senha = (string) ($_POST['confirmar_nova_senha'] ?? '');
$quer_trocar_senha = $nova_senha !== '' || $confirmar_nova_senha !== '';
if ($nome === '') {
$erro = 'Informe seu nome.';
} elseif ($quer_trocar_senha && $nova_senha !== $confirmar_nova_senha) {
$erro = 'A nova senha e a confirmação não são iguais.';
} elseif ($quer_trocar_senha && $senha_atual === '') {
$erro = 'Informe sua senha atual para definir uma nova senha.';
} else {
if ($quer_trocar_senha) {
$stmt = $pdo->prepare('SELECT senha_hash FROM usuarios WHERE id = ?');
$stmt->execute([$ao_usuario_id]);
$linha = $stmt->fetch();
if (!$linha || !password_verify($senha_atual, $linha['senha_hash'])) {
$erro = 'Senha atual incorreta.';
}
}
if (!$erro) {
try {
if ($quer_trocar_senha) {
$stmt = $pdo->prepare('UPDATE usuarios SET nome = ?, senha_hash = ? WHERE id = ?');
$stmt->execute([$nome, password_hash($nova_senha, PASSWORD_DEFAULT), $ao_usuario_id]);
} else {
$stmt = $pdo->prepare('UPDATE usuarios SET nome = ? WHERE id = ?');
$stmt->execute([$nome, $ao_usuario_id]);
}
// Atualiza a sessão para o nome novo aparecer no cabeçalho na hora.
$_SESSION['ao_usuario']['nome'] = $nome;
header('Location: minha-conta.php?salvo=1');
exit;
} catch (PDOException $e) {
$erro = 'Erro ao salvar: ' . $e->getMessage();
}
}
}
}
if (isset($_GET['salvo'])) {
$sucesso = 'Dados salvos com sucesso.';
}
// Nome exibido no formulário: o que acabou de ser digitado (se deu erro) ou o
// nome atual da sessão.
$ao_nome_form = $_SERVER['REQUEST_METHOD'] === 'POST' ? ($nome ?? $ao_usuario_atual['nome']) : $ao_usuario_atual['nome'];
require __DIR__ . '/includes/header.php';
?>
<h1 class="ao-page-title">Minha conta</h1>
<?php if ($erro): ?>
<div class="ao-badge ao-badge-baixa" style="display:block; margin-bottom: var(--ao-space-4); padding: 10px 14px; font-size: var(--ao-fs-sm);"><?= htmlspecialchars($erro) ?></div>
<?php endif; ?>
<?php if ($sucesso): ?>
<div class="ao-badge ao-badge-alta" style="display:block; margin-bottom: var(--ao-space-4); padding: 10px 14px; font-size: var(--ao-fs-sm);"><?= htmlspecialchars($sucesso) ?></div>
<?php endif; ?>
<div class="ao-card" style="max-width: 480px;">
<div class="ao-card-header"><strong>Meus dados</strong></div>
<p style="color: var(--ao-text-muted); font-size: var(--ao-fs-sm); margin-top: 0;">
E-mail: <strong><?= htmlspecialchars($ao_usuario_atual['email']) ?></strong>
</p>
<form method="post" action="minha-conta.php" id="form-minha-conta" onsubmit="return aoConfirmarNovaSenha(this);">
<input type="hidden" name="acao" value="salvar">
<div class="ao-field" style="margin-bottom: var(--ao-space-4);">
<label for="nome">Nome</label>
<input type="text" id="nome" name="nome" required value="<?= htmlspecialchars($ao_nome_form) ?>">
</div>
<div class="ao-field" style="margin-bottom: var(--ao-space-4);">
<label for="senha_atual">Senha atual <span style="font-weight: 400; color: var(--ao-text-muted);">(só para trocar a senha)</span></label>
<input type="password" id="senha_atual" name="senha_atual" autocomplete="current-password">
</div>
<div class="ao-field" style="margin-bottom: var(--ao-space-4);">
<label for="nova_senha">Nova senha <span style="font-weight: 400; color: var(--ao-text-muted);">(deixe em branco para manter a atual)</span></label>
<input type="password" id="nova_senha" name="nova_senha" autocomplete="new-password">
</div>
<div class="ao-field" style="margin-bottom: var(--ao-space-5);">
<label for="confirmar_nova_senha">Confirmar nova senha</label>
<input type="password" id="confirmar_nova_senha" name="confirmar_nova_senha" autocomplete="new-password">
</div>
<button type="submit" class="ao-btn ao-btn-primary">Salvar alterações</button>
</form>
</div>
<script>
// Confere no navegador se a nova senha e a confirmação batem, antes mesmo
// de enviar o formulário — a checagem que vale de verdade é feita no servidor.
function aoConfirmarNovaSenha(form) {
var nova = form.querySelector('#nova_senha').value;
var confirmar = form.querySelector('#confirmar_nova_senha').value;
if (nova !== confirmar) {
alert('A nova senha e a confirmação não são iguais.');
return false;
}
return true;
}
</script>
<?php require __DIR__ . '/includes/footer.php'; ?>