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

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.

Related

How to display stars (1 to 5) from the value present in database

I have developed a page that shows the details of user achievements. I have a table that holds the level of the user.
Users( id, username, password, sum_score, level)
Based on the value present in level(i.e., from 0 to 5) I would like to like to display stars in the user page.
I tried something like :
$stars = "";
$s = 1;
while ($s<=$lvl['level']) {
$stars.="★";
$s++;
}
echo "$stars";
The above code produces star based on the level.(i.e., if the level is 1 it shows one star on the page). But I want to display 5 stars and fill the stars based on the level in the table. Can Someone help me out.
Instead of using while, you can use a simple for loop in this case.
Assuming $lvl['level'] is properly getting database's data (i.e., 5), you can loop until 5 compare it with $lvl['level'] value, and display the star based on the if statement's result. Like so:
$stars = "";
for ($i = 1; $i <= 5; $i++) {
$i <= $lvl['level'] ? $stars .= "★" : $stars .= "☆";
}
echo $stars;
str_repeat is one option.
// stub for your record
$lvl = [
'level' => 4
];
// render
$maxStars = 5;
$stars = (int)$lvl['level'];
$output =
str_repeat('★', $stars) .
str_repeat('☆', $maxStars - $stars) .
' stars';
echo $output;
Output: https://3v4l.org/UFprQ
If you add some classes and holders and add one if statement in the loop
<?php
$lvl = ["id" => 1, "level" => 4];
$stars = "";
for ($i = 1; $i < 6; $i++) {
$stars .= '<span' . (($i <= $lvl["level"]) ? ' class="fill"' : '') . '>';
$stars .='★</span>';
}
echo '<div class="star"><div class="rating">' . $stars . '</div></div>';
Here is the snippet, HTML code is the output of the PHP:
.star {
width: 200px;
position: relative;
color: #bdbdbd;
}
.rating span {
font-size: 30px;
margin-left: -4px;
white-space: nowrap;
overflow: hidden;
}
.rating span:before {
content: "\2605";
position: absolute;
color: gray;
}
.rating span.fill:before {
content: "\2605";
position: absolute;
color: gold;
}
<!-- this will be the output generated from php code used above !-->
<div class="star">
<div class="rating"><span class="fill">★</span><span class="fill">★</span><span class="fill">★</span><span>★</span><span>★</span></div>
</div>

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

Pagination in PHP - how to do it properly?

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

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

Categories