[Muestra] los artículos publicados de un usuario en su perfil

This commit is contained in:
Ricardo García Jiménez 2022-02-19 16:52:51 -06:00
parent a0b6bdd18d
commit 872a9f9334
6 changed files with 71 additions and 21 deletions

View file

@ -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';
}

View file

@ -40,9 +40,6 @@ class adminModel extends dbConnection {
$count = $prepare -> fetch();
if (empty($count))
return $count;
return $count['total'];
}
catch (PDOException $e) {

View file

@ -71,9 +71,6 @@ class articlesModel extends dbConnection {
$count = $prepare -> fetch();
if (empty($count))
return $count;
return $count['total'];
}
catch (PDOException $e) {

View file

@ -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;

View file

@ -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);

View file

@ -30,7 +30,7 @@
<!-- Estilos para el responsive design -->
<?php $desktop_styles = array(
array('file' => '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)"')
) ?>
<!-- Archivos de javascript a cargar -->
@ -64,10 +64,8 @@
<h2 class='public-posts__title'>Post publicados</h2>
<div class="public-cards__container">
<?php require 'views/components/articles.php' ?>
<?php require 'views/components/articles.php' ?>
<?php require 'views/components/articles.php' ?>
</div>
</section>
<?php require_once 'views/components/articles.php' ?>
<?php require_once 'views/components/pagination.php' ?>
<?php require_once 'views/components/footer.php' ?>