Exibir perfil do usuário
Planejamento Arquitetural do Sistema
-
View (profile.php):
-
Exibe as informações do perfil do usuário, como nome, foto de perfil, bio, número de seguidores, número de usuários seguidos e posts do usuário.
-
Renderiza os componentes de layout, como a barra lateral e o formulário de upload de foto (apenas para o próprio usuário).
-
-
Controller (profile-user.php):
-
Recupera os dados do perfil do usuário e seus posts utilizando o DAO.
-
Passa os dados para a view.
-
-
DAO (user-dao.php e posts-dao.php):
- Executa as queries SQL para buscar as informações do usuário e seus posts.
Na Prática
Arquivo: view/profile.php
<?php
require_once __DIR__ . "/../dir-config.php";
require_once __DIR__ . '/../src/controllers/users/profile-user.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Perfil</title>
<link rel="stylesheet" href="<?= BASE_URL ?>public/css/profile.css" />
</head>
<body>
<?php include __DIR__ . '/components/side-bar.php'; ?>
<main class="profile-container">
<!-- Seção de informações do usuário -->
<section class="info-section">
<div class="photo-container">
<!-- Exibe a foto de perfil do usuário -->
<img
src="<?= $profilePhoto; ?>"
alt="Foto de Perfil"
class="profile-picture"
/>
<!-- Botão de edição de perfil (apenas para o próprio usuário) -->
<?php if ((int)$user_id === (int)$logged_in_user_id): ?>
<button class="btn-edit">
<a href="<?= BASE_URL ?>view/profile-update.php?id=<?= $user_id; ?>"
>Editar Perfil</a
>
</button>
<?php endif; ?>
</div>
<div class="user-info">
<!-- Exibe o nome do usuário -->
<h1 class="user-name"><?php echo $userName; ?></h1>
<div class="stats-container">
<!-- Exibe o número de seguidores e usuários seguidos -->
<span class="following"
><?= $following; ?>
seguindo</span
>
<span class="followers"
><?= $followers; ?>
seguidores</span
>
</div>
<!-- Formulário para seguir/deixar de seguir (apenas para outros usuários) -->
<?php if ((int)$user_id !== (int)$logged_in_user_id): ?>
<form method="POST">
<input
type="hidden"
name="action"
value="<?= $isFollowing ? 'unfollow' : 'follow' ?>"
/>
<button type="submit" class="btn-follow">
<?= $isFollowing ? 'Deixar de seguir' : 'Seguir' ?>
</button>
</form>
<?php endif; ?>
</div>
<!-- Botão de postagem (apenas para o próprio usuário) -->
<?php if ((int)$user_id === (int)$logged_in_user_id && !empty($userPosts)): ?>
<div class="upload-more-photos">
<div class="upload-container">
<form
action="<?= BASE_URL ?>src/controllers/posts/upload-feed-photo.php"
method="POST"
enctype="multipart/form-data"
>
<label for="photo-top"> Adicionar foto </label>
<input type="file" id="photo-top" name="photo" accept="image/*" />
<button type="submit" class="btn-upload">Enviar</button>
</form>
</div>
</div>
<?php endif; ?>
</section>
<!-- Seção da foto do feed -->
<section class="info-section">
<div class="feed-photo-container">
<?php if ($userPosts): ?>
<?php
if (isset($userPosts[0]['photo_url'])) {
$relativePath = BASE_URL . "uploads/feed/" . htmlspecialchars($userPosts[0]['photo_url']);
?>
<img
src="<?= $relativePath; ?>"
alt="Imagem do Feed"
class="feed-image"
/>
<?php } ?>
<?php endif; ?>
</div>
<!-- Formulário de upload de foto (apenas para o próprio usuário e se não houver foto) -->
<?php if (empty($userPosts) && (int)$user_id === (int)$logged_in_user_id): ?>
<div class="pai-do-upload-container">
<div class="upload-container">
<form
action="<?= BASE_URL ?>src/controllers/posts/upload-feed-photo.php"
method="POST"
enctype="multipart/form-data"
>
<label for="photo">
<img
src="<?= BASE_URL ?>public/img/add-photo.svg"
class="icon"
/>
<br />
Adicionar foto
</label>
<input type="file" id="photo" name="photo" accept="image/*" />
<button type="submit" class="btn-upload">Enviar</button>
</form>
</div>
</div>
<?php endif; ?>
</section>
</main>
</body>
</html>
-
Responsabilidade:
-
Exibe as informações do perfil do usuário, como nome, foto de perfil, bio, número de seguidores e usuários seguidos.
-
Renderiza os posts do usuário (se houver).
-
Exibe um formulário de upload de foto apenas para o próprio usuário.
-
Inclui a barra lateral e outros componentes de layout.
-
Arquivo: src/controllers/users/profile-user.php
<?php
require_once __DIR__ . '/../../../database.php';
require_once __DIR__ . '/../../dao/follow-dao.php';
require_once __DIR__ . '/../../dao/user-dao.php';
require_once __DIR__ . '/../../../dir-config.php';
require_once __DIR__ . '/../../dao/posts-dao.php';
require_once __DIR__ . "/../../utils/follow-handler.php";
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: " . BASE_URL . "view/login.php");
exit;
}
$user_id = isset($_GET['id']) ? intval($_GET['id']) : $_SESSION['user_id'];
$logged_in_user_id = $_SESSION['user_id'];
$userDao = new UserDao();
$user = $userDao->getUserProfileById($user_id);
if (!$user) {
die("<p>Usuário não encontrado.</p>");
}
$userName = $user['username'];
$profilePhoto = !empty($user['profile_pic_url'])
? BASE_URL . 'uploads/avatars/' . htmlspecialchars($user['profile_pic_url'])
: BASE_URL . 'public/img/profile.svg';
$followDao = new FollowDao();
$isFollowing = $followDao->isFollowing($user_id, $logged_in_user_id);
$followers = $followDao->getFollowers($user_id);
$following = $followDao->getFollowing($user_id);
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
$action = $_POST['action'];
$followHandler = new FollowHandler();
$followHandler->handleFollow($user_id, $logged_in_user_id, $isFollowing, $action);
}
$postsDao = new PostsDao();
$userPosts = $postsDao->getPostsById($user_id);
$userProfileData = [
'username' => htmlspecialchars($user['username']),
'user_id' => $user_id,
'logged_in_user_id' => $logged_in_user_id,
'profile_Pic_Url' => htmlspecialchars($profilePhoto ?? ''),
'is_Following' => $isFollowing,
'followers' => $followers,
'following' => $following,
'bio' => htmlspecialchars($user['bio'] ?? ''),
'photos' => $userPosts,
];
?>
-
Responsabilidade:
-
Inicia a sessão e verifica se o usuário está logado.
-
Recupera o ID do usuário a partir da URL ou da sessão.
-
Busca as informações do perfil do usuário utilizando o UserDao.
-
Verifica se o usuário logado está seguindo o perfil exibido.
-
Busca o número de seguidores e usuários seguidos.
-
Busca os posts do usuário utilizando o PostsDao.
-
Passa os dados para a view.
-
Arquivo: src/dao/user-dao.php
public function getUserProfileById($id) {
$query = "SELECT id, username, email, phone, bio, profile_pic_url, count_followers, count_following FROM users WHERE id = :id";
$stmt = $this->db->prepare($query);
$stmt->execute([':id' => $id]);
return $stmt->fetch();
}
-
Responsabilidade:
-
Executa uma query SQL para buscar as informações do perfil do usuário (nome, e-mail, telefone, bio, foto de perfil, número de seguidores e usuários seguidos).
-
Retorna um array associativo com os dados do usuário.
-
Arquivo: src/dao/posts-dao.php
public function getPostsById($userId) {
$sql = "SELECT p.id, p.photo_url, p.upload_date, p.description, u.username, u.profile_pic_url
FROM posts p
JOIN users u ON p.user_id = u.id
WHERE p.user_id = :userId
ORDER BY p.upload_date DESC";
$stmt = $this->db->prepare($sql);
$stmt->execute([':userId' => $userId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
-
Responsabilidade:
-
Executa uma query SQL para buscar os posts do usuário, juntamente com as informações do usuário que fez o post.
-
Ordena os posts pela data de upload (do mais recente para o mais antigo).
-
Retorna um array associativo com os dados dos posts.
-
Fluxo Completo
-
O usuário acessa a página de perfil (
profile.php
). -
O controller (
profile-user.php
) é chamado para recuperar os dados do perfil e os posts do usuário. -
O controller utiliza o
UserDao
para buscar as informações do perfil e oPostsDao
para buscar os posts. -
Os dados são passados para a view (
profile.php
). -
A view renderiza as informações do perfil e os posts do usuário