LILINE’S LAB

Projet : Simple Blog From Scratch Part8

par | Nov 3, 2024 | Développement, JavaScript, Projets, Simple Blog From Scratch

Dans l’article Projet : Simple Blog From Scratch Part7 nous avons vu comment récupérer tous les articles et aussi comment récupérer un article choisi.
Nous allons voir aujourd’hui comment ajouter une pagination afin de ne pas charger tous les articles sur la page d’accueil.

Ci-dessous le code modifié concernant le script fetchPosts.js

JavaScript
let currentPage = 1;
let postsPerPage = 6;
let totalPages = 1;
let allPosts = [];

async function fetchPosts() {
    try {
        const response = await fetch(`${urlApi}/posts/all`, {
            method: 'GET',
        });

        if (response.status === 200) {
            const data = await response.json();
            allPosts = data.allPosts;
            // Calcul du nombre total de pages en prenant le nombre total d'articles divisisé par la variable postsPerPage définie plus haut
            totalPages = Math.ceil(allPosts.length / postsPerPage);
            // Appel de la fonction renderPage(currentPage) afin d'afficher les articles de la première page 
            renderPage(currentPage);
            // Appel de la fonction renderPaginationControls() permettant de naviguer dans les pages d'articles
            renderPaginationControls();
        } else {
            console.log(response);
        }
    } catch (error) {
        console.log(error);
    }
};

function renderPage(page) {
    const postsContainer = document.getElementById(postsContainerId);
    const template = document.getElementById(templateId);
    // Permet d'effacer le contenu précédent
    postsContainer.innerHTML = '';
    // Calcul des index de début et de fin pour les articles de cette page
    const startIndex = (page - 1) * postsPerPage;
    const endIndex = Math.min(startIndex + postsPerPage, allPosts.length);

    // Boucle pour ajouter les posts de la page actuelle dans le conteneur "postsContainer" défini plus haut
    for (let i = startIndex; i < endIndex; i++) {
        const post = allPosts[i];
        const seePost = document.importNode(template.content, true);
        
        seePost.getElementById('postTitle').textContent = post.title;
        seePost.getElementById('postContent').textContent = (post.content.length > 120 ? post.content.slice(0, 120) + '...' : post.content);
        seePost.getElementById('postLink').href = `post.html?id=${post.id}`;
        postsContainer.appendChild(seePost);
    }
};
 
function renderPaginationControls() {
    const paginationContainer = document.getElementById('paginationControls');
    paginationContainer.innerHTML = '';

    const prevButton = document.createElement('button');
    prevButton.classList.add('paginationBtn');
    prevButton.textContent = '<<';
    prevButton.disabled = currentPage === 1;
    // Fonction de clic pour changer de page
    prevButton.onclick = () => {
        if (currentPage > 1) {
            currentPage--;
            renderPage(currentPage);
            renderPaginationControls();
        }
    };
    paginationContainer.appendChild(prevButton);
    
    // Affiche le numéro de page courant et total
    const pageInfo = document.createElement('span');
    pageInfo.classList.add('paginationNumbers');
    pageInfo.textContent = `${currentPage} / ${totalPages}`;
    paginationContainer.appendChild(pageInfo);

    const nextButton = document.createElement('button');
    // Fonction de clic pour changer de page
    nextButton.classList.add('paginationBtn');
    nextButton.textContent = '>>';
    nextButton.disabled = currentPage === totalPages;
    nextButton.onclick = () => {
        if (currentPage < totalPages) {
            currentPage++;
            renderPage(currentPage);
            renderPaginationControls();
        }
    };
    paginationContainer.appendChild(nextButton);
};

fetchPosts();

La page index.html a également vue des petits changements.

JavaScript
    <main class="general">
        <!-- La section n'entoure désormais plus le template du fait de la modification apportée au script fetchPosts.js -->
        <section class="posts" id="allPosts"></section>
        <template id="templatePosts">
            <div class="post">
                <h2 id="postTitle"></h2>
                <p id="postContent"></p>
                <a id="postLink" href="#">Lire plus</a>
            </div>
        </template>
        <div class="pagination" id="paginationControls"></div>
    </main>

Le blog dispose désormais d’une pagination des articles !

Retrouvez les premiers articles du projet ici ⬇️

Simple Blog From Scratch Part1
Simple Blog From Scratch Part2
Simple Blog From Scratch Part3
Simple Blog From Scratch Part4
Simple Blog From Scratch Part5
Simple Blog From Scratch Part6
Simple Blog From Scratch Part7


logo du site