Dezvoltare PHP: funcție completă și flexibilă pentru generarea paginării numerice

Într-un articol anterior am prezentat o funcție de bază pentru generarea paginării în PHP. Odată cu evoluția cerințelor din proiectele practice, am extins și perfecționat această funcție pentru a oferi mai mult control și o integrare simplificată în orice șablon web.

Comparativ cu varianta inițială, versiunea revizuită adaugă posibilitatea de a personaliza separatorul dintre pagini printr-un parametru opțional dedicat ($delim). Astfel, aveți libertate deplină de configurare a aspectului vizual, fără a altera logica internă a scriptului.

Codul sursă al funcției de paginare revizuite

Iată implementarea completă și structurată în PHP:

<?php
function make_pages($total_page, $curr_page, $url, $next = 0, $delim = " | ") {
    $da = "";

    if ($next == 1) {
        if ($total_page > 1) {
            if ($curr_page > 1) {
                $da .= '<a href="' . str_replace("[page]", ($curr_page - 1), $url) . '" class="paginatie_prev_page">&nbsp;</a> ' . $delim . ' ';
            } else {
                $da .= '<a href="#" class="paginatie_prev_page">&nbsp;</a> ' . $delim . ' ';
            }
        }
    }

    if ($total_page < 1) {
        $da .= '<a href="' . str_replace("[page]", 1, $url) . '">1</a> ' . $delim . ' ';
    }

    if ($total_page < 15) {
        for ($i = 1; $i < ($total_page + 1); $i++) {
            if ($i == $curr_page) {
                $da .= '<span class="curr">' . $i . '</span> ' . $delim . ' ';
            } else {
                $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
            }
        }
    } else {
        if ($curr_page < 8) {
            for ($i = 1; $i < 11; $i++) {
                if ($i == $curr_page) {
                    $da .= '<span class="curr">' . $i . '</span> ' . $delim . ' ';
                } else {
                    $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
                }
            }
            $da .= " .... ";
            for ($i = ($total_page - 5); $i < ($total_page + 1); $i++) {
                $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
            }
        } elseif (($curr_page > 7) && ($curr_page < ($total_page - 4))) {
            for ($i = 1; $i < 4; $i++) {
                if ($i == $curr_page) {
                    $da .= '<span class="curr">' . $i . '</span> ' . $delim . ' ';
                } else {
                    $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
                }
            }
            $da .= " ... ";
            for ($i = ($curr_page - 3); $i < ($curr_page + 3); $i++) {
                if ($i == $curr_page) {
                    $da .= '<span class="curr">' . $i . '</span> ' . $delim . ' ';
                } else {
                    $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
                }
            }
            $da .= " ... ";
            for ($i = ($total_page - 3); $i < ($total_page + 1); $i++) {
                $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
            }
        } elseif ($curr_page > 7) {
            for ($i = 1; $i < 4; $i++) {
                $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
            }
            $da .= " ... ";
            for ($i = ($total_page - 7); $i < ($total_page + 1); $i++) {
                if ($i == $curr_page) {
                    $da .= '<span class="curr">' . $i . '</span> ' . $delim . ' ';
                } else {
                    $da .= '<a href="' . str_replace("[page]", $i, $url) . '">' . $i . '</a> ' . $delim . ' ';
                }
            }
        }
    }

    if ($next == 1) {
        if ($total_page > 1) {
            if ($curr_page < $total_page) {
                $da .= '<a href="' . str_replace("[page]", ($curr_page + 1), $url) . '" class="paginatie_next_page">&nbsp;</a> ' . $delim . ' ';
            } else {
                $da .= '<a href="#" class="paginatie_next_page">&nbsp;</a> ' . $delim . ' ';
            }
        }
    }

    return $da;
}

Explicarea parametrilor funcției

  • $total_page: numărul total de pagini rezultate în urma împărțirii setului de date;
  • $curr_page: numărul paginii active pe care se află vizitatorul;
  • $url: șablonul de adresă web ce include marcatorul [page], care va fi înlocuit dinamic cu numărul paginii (de exemplu: articole.php?p=[page]);
  • $next: parametru binar (1 sau 0) ce activează sau dezactivează butoanele de navigare „pagina precedentă” și „pagina următoare”;
  • $delim: șirul de caractere folosit ca delimitator vizual între linkurile paginilor (implicit: " | ").

Integrare și stilizare CSS

Funcția returnează un șir HTML semantic, pregătit pentru stilizare prin clase CSS dedicate precum paginatie_prev_page, paginatie_next_page și curr pentru marcarea paginii curente. Puteți descărca și include această funcție direct în proiectele dumneavoastră PHP.

1 comentariu

Lasă un comentariu