Pagination in PHP - how to do it properly? - php

I want to create a page navigation that has buttons for the current page and the 4 closest existing pages. Here are a few examples.
If the current page is 5, then the user should be shown buttons for pages 3, 4, 5, 6, 7.
If the current page is 1 - 1, 2, 3, 4, 5
If the current page is 8 but there are only 9 pages - 5, 6, 7, 8, 9
I hope you get the idea. The following variables that can be used:
$firstPage
$previousPage
$currentPage
$nextPage
$lastPage
How would you do this? Or is there a better logic that can be used in regard to which pages to show buttons for in the navigation?

I have done my own Paginator class, it is in english but comments are on spanish.
It's really easy to use. The constructor requires the total of elements to list, current page, elements limit per page, and the section you are in (by section I mean, if you are doing pagination by sections).
So, if you have to paginate 100 items (10 items per page), in "Cars" section and you are on first page, you do this:
$paginator = new Paginador(100, 1, 10, "Cars");
echo $paginator->procesarHTML();
This will echo the HTML. To change the HTML formated modify procesarHTML(). So you will get buttons to each page (PAGE). The current page will have a css class attached to it to let the user know in what page it is.
Remember to edit class variable $_secciones. Add the sections you allow to go to.
<?php
/*------------------------------------------------------------------
-- Descripcion: Clase para Paginar con la Clase Template HTML.
-- Version: v 1.1.0 | Ultima version: v 1.0.0
-- Ultima Edicion: 23/05/2016 08:41
--------------------------------------------------------------------
-- Autor: Matias Hernan Lauriti | matiaslauriti#gmail.com
-- Fecha Creacion: 25/05/2014
--------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-------------------------------- CSS -------------------------------
#paginador{ margin-bottom: 5px; }
#paginador ol{ text-align: center; }
#paginador ol li{
margin-top: 8px;
display: inline-block;
font-family: Arial;
}
#paginador ol li a{
height: 24px;
background-color: #454648;
background-image: linear-gradient(#454648,#2F2F31);
background-image: -webkit-linear-gradient(#454648,#2F2F31);
background-image: -moz-linear-gradient(top,#454648,#2F2F31);
background-image: -o-linear-gradient(top,#454648,#2F2F31);
background-image: -ms-linear-gradient(top,#454648,#2F2F31);
box-shadow: 0 2px 5px 0px #000, 0px 1px 0px 0px #5B5C5D inset;
padding: 3px 8px;
border-radius: 3px;
font-size: 12px;
}
#paginador ol li a:hover{
background-color: #FBB92C;
background-image: linear-gradient(#FBB92C,#D49B29);
background-image: -webkit-linear-gradient(#FBB92C,#D49B29);
background-image: -moz-linear-gradient(top,#FBB92C,#D49B29);
background-image: -o-linear-gradient(top,#FBB92C,#D49B29);
background-image: -ms-linear-gradient(top,#FBB92C,#D49B29);
box-shadow: 0 2px 5px 0px #000, 0px 1px 0px 0px #EECF91 inset;
}
#paginador ol li a:active{
background-color: #454648;
background-image: linear-gradient(#454648,#2F2F31);
background-image: -webkit-linear-gradient(#454648,#2F2F31);
background-image: -moz-linear-gradient(top,#454648,#2F2F31);
background-image: -o-linear-gradient(top,#454648,#2F2F31);
background-image: -ms-linear-gradient(top,#454648,#2F2F31);
box-shadow: 0px 0px 1px 0px #262626 inset, 0 -1px 1px 0 #000;
}
#paginador ol li a.seleccionado{
background-color: #272728;
background-image: linear-gradient(#272728,#2F2F31);
background-image: -webkit-linear-gradient(#272728,#2F2F31);
background-image: -moz-linear-gradient(top,#272728,#2F2F31);
background-image: -o-linear-gradient(top,#272728,#2F2F31);
background-image: -ms-linear-gradient(top,#272728,#2F2F31);
box-shadow: 0px 0px 1px 0px #262626 inset, 0 -1px 1px 0 #000;
}
---------------------------- Utilización ---------------------------
$paginador = new Paginador($row['total'], PAGINA, 10, SECCION);
echo $paginador->procesarHTML();
--------------------------------------------------------------------*/
class Paginador {
/* Variables */
private $_total = 1;
private $_paginaActual = 1;
private $_limitePorPagina = 10;
private $_paginasTotales = 1;
private $_seccion = 'noticias'; // Seccion Default
private $_secciones = array('noticias','videos'); // Secciones que tomo como validas desde 1 hasta n
/* Metodos */
public function __construct($total = 1, $paginaActual = 1, $limitePorPagina = 10, $seccion = NULL) {
$this->_setTotal($total); // Total de elementos a listar
$this->_setPaginaActual($paginaActual);
$this->_setLimitePorPagina($limitePorPagina); // Limite de elementos a listar por página
$this->_setSeccion($seccion); // Sección inicial
$this->_procesar();
}
private function _setPaginaActual($pagina) {
if(!empty($pagina) && is_numeric($pagina) && $pagina > 0) $this->_paginaActual = $pagina;
}
private function _setLimitePorPagina($limite) {
if(!empty($limite) && is_numeric($limite) && $limite > 0) $this->_limitePorPagina = $limite;
}
private function _setTotal($total) {
if(!empty($total) && is_numeric($total) && $total > 0) $this->_total = $total;
}
private function _setSeccion($seccion) {
if(in_array($seccion,$this->_secciones)) $this->_seccion = $seccion;
}
private function _procesar() {
$this->_paginasTotales = ceil( $this->_total / $this->_limitePorPagina); // Redondeo para arriba, si tengo 1.5 paginas, tengo 2 para mostrar el .5 restante
if($this->_paginaActual > $this->_paginasTotales) $this->_paginaActual = 1;
}
public function getLimit($ordenAscendente = true) {
if($ordenAscendente == true) {
if($this->_total - ($this->_paginaActual * $this->_limitePorPagina) < 0)
return '0';
return ($this->_total - ($this->_paginaActual * $this->_limitePorPagina));
}else
return (($this->_paginaActual - 1) * $this->_limitePorPagina);
}
public function procesarHTML($sufijo = '', $sig_ant = true, $prim_ult = true) {
$paginadorHTML = NULL;
if($this->_paginasTotales > 0) {
$paginadorHTML = ' <nav id="paginador">';
$paginadorHTML .= ' <ol>';
if($this->_paginasTotales > 2 && $this->_paginaActual > 1 && $prim_ult == true) $paginadorHTML .= ' <li><< Primera</li>';
if($this->_paginasTotales > 1 && $this->_paginaActual > 1 && $sig_ant == true) $paginadorHTML .= ' <li><<</li>';
for($i = 1; $i <= $this->_paginasTotales; $i++)
$paginadorHTML .= ' <li><a href="/'.$sufijo.$this->_seccion.'/'.$i.'/#pagina"'.($this->_paginaActual == $i ? ' class="seleccionado"' : '').'>'.$i.'</a></li>';
if($this->_paginasTotales > 1 && $this->_paginaActual < $this->_paginasTotales && $sig_ant == true) $paginadorHTML .= ' <li>>></li>';
if($this->_paginasTotales > 2 && $this->_paginaActual < $this->_paginasTotales && $prim_ult == true) $paginadorHTML .= ' <li>Ultima >></li>';
$paginadorHTML .= ' </ol>';
$paginadorHTML .= ' </nav>';
}
return $paginadorHTML;
}
}
?>

Just like that:
<?php
$currentPage = 5;
$lastPage = 9;
$firstPage = 1;
$between = 3;
function output($current, $limit, $between, $isAfter = false)
{
$i = $isAfter ? $current + 1 : $current - $between;
$max = $i + $between;
for ($i; $i < $max; $i++)
echo "<a href='#'>Page {$i}</a>";
}
if ($currentPage > $firstPage)
output($currentPage, $lastPage, $between);
echo "Page {$currentPage}!";
if ($currentPage < $lastPage)
output($currentPage, $lastPage, $between, true);

Related

PHP - Splitting stylesheet into arrays

I would like to split stylesheet into arrays in a way that every selector is in separeted array with his style. I have this code so far and it is working good, but not in situations where there are media queries. What I would like to achieve is that I split selectors inside media query into single arrays but that each of them has his media query selector as well.
This is example of style in HTML
<style>
#abc{ background-color: gray; font-size: 10px;}
.abc { background-color: gray; font-size: 10px;}
#media only screen and (max-width:640px) {
#abc {
height: 200px !important;
}
}
#media only screen and (max-width:640px) {
#abcd {
height: 200px !important;
}
.abcd {
height: 200px !important;
}
}
</style>
This is code I have so far:
$dom = new DomDocument();
#$dom->loadHTML($html);
$para = $dom->getElementsByTagName('style'); #DOMNodeList
if ($para instanceof DOMNodeList) {
foreach ($para as $node) {
printf ($node->nodeValue);
}
}
$file = $node->nodeValue;
$arrs = explode('}', $file);
for ($i = 0; $i < count($arrs); $i++)
{
echo 'style ' . $i . ' - ' . $arrs[$i] . '<br />';
}
This is uotput I'm getting:
style 0 - #abc{ background-color: gray; font-size: 10px;
style 1 - .abc { background-color: gray; font-size: 10px;
style 2 - #media only screen and (max-width:640px) { #abc { height: 200px !important;
style 3 -
style 4 - #media only screen and (max-width:640px) { #abcd { height: 200px !important;
style 5 - .abcd { height: 200px !important;
Wanted output:
style 0 - #abc{ background-color: gray; font-size: 10px;
style 1 - .abc { background-color: gray; font-size: 10px;
style 2 - #media only screen and (max-width:640px) { #abc { height: 200px !important;
style 3 -
style 4 - #media only screen and (max-width:640px) { #abcd { height: 200px !important;
style 5 - #media only screen and (max-width:640px) { .abcd { height: 200px !important;
What would be proper way to get that?
You could try something like this, just keep in mind that this answer requires that you know or make sure that media queries are the last part of the stylesheet and that there are no other styles declared between one media and another, following the format of your example. Then you could do something like this:
...
$file = $node->nodeValue;
$parts = explode('#media', $file);
// The first part of the stylesheet, where there are no media queries
$styleCount = 0;
$arrs = explode('}', $parts[0]);
for ($i = 0; $i < count($arrs); $i++)
{
echo 'style ' . $i . ' - ' . $arrs[$i] . '<br />';
$styleCount++;
}
// The media queries, remember to validate that there exists at least one before
for ($i = 1; $i < count($parts); $i++){
$arrs = explode('{', $parts[$i], 2);
$title = "#media " . $arrs[0];
$arrIn = explode('}', $arrs[1]);
for($j = 0; $j < count($arrIn); $j++){
// Validate for an empty space or a new line, it could be just something like strlen($arrIn[$j]) > 3
if(strlen($arrIn[$j]) > 4){
echo 'style ' . $styleCount . ' - ' . $title . " { " . $arrIn[$j] . '</br>';
$styleCount++;
}
}
}

CodeIgniter pagination customization

I need to customize codeigniter pagination. Currently pagination on my site is working like this. (I am using CI pagination library)
I want my pagination to look and work like this
What can I do with codeigniter's pagination library for this?
Is there already any customized library on internet? Or I have to create my own?
My $config array is
$config['first_link'] = false;
$config['last_link'] = false;
$config ['prev_link'] = '<i class="fa fa-caret-left"></i>';
$config ['next_link'] = '<i class="fa fa-caret-right"></i>';
$config ['num_links'] = 2;
$config ['base_url'] = 'My base url';
$config ['total_rows'] = 50;
$config ["per_page"] = 10;
$config ["uri_segment"] = 4;
$config ['use_page_numbers'] = TRUE;
Finally I came up with the solution by extending CI pagination library.
Created new class Mypagination and overrided the default create_links() method.
Here is the code
class Mypagination extends CI_Pagination {
function __construct()
{
parent::__construct();
}
public function create_links()
{
// If our item count or per-page total is zero there is no need to continue.
// Note: DO NOT change the operator to === here!
if ($this->total_rows == 0 OR $this->per_page == 0)
{
return '';
}
// Calculate the total number of pages
$num_pages = (int) ceil($this->total_rows / $this->per_page);
// Is there only one page? Hm... nothing more to do here then.
if ($num_pages === 1)
{
return '';
}
// Check the user defined number of links.
$this->num_links = (int) $this->num_links;
if ($this->num_links < 0)
{
show_error('Your number of links must be a non-negative number.');
}
// Keep any existing query string items.
// Note: Has nothing to do with any other query string option.
if ($this->reuse_query_string === TRUE)
{
$get = $this->CI->input->get();
// Unset the controll, method, old-school routing options
unset($get['c'], $get['m'], $get[$this->query_string_segment]);
}
else
{
$get = array();
}
// Put together our base and first URLs.
// Note: DO NOT append to the properties as that would break successive calls
$base_url = trim($this->base_url);
$first_url = $this->first_url;
$query_string = '';
$query_string_sep = (strpos($base_url, '?') === FALSE) ? '?' : '&';
// Are we using query strings?
if ($this->page_query_string === TRUE)
{
// If a custom first_url hasn't been specified, we'll create one from
// the base_url, but without the page item.
if ($first_url === '')
{
$first_url = $base_url;
// If we saved any GET items earlier, make sure they're appended.
if ( ! empty($get))
{
$first_url .= $query_string_sep.http_build_query($get);
}
}
// Add the page segment to the end of the query string, where the
// page number will be appended.
$base_url .= $query_string_sep.http_build_query(array_merge($get, array($this->query_string_segment => '')));
}
else
{
// Standard segment mode.
// Generate our saved query string to append later after the page number.
if ( ! empty($get))
{
$query_string = $query_string_sep.http_build_query($get);
$this->suffix .= $query_string;
}
// Does the base_url have the query string in it?
// If we're supposed to save it, remove it so we can append it later.
if ($this->reuse_query_string === TRUE && ($base_query_pos = strpos($base_url, '?')) !== FALSE)
{
$base_url = substr($base_url, 0, $base_query_pos);
}
if ($first_url === '')
{
$first_url = $base_url.$query_string;
}
$base_url = rtrim($base_url, '/').'/';
}
// Determine the current page number.
$base_page = ($this->use_page_numbers) ? 1 : 0;
// Are we using query strings?
if ($this->page_query_string === TRUE)
{
$this->cur_page = $this->CI->input->get($this->query_string_segment);
}
else
{
// Default to the last segment number if one hasn't been defined.
if ($this->uri_segment === 0)
{
$this->uri_segment = count($this->CI->uri->segment_array());
}
$this->cur_page = $this->CI->uri->segment($this->uri_segment);
// Remove any specified prefix/suffix from the segment.
if ($this->prefix !== '' OR $this->suffix !== '')
{
$this->cur_page = str_replace(array($this->prefix, $this->suffix), '', $this->cur_page);
}
}
// If something isn't quite right, back to the default base page.
if ( ! ctype_digit($this->cur_page) OR ($this->use_page_numbers && (int) $this->cur_page === 0))
{
$this->cur_page = $base_page;
}
else
{
// Make sure we're using integers for comparisons later.
$this->cur_page = (int) $this->cur_page;
}
// Is the page number beyond the result range?
// If so, we show the last page.
if ($this->use_page_numbers)
{
if ($this->cur_page > $num_pages)
{
$this->cur_page = $num_pages;
}
}
elseif ($this->cur_page > $this->total_rows)
{
$this->cur_page = ($num_pages - 1) * $this->per_page;
}
$uri_page_number = $this->cur_page;
// If we're using offset instead of page numbers, convert it
// to a page number, so we can generate the surrounding number links.
if ( ! $this->use_page_numbers)
{
$this->cur_page = (int) floor(($this->cur_page/$this->per_page) + 1);
}
// Calculate the start and end numbers. These determine
// which number to start and end the digit links with.
$start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1;
$end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages;
// And here we go...
$output = '';
// Render the "Previous" link.
if ($this->prev_link !== FALSE && $this->cur_page !== 1)
{
$i = ($this->use_page_numbers) ? $uri_page_number - 1 : $uri_page_number - $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
if ($i === $base_page)
{
// First page
$output .= $this->prev_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('prev').'>'
.$this->prev_link.'</a>'.$this->prev_tag_close;
}
else
{
$append = $this->prefix.$i.$this->suffix;
$output .= $this->prev_tag_open.'<a href="'.$base_url.$append.'"'.$attributes.$this->_attr_rel('prev').'>'
.$this->prev_link.'</a>'.$this->prev_tag_close;
}
}
// Render the "First" link.
if ($this->first_link !== FALSE && $this->cur_page > ($this->num_links + 1 + ! $this->num_links))
{
// Take the general parameters, and squeeze this pagination-page attr in for JS frameworks.
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, 1);
$output .= $this->first_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('start').'>'
.$this->first_link.'</a>'.$this->first_tag_close;
}
// Render the pages
if ($this->display_pages !== FALSE)
{
/*
* On page 4, show hidden page 2
*/
if($start == 4){
$start--;
}
/*
* On pages after 4, show dots before pages
*/
if(($start)>4){
$output .= '<div class="continues">. . .</div>';
}
/*
* On page 4th last, show hidden page 2nd last
*/
if($start == ($num_pages-3) && $start > 4){
$end++;
}
/*
* On last page, show hidden page 3rd last
*/
if($start == $num_pages && $start>3){
$start--;
}
/*
* On page 1, show hidden page 3
*/
if($start == 1 && $end < $num_pages-1){
$end++;
}
// Write the digit links
for ($loop = $start -1; $loop <= $end; $loop++)
{
$i = ($this->use_page_numbers) ? $loop : ($loop * $this->per_page) - $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
if ($i >= $base_page)
{
if ($this->cur_page === $loop)
{
// Current page
$output .= $this->cur_tag_open.$loop.$this->cur_tag_close;
}
elseif ($i === $base_page)
{
// First page
$output .= $this->num_tag_open.'<a href="'.$first_url.'"'.$attributes.$this->_attr_rel('start').'>'
.$loop.'</a>'.$this->num_tag_close;
}
else
{
$append = $this->prefix.$i.$this->suffix;
$output .= $this->num_tag_open.'<a href="'.$base_url.$append.'"'.$attributes.$this->_attr_rel('start').'>'
.$loop.'</a>'.$this->num_tag_close;
}
}
}
/*
* On pages before last, show dots
*/
if($end < ($num_pages-1)){
$output .= '<div class="continues">. . .</div>';
}
}
// Render the "Last" link
if ($this->last_link !== FALSE && ($this->cur_page + $this->num_links + ! $this->num_links) < $num_pages)
{
$i = ($this->use_page_numbers) ? $num_pages : ($num_pages * $this->per_page) - $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
$output .= $this->last_tag_open.'<a href="'.$base_url.$this->prefix.$i.$this->suffix.'"'.$attributes.'>'
.$this->last_link.'</a>'.$this->last_tag_close;
}
// Render the "next" link
if ($this->next_link !== FALSE && $this->cur_page < $num_pages)
{
$i = ($this->use_page_numbers) ? $this->cur_page + 1 : $this->cur_page * $this->per_page;
$attributes = sprintf('%s %s="%d"', $this->_attributes, $this->data_page_attr, (int) $i);
$output .= $this->next_tag_open.'<a href="'.$base_url.$this->prefix.$i.$this->suffix.'"'.$attributes
.$this->_attr_rel('next').'>'.$this->next_link.'</a>'.$this->next_tag_close;
}
// Kill double slashes. Note: Sometimes we can end up with a double slash
// in the penultimate link so we'll kill all double slashes.
$output = preg_replace('#([^:])//+#', '\\1/', $output);
// Add the wrapper HTML if exists
return $this->full_tag_open.$output.$this->full_tag_close;
}
}
I have added
/*
* my comments here
*/
styled comments before code where I made changes.
Use
$config['num_links'] = 4;
in your $config array.
Try CSS here is an example - once used this and it worked
.dataTables_wrapper .dataTables_info.dataTables_paginate .pagination,
.dataTables_wrapper .dataTables_paginate.dataTables_paginate .pagination {
margin: 0;
}
.pagination {
display: inline-block;
padding-left: 0;
margin: 17px 0;
border-radius: 3px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
line-height: 1.42857143;
text-decoration: none;
color: #373e4a;
background-color: #fff;
border: 1px solid #ddd;
margin-left: -1px;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
z-index: 2;
color: #818da2;
background-color: #eeeeee;
border-color: #ddd;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 3;
color: #fff;
background-color: #373e4a;
border-color: #949494;
cursor: default;
}
.pagination > .disabled > span,
.pagination > .disabled > span:hover,
.pagination > .disabled > span:focus,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #999999;
background-color: #fff;
border-color: #ddd;
cursor: not-allowed;
}
.pagination-lg > li > a,
.pagination-lg > li > span {
padding: 10px 16px;
font-size: 15px;
line-height: 1.3333333;
}
.pagination-lg > li:first-child > a,
.pagination-lg > li:first-child > span {
border-bottom-left-radius: 3px;
border-top-left-radius: 3px;
}
.pagination-lg > li:last-child > a,
.pagination-lg > li:last-child > span {
border-bottom-right-radius: 3px;
border-top-right-radius: 3px;
}
.pagination-sm > li > a,
.pagination-sm > li > span {
padding: 5px 10px;
font-size: 11px;
line-height: 1.5;
}
.pagination-sm > li:first-child > a,
.pagination-sm > li:first-child > span {
border-bottom-left-radius: 2px;
border-top-left-radius: 2px;
}
.pagination-sm > li:last-child > a,
.pagination-sm > li:last-child > span {
border-bottom-right-radius: 2px;
border-top-right-radius: 2px;
}
.pager {
padding-left: 0;
margin: 17px 0;
list-style: none;
text-align: center;
}
.pager li {
display: inline;
}
.pager li > a,
.pager li > span {
display: inline-block;
padding: 5px 14px;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 3px;
}
.pager li > a:hover,
.pager li > a:focus {
text-decoration: none;
background-color: #eeeeee;
}
.pager .next > a,
.pager .next > span {
float: right;
}
.pager .previous > a,
.pager .previous > span {
float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
color: #999999;
background-color: #fff;
cursor: not-allowed;
}

Possible to turn a php cycle function into a double barrel system?

Is there a simple way to modify this php:
function cycleCols() {
$p = "transparent;";
$s = "#efefef;";
static $lastColour;
$lastColour = ($lastColour == $p) ? $s : $p;
return $lastColour;
}
To get it to cycle like this:
transparent;
transparent;
#efefef;
#efefef;
transparent;
transparent;
#efefef;
#efefef;
Etc, instead of how it does now..
transparent;
#efefef;
transparent;
#efefef;
Etc... or does something else entirely need to be built to do this?
function cycleCols() {
static $colors = ['transparent;', '#efefef;'], $i = 0;
$selectColor = ($i++/2 % 2 == 0) ? 0 : 1;
return $colors[$selectColor];
}
Increment a counter ($i), divide it by 2, then check if it's even/odd.

Do something with every X item in while loop

$i = 0;
while ($have_something) {
if($i == 0 || $i == 3 || $i == 6 || $i == 9) {
$color = 'black';
}
else {
$color = 'white';
}
$i++;
}
Problem occurs with this code when count of items in while loop is dynamic and changes regulary, also when it could have hundreds of items which means that if statement would be very long.
How to overcome this problem and "automate" it so that something happens with every X item and something else for the rest without hardcoding $i count?
Use the modulus operator %:
$i = 0;
while ($have_something) {
if($i % 3 == 0 ) {
$color = 'black';
}
else {
$color = 'white';
}
$i++;
}
An alternative to using php to generate what I assume will be a class or inline color definition would be purely in css by using the nth-of-type(3n) style selector.
<style>
#rep{ width:80%; float:none; margin:5rem auto; box-sizing:border-box; padding:1rem; }
#rep div{ width:100%; float:none; margin:0.1rem auto; box-sixing:border-box; border:1px solid black; }
#rep div:nth-of-type(2n){ background:whitesmoke; }
#rep div:nth-of-type(3n){ background:gray; }
#rep div:nth-of-type(4n){ background: #f0ffff; }
#rep div:nth-of-type(5n){ background: #f0fff0; }
#rep div:nth-of-type(6n){ background: #e0ffff; }
#rep div:nth-of-type(7n){ background: #f0f8ff; }
#rep div:nth-of-type(8n){ background: #e6e6fa; }
#rep div:nth-of-type(9n){ background: #b0e0e6; }
</style>
echo "<div id='rep'>";
for( $i=0; $i < 30; $i++ ) echo "<div>$i</div>";
echo "</div>";
Anyway, just a thought!
or, a better css selector is nth-child perhaps
#rep div:nth-child(3n){background:black;}
if you are interested in this technique this would be a handy guide possibly

Limit Pagination Numbers For Huge Databases

I can't seem to find the answer anyway so guess I need to ask at least I did try google anyway I am making a group feature similar to the one facebook has got but not as good since i'm the only one developing this but over time it get better.
Anyway,
how can I make this code limit the pagination numbers? for example if there is loads of results in the database I only want to first 10 to be displayed after that use dots so they can click and go more in depth if they want to so when the click the dot they get another 10 results so 20-30 will then be displayed as pagination. I don't need it exactly like this but some way to limit the ammount of numbers being displayed at a time.
Here;s the code
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
#content
{
width: 900px;
margin: 0 auto;
font-family:Arial, Helvetica, sans-serif;
}
.page
{
float: right;
margin: 0;
padding: 0;
}
.page li
{
list-style: none;
display:inline-block;
}
.page li a, .current
{
display: block;
padding: 5px;
text-decoration: none;
color: #8A8A8A;
}
.current
{
font-weight:bold;
color: #000;
}
.button
{
padding: 5px 15px;
text-decoration: none;
background: #333;
color: #F3F3F3;
font-size: 13PX;
border-radius: 2PX;
margin: 0 4PX;
display: block;
float: left;
}
</style>
</head>
<body>
<div id="content">
<?php
error_reporting(0);
$query1=mysql_connect("localhost","root","");
mysql_select_db("freeze_demo",$query1);
error_reporting(0);
$start=0;
$limit=1;
if(isset($_GET['id']))
{
$id=$_GET['id'];
$start=($id-1)*$limit;
}
$query=mysql_query("select * from pagination LIMIT $start, $limit");
echo "<ul>";
while($query2=mysql_fetch_array($query))
{
echo "<li>".$query2['text1']."</li>";
}
echo "</ul>";
$rows=mysql_num_rows(mysql_query("select * from pagination"));
$total=ceil($rows/$limit);
if($id>1)
{
echo "<a href='?id=".($id-1)."' class='button'>PREVIOUS</a>";
}
if($id!=$total)
{
echo "<a href='?id=".($id+1)."' class='button'>NEXT</a>";
}
echo "<ul class='page'>";
for($i=1;$i<=$total;$i++)
{
if($i==$id) { echo "<li class='current'>".$i."</li>"; }
else { echo "<li><a href='?id=".$i."'>".$i."</a></li>"; }
}
echo "</ul>";
?>
</div>
</body>
</html>
Just basically need to update it for the future when my database or a certain group gets bigger.
Thanks
<?php
function custom_pagination($page, $totalpage, $link, $show) //$link = '&page=%s'
{
//show page
if($totalpage == 0)
{
return 'Page 0 of 0';
} else {
$nav_page = '<div class="navpage"><span class="current">Page '.$page.' of '.$totalpage.': </span>';
$limit_nav = 3;
$start = ($page - $limit_nav <= 0) ? 1 : $page - $limit_nav;
$end = $page + $limit_nav > $totalpage ? $totalpage : $page + $limit_nav;
if($page + $limit_nav >= $totalpage && $totalpage > $limit_nav * 2){
$start = $totalpage - $limit_nav * 2;
}
if($start != 1){ //show first page
$nav_page .= '<span class="item"> [1] </span>';
}
if($start > 2){ //add ...
$nav_page .= '<span class="current">...</span>';
}
if($page > 5){ //add prev
$nav_page .= '<span class="item">«</span>';
}
for($i = $start; $i <= $end; $i++){
if($page == $i)
$nav_page .= '<span class="current">'.$i.'</span>';
else
$nav_page .= '<span class="item"> ['.$i.'] </span>';
}
if($page + 3 < $totalpage){ //add next
$nav_page .= '<span class="item">»</span>';
}
if($end + 1 < $totalpage){ //add ...
$nav_page .= '<span class="current">...</span>';
}
if($end != $totalpage) //show last page
$nav_page .= '<span class="item"> ['.$totalpage.'] </span>';
$nav_page .= '</div>';
return $nav_page;
}
}
//using
if(isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = 1;
}
$sql = "SELECT count(*) AS total FROM post ORDER BY idpost DESC"; //please select COUNT is fast
$result = mysql_query($sql);
$rows = mysql_fetch_array($result);
$show = 5; //Show 5 result per page
$totalpage = ceil($rows['total'] / $show); //Total page
$start = ($page * $show) - $show; //Start result
$yourQuery = "SELECT * FROM post ORDER BY id LIMIT $start, $show";
//Query and show here
//Show pagination
echo custom_pagination($page, $totalpage, 'index.php?action=detail&page=%s', $show);
?>
Given that $id is a page number (perhaps refactor this to be $page so it it recognised as a page number, rather an a unique id of a particular record), you would change the final for loop to be a bit more restrictive.
For example, instead of starting at 1, start from 5 pages before the current page. And instead of ending at $total, end at 5 pages after the current page.
$start = $id - 5.
if ($start < 1) {
$start = 1;
}
$end = $id + 5;
if ($end > $total) {
$end = $total;
}
for ($i = $start; $i <= $end; $i++) {
// echo pagination options
}
You could also modify this to give links that will get you closer to where you want to go (i.e. if displaying pages 20 to 30, of 100 pages, show links for pages 10, 40, 50 and 60, or even supply an input box to let you jump to a specific page.

Categories