From 872a9f933406af35719a1655f1c627b65e8905a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Garc=C3=ADa=20Jim=C3=A9nez?= Date: Sat, 19 Feb 2022 16:52:51 -0600 Subject: [PATCH] =?UTF-8?q?[Muestra]=20los=20art=C3=ADculos=20publicados?= =?UTF-8?q?=20de=20un=20usuario=20en=20su=20perfil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/profilesController.php | 24 ++++++++++----- models/adminModel.php | 3 -- models/articlesModel.php | 3 -- models/blogModel.php | 7 +++-- models/profilesModel.php | 49 ++++++++++++++++++++++++++++++ views/pages/profile.php | 6 ++-- 6 files changed, 71 insertions(+), 21 deletions(-) diff --git a/controllers/profilesController.php b/controllers/profilesController.php index 8ee3d75..3134943 100644 --- a/controllers/profilesController.php +++ b/controllers/profilesController.php @@ -21,6 +21,8 @@ defined('NABU') || exit(); require_once 'models/profilesModel.php'; class profilesController { + private const limit = 10; + // Renderiza la página de perfil de un usuario. static public function profile() { $validations = new validations(NABU_ROUTES['home']); @@ -35,19 +37,29 @@ class profilesController { // Obtiene los datos de perfil del usuario. $profile = $profilesModel -> get('username', $data['user']); - unset($profilesModel); - if (empty($profile)) utils::redirect(NABU_ROUTES['home']); + // Obtiene el número total de artículos publicados. + $total = $profilesModel -> count_articles($profile['id']); + + $view = NABU_ROUTES['profile'] . '&user=' . urlencode($profile['username']); + + $pagination = utils::pagination($total, self::limit, $view); + + // Obtiene los artículos publicados por el usuario. + $articles = $profilesModel -> articles(self::limit, $pagination['accumulation'], $profile['id']); + + $page = $pagination['page']; + + unset($profilesModel, $total, $pagination); + $isMyProfile = false; if (isset($_SESSION['user'])) if ($_SESSION['user']['username'] == $profile['username']) $isMyProfile = true; - $view = NABU_ROUTES['profile'] . '&user=' . urlencode($profile['username']); - // Escapa los caracteres del nombre completo y el apodo a HTML5. $profile['name'] = utils::escape($profile['name']); $profile['username'] = utils::escape($profile['username']); @@ -61,10 +73,6 @@ class profilesController { $profile['description'] = utils::escape($profile['description']); - $page = 1; - - $articles = array(); - require_once 'views/pages/profile.php'; } diff --git a/models/adminModel.php b/models/adminModel.php index fce7de0..992c4ce 100644 --- a/models/adminModel.php +++ b/models/adminModel.php @@ -40,9 +40,6 @@ class adminModel extends dbConnection { $count = $prepare -> fetch(); - if (empty($count)) - return $count; - return $count['total']; } catch (PDOException $e) { diff --git a/models/articlesModel.php b/models/articlesModel.php index 83f66f0..ac93082 100644 --- a/models/articlesModel.php +++ b/models/articlesModel.php @@ -71,9 +71,6 @@ class articlesModel extends dbConnection { $count = $prepare -> fetch(); - if (empty($count)) - return $count; - return $count['total']; } catch (PDOException $e) { diff --git a/models/blogModel.php b/models/blogModel.php index 16270bb..bafcfe7 100644 --- a/models/blogModel.php +++ b/models/blogModel.php @@ -32,7 +32,8 @@ class blogModel extends dbConnection { 'LEFT JOIN profiles AS p ON u.id = p.id ' . 'LEFT JOIN comments AS c ON a.id = c.article_id ' . 'LEFT JOIN favorites AS f ON a.id = f.article_id ' . - 'WHERE a.authorized = TRUE GROUP BY a.id ORDER BY likes DESC, comments DESC LIMIT ?'; + 'WHERE a.authorized = TRUE GROUP BY u.id ' . + 'ORDER BY likes DESC, comments DESC LIMIT ?'; try { $prepare = $this -> pdo -> prepare($query); @@ -60,7 +61,8 @@ class blogModel extends dbConnection { 'LEFT JOIN profiles AS p ON u.id = p.id ' . 'LEFT JOIN comments AS c ON a.id = c.article_id ' . 'LEFT JOIN favorites AS f ON a.id = f.article_id ' . - 'WHERE a.authorized = TRUE GROUP BY a.id ORDER BY a.modification_date DESC LIMIT ?'; + 'WHERE a.authorized = TRUE GROUP BY a.id ' . + 'ORDER BY a.modification_date DESC LIMIT ?'; try { $prepare = $this -> pdo -> prepare($query); @@ -79,7 +81,6 @@ class blogModel extends dbConnection { } } - public function __destruct() { parent::__destruct(); $this -> pdo = null; diff --git a/models/profilesModel.php b/models/profilesModel.php index ff5fe94..50a0520 100644 --- a/models/profilesModel.php +++ b/models/profilesModel.php @@ -41,6 +41,55 @@ class profilesModel extends dbConnection { } } + // @return el número total de artículos publicados por un usuario. + public function count_articles(int $id) { + $query = 'SELECT COUNT(*) AS total FROM articles AS a ' . + 'INNER JOIN users AS u ON a.user_id = u.id ' . + 'WHERE a.authorized = TRUE AND u.id = ?'; + + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(array($id)); + + $count = $prepare -> fetch(); + + return $count['total']; + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para calcular el número total de artículos publicados por un usuario'); + } + } + + // @return un array asociativo con los artículos publicados por un usuario. + public function articles(int $limit, int $accumulation, int $id) { + $query = 'SELECT a.title, a.synopsis, a.slug, a.cover, u.username AS author, p.avatar, ' . + 'COUNT(c.article_id) AS comments, COUNT(f.article_id) AS likes ' . + 'FROM articles AS a ' . + 'INNER JOIN users AS u ON a.user_id = u.id ' . + 'LEFT JOIN profiles AS p ON u.id = p.id ' . + 'LEFT JOIN comments AS c ON a.id = c.article_id ' . + 'LEFT JOIN favorites AS f ON a.id = f.article_id ' . + 'WHERE a.authorized = TRUE AND u.id = ? GROUP BY a.id ' . + 'ORDER BY a.creation_date DESC LIMIT ? OFFSET ?'; + + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(array($id, $limit, $accumulation)); + + $articles = $prepare -> fetchAll(); + + if (empty($articles)) + $articles = array(); + + return $articles; + } + catch (PDOException $e) { + $this -> errors($e -> getMessage(), 'tuvimos un problema para listar los artículos publicados por un usuario'); + } + } + // Actualiza los datos de perfil de un usuario. public function update(int $id, array $data) { $columns = array_keys($data); diff --git a/views/pages/profile.php b/views/pages/profile.php index 4e38865..d72688c 100644 --- a/views/pages/profile.php +++ b/views/pages/profile.php @@ -30,7 +30,7 @@ 'components/navbar/navbar-desktop.css', 'attributes' => 'media="screen and (min-width: 768px)"'), - array('file' => 'pages/profile/profile-desktop.css', 'attributes' => 'media="screen and (min-width: 768px)"') + array('file' => 'pages/profile/profile-desktop.css', 'attributes' => 'media="screen and (min-width: 768px)"') ) ?> @@ -64,10 +64,8 @@

Post publicados

- -
- +