Foros del Web » Programando para Internet » PHP »

Optimizar función: condicionales

Estas en el tema de Optimizar función: condicionales en el foro de PHP en Foros del Web. Buenas, Dentro de una clase, tengo una función para mostrar la paginacion de una tabla (de la que obtengo los datos de mysql). El caso ...
  #1 (permalink)  
Antiguo 05/06/2014, 03:35
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Optimizar función: condicionales

Buenas,

Dentro de una clase, tengo una función para mostrar la paginacion de una tabla (de la que obtengo los datos de mysql).

El caso es que funciona, no me da problemas... pero me parece un método feo, osco, y que no me termina de convencer:

Código PHP:
function getPages() {
        if(!
$this->_pagination_enabled) return "";
        if(
$this->_table_total_rows && $this->_table_total_rows $this->_limit) {
            
            
$total_paginas ceil($this->_table_total_rows $this->_limit);
            
            
$paginator '<ul class="pagination pull-right" style="margin: 0px;">';
            if(
$this->_page != 1$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="1">&laquo;</a></li>';
            
//      <li><a href="#">3</a></li>
            
if($total_paginas <= 5) {
                for(
$i 1$i 6$i++) {
                    
$cl "";
                    if(
$i == $this->_page$cl "class='active'";
                    
$paginator .= '<li '.$cl.'><a href="#" class="datatable_reload" data-id="'.$this->_id.'"  data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.$i.'">'.$i.'</a></li>';
                }
            }
            else {
                if(
$this->_page    && $this->_page < ($total_paginas 2)) {
                    
$paginator .= '<li><a href="#" class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 2).'">'.($this->_page 2).'</a></li>';    
                    
$paginator .= '<li><a href="#" class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';
                    
$paginator .= '<li class="active" ><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page).'">'.($this->_page).'</a></li>';
                    
$paginator .= '<li><a href="#" class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';    
                    
$paginator .= '<li><a href="#" class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 2).'">'.($this->_page 2).'</a></li>';
                }
                
                else if(
$this->_page == 1) {
                    
$paginator .= '<li class="active"><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page).'">'.($this->_page).'</a></li>';
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';    
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 2).'">'.($this->_page 2).'</a></li>';
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 3).'">'.($this->_page 3).'</a></li>';    
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 4).'">'.($this->_page 4).'</a></li>';
                }
                
                else if(
$this->_page == $total_paginas) {
                    
                    if(
$this->_page 0$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 4).'">'.($this->_page 4).'</a></li>';    
                    if(
$this->_page 0$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 3).'">'.($this->_page 3).'</a></li>';
                    if(
$this->_page 0$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 2).'">'.($this->_page 2).'</a></li>';    
                    if(
$this->_page 0$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';
                    
$paginator .= '<li class="active" ><a href="#" class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page).'">'.($this->_page).'</a></li>';
                }
                
                else if(
$this->_page == 2) {
                    
$paginator .= '<li><a href="#" class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';
                    
$paginator .= '<li class="active"><a href="#"  class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page).'">'.($this->_page).'</a></li>';
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';    
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 2).'">'.($this->_page 2).'</a></li>';
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 3).'">'.($this->_page 3).'</a></li>';    
                    
                }
                else if(
$this->_page == ($total_paginas 1)) {
                    if(
$this->_page 0$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 3).'">'.($this->_page 3).'</a></li>';
                    if(
$this->_page 0$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 2).'">'.($this->_page 2).'</a></li>';    
                    if(
$this->_page 0$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';
                    
$paginator .= '<li class="active"><a href="#"  class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page).'">'.($this->_page).'</a></li>';
                    if(
$this->_page <= $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.($this->_page 1).'">'.($this->_page 1).'</a></li>';    
                    
                }
            }
            
            
            
            
            if(
$this->_page != $total_paginas$paginator .= '<li><a href="#" class="datatable_reload" data-id="'.$this->_id.'" data-source="'.$this->_source.'" data-search="'.$this->_search_query.'" data-page="'.$total_paginas.'">&raquo;</a></li>';
            
$paginator .= '</ul>';    
            
            return 
$paginator;
        }
        else return 
"";
        
        
    } 
Creo que el código se entiende.... pero estoy "bloqueado" en cuanto lo miro. Me sobran condiciones, estoy casi seguro, pero me ofusco. Y eso que es código mío xD

Sé que es algo básico... pero no se me ocurre otra forma de condicionarlo.

¿Alguna idea?

PD: Sólo muestra 5 páginas, e inicio y final en caso de que no estés en ellas!
__________________
>> Eleazan's Source
>> @Eleazan
  #2 (permalink)  
Antiguo 05/06/2014, 05:55
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Optimizar función: condicionales

Código PHP:
Ver original
  1. if($this->_page - 4 > 0)
equivale a

Código PHP:
Ver original
  1. if($this->_page > 4)

Ademas... como se vuelve tan ilegible te aconsejaria algo que nunca hago: crea un alias de $this->_page a $page o $pg

Código PHP:
Ver original
  1. if($p > 4)

Tu problema principal es que no se entiende nada!

Ahora repite lo anterior 1.000.000 de veces y el codigo se vera achicado bastante:

Código PHP:
Ver original
  1. function getPages() {
  2.         if(!$this->_pagination_enabled) return "";
  3.         if($this->_table_total_rows > 0 && $this->_table_total_rows > $this->_limit) {
  4.              
  5.             $tot_p = ceil($this->_table_total_rows / $this->_limit);
  6.            
  7.             // alias
  8.             $p = $this->_page;
  9.             $q = $this->_search_query;
  10.             $s = $this->_source;
  11.             $id = $this->_id;
  12.            
  13.            
  14.             $out= '<ul class="pagination pull-right" style="margin: 0px;">';
  15.             if($p != 1) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="1">&laquo;</a></li>';
  16.             //      <li><a href="#">3</a></li>
  17.             if($tot_p <= 5) {
  18.                 for($i = 1; $i < 6; $i++) {
  19.                     $cl = "";
  20.                     if($i == $p) $cl = "class='active'";
  21.                     $out.= '<li '.$cl.'><a href="#" class="datatable_reload" data-id="'.$id.'"  data-source="'.$s.'" data-search="'.$q.'" data-page="'.$i.'">'.$i.'</a></li>';
  22.                 }
  23.             }
  24.             else {
  25.                 if($p    > 2 && $p < ($tot_p - 2)) {
  26.                     $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p - 2).'">'.($p - 2).'</a></li>';    
  27.                     $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p - 1).'">'.($p - 1).'</a></li>';
  28.                     $out.= '<li class="active" ><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p).'">'.($p).'</a></li>';
  29.                     $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p + 1).'">'.($p + 1).'</a></li>';    
  30.                     $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p + 2).'">'.($p + 2).'</a></li>';
  31.                 }
  32.                  
  33.                 else if($p == 1) {
  34.                     $out.= '<li class="active"><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p).'">'.($p).'</a></li>';
  35.                     if($p + 1 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 1).'">'.($p + 1).'</a></li>';    
  36.                     if($p + 2 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 2).'">'.($p + 2).'</a></li>';
  37.                     if($p + 3 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 3).'">'.($p + 3).'</a></li>';    
  38.                     if($p + 4 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 4).'">'.($p + 4).'</a></li>';
  39.                 }
  40.                  
  41.                 else if($p == $tot_p) {
  42.                      
  43.                     if($p - 4 > 0) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p - 4).'">'.($p - 4).'</a></li>';    
  44.                     if($p - 3 > 0) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p - 3).'">'.($p - 3).'</a></li>';
  45.                     if($p - 2 > 0) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p - 2).'">'.($p - 2).'</a></li>';    
  46.                     if($p - 1 > 0) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p - 1).'">'.($p - 1).'</a></li>';
  47.                     $out.= '<li class="active" ><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p).'">'.($p).'</a></li>';
  48.                 }
  49.                  
  50.                 else if($p == 2) {
  51.                     $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p - 1).'">'.($p - 1).'</a></li>';
  52.                     $out.= '<li class="active"><a href="#"  class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p).'">'.($p).'</a></li>';
  53.                     if($p + 1 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 1).'">'.($p + 1).'</a></li>';    
  54.                     if($p + 2 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 2).'">'.($p + 2).'</a></li>';
  55.                     if($p + 3 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 3).'">'.($p + 3).'</a></li>';    
  56.                      
  57.                 }
  58.                 else if($p == ($tot_p - 1)) {
  59.                     if($p - 3 > 0) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p - 3).'">'.($p - 3).'</a></li>';
  60.                     if($p - 2 > 0) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p - 2).'">'.($p - 2).'</a></li>';    
  61.                     if($p - 1 > 0) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p - 1).'">'.($p - 1).'</a></li>';
  62.                     $out.= '<li class="active"><a href="#"  class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p).'">'.($p).'</a></li>';
  63.                     if($p + 1 <= $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p + 1).'">'.($p + 1).'</a></li>';    
  64.                      
  65.                 }
  66.             }
  67.              
  68.              
  69.              
  70.              
  71.             if($p != $tot_p) $out.= '<li><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.$tot_p.'">&raquo;</a></li>';
  72.             $out.= '</ul>';    
  73.              
  74.             return $paginator;
  75.         }
  76.         else return "";
  77.          
  78.          
  79.     }


- Ahora que es mas "legible" ... refactoriza

- Por ultimo.. tienes a la vista muchisimo HTML generado in situ cuando podrias buscar otra forma que la concatenacion por ejemplo el patron Decorator
__________________
Salu2!

Última edición por Italico76; 05/06/2014 a las 06:06
  #3 (permalink)  
Antiguo 05/06/2014, 06:12
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Optimizar función: condicionales

Ahora... consideremos este pedazo:

Código PHP:
Ver original
  1. $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p - 2).'">'.($p - 2).'</a></li>';    
  2.  
  3.             $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p - 1).'">'.($p - 1).'</a></li>';
  4.  
  5.             $out.= '<li class="active" ><a href="#" class="datatable_reload" data-id="'.$id.'" data-source="'.$s.'" data-search="'.$q.'" data-page="'.($p).'">'.($p).'</a></li>';
  6.  
  7.             $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p + 1).'">'.($p + 1).'</a></li>';    
  8.              
  9.             $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p + 2).'">'.($p + 2).'</a></li>';

Acaso no es lo mismo que .... ?

Código PHP:
Ver original
  1. for ($k=-2;$k<3;$k++)
  2.                 $out.= '<li><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p + $k).'">'.($p + $k).'</a></li>';


Tienes un class="active" para $k=0 pero si lo necesitas no es dificil de arreglar:

Código PHP:
Ver original
  1. for ($k=-2;$k<3;$k++)
  2.     $out.= '<li'.($k==0 ? 'class="active"' : null).'><a href="#" class="datatable_reload" data-source="'.$s.'" data-id="'.$id.'" data-search="'.$q.'" data-page="'.($p + $k).'">'.($p + $k).'</a></li>';

Si te fijas... mas adelante solo cambias los rangos (0<=$k<5) y $s (tu $this->_source) reemplaza a $id (tu $this->_id) con algun cambio sutil como el de class="active" asi que en otra "iteracion de pensamientos" podria todo compactarse.... creeri todo tu metodo puede tener 15 lineas de codigo como sobrado

Igualmente yo pasaria esas varibles a una "vista" o "sub-vista" y ahi haria ese for()
__________________
Salu2!

Última edición por Italico76; 05/06/2014 a las 06:59
  #4 (permalink)  
Antiguo 05/06/2014, 08:07
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: Optimizar función: condicionales

Al final, he hecho algo así

Código PHP:
function getPageLine($page$title "") {
        return 
'<li '.($page == $this->_page 'class="active"' null ).'><a href="#" class="datatable_reload" data-source="'.$this->_source.'" data-id="'.$this->_id.'" data-search="'.$this->_search_query.'" data-page="'.($page).'">'.($title == "" $page $title).'</a></li>';
    }
    
    function 
getPages() {
        if(!
$this->_pagination_enabled) return "";
        if(
$this->_table_total_rows && $this->_table_total_rows $this->_limit) {
            
            
$total_paginas ceil($this->_table_total_rows $this->_limit);
            
            
$paginator '<ul class="pagination pull-right" style="margin: 0px;">';
            if(
$this->_page != 1$paginator .= $this->getPageLine(1"&laquo;");
            
            
$page_lines = array();
            for(
$i = ($this->_page 2); $i <= ($this->_page 2); $i++) {
                
$page $i $i 5-abs($i);
                if(
$page $total_paginas$page $i 5;
                
$page_lines[$page] = $this->getPageLine($page);
                            
            }
            
ksort($page_lines);
                
            foreach(
$page_lines as $line$paginator .= $line;
                
            if(
$this->_page != $total_paginas$paginator .= $this->getPageLine($total_paginas"&raquo;");
            
$paginator .= '</ul>';    
            
            return 
$paginator;
        }
        else return 
"";
        
        
    } 
Que creo que es más legible que el anterior.

Voy a darle un vistazo al Decorator :P
__________________
>> Eleazan's Source
>> @Eleazan

Última edición por Eleazan; 05/06/2014 a las 08:14
  #5 (permalink)  
Antiguo 05/06/2014, 08:52
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: Optimizar función: condicionales

Decorator para producir html pero creo que para un paginador no tiene mucho que ver.

Mejor mira esto


<< parece interesante
__________________
Salu2!

Etiquetas: condicionales, mysql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:06.