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

   


Consultante spécialisée dans les technologies Microsoft, je justifie de plus de 14 ans d’expérience dans le secteur IT.
Mon parcours professionnel, riche et varié, m’a permis de développer de solides compétences, tant techniques qu’humaines. Je suis reconnue pour ma capacité à analyser rapidement les enjeux techniques et à concevoir des solutions pertinentes, y compris sur des problématiques complexes.
Mon approche proactive, alliée à mes compétences en développement, me permet de proposer des évolutions efficaces, toujours en cohérence avec les objectifs métiers.
En parallèle de mon activité professionnelle, je prends plaisir à approfondir mes compétences techniques en réalisant des projets personnels. Je développe notamment des jeux web basés sur React et PHP, ainsi que des applications orientées métier avec SPFx.