126 lines
5.5 KiB
PHP
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'; ?>
|