Translate

lunes, 20 de marzo de 2017

Cuál es el mejor método para paginar relaciones



Cuando te enfrentas a numerar las páginas o paginar una relación o lista , buscando un mejor acceso, a partir de código HTML, deberías darle unas cuantas vueltas y observar cómo lo hacen los mejores.

Existen tres formas de paginar una relación :

- Paginacion tradicional, dividiendo la relación en grupos de 10, 25, 50 o cualquier cantidad de registros a mostrar. Y al final se incluyen enlaces para avanzar y retroceder página a página.

- Cargar más, emplea AJAX para añadir contenido a petición, pulsando un botón.

- Scroll infinito, la página web crece con solo bajar el ratón, también se carga mediante AJAX pero sin hacer ningún click con el ratón.

En los últimos dos casos, crean páginas monstruosas de difícil navegación con el ratón o mediante los botones del navegador, además de no estar recomendado para acceder con dispositivos de lectura automática ( WAI-ARIA ), por tanto no serán objeto de este artículo.

Para la primera opción existen muchas variantes que vamos a explorar.

Cómo paginar como GOOGLE :

GMAIL :

AMAZON:
ALEXA
EBAY

20 MINUTOS

Buscando la mejor solución

- Botones ANTERIOR y SIGUIENTE en forma de icono.
- Lista numerada con indicación del total de páginas, con la indicación de posición actual y de cuantos items contiene cada página.
- Mostar una relación limitada al espacio disponible o inferior.
- Botones con tamaño adecuado para todos los dispositivos y recuadros visibles. Esto es crítico para la navegación con dispositivos móviles.

Los ejemplos anteriores tienen años de experiencia y probablemente hayan empleado infinidad de recursos hasta llegar a su estado.  Partiendo de este punto, vamos a crear con código PYTHON, un resultado HTML dinámico, en función de los parámetros.

Código paginación

Los parámetros que emplearemos :  pagina_actual,  total_registros y registros_por_pagina

Registros totales : items
Registros por página : items4page
Página actual : page


#!/usr/bin/env python
# -*- coding: utf-8 -*-



def pagination(items=0,items4page=20,page=1):
    __name__ = "pagination.pagination"
    LOG = logging.getLogger(__name__)

    sys.stdout = sys.stderr
    logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)

    try:
        total_pages = int(items/items4page) if items%items4page==0 else int(items/items4page)+1
        page_list = []
        if page==1:
            #page_list.append(['',1,False])
            page_list.append(['',1,False])
        elif page>1:
            #page_list.append(['',page-1,False])
            page_list.append(['',page-1,False])

            
        if page-1>0 and page
            if page>2:
                page_list.append([repr(1),1,False])
                if page-2<>1:
                    page_list.append(['...',None,False])
            if page-1>0:
                page_list.append([repr(page-1),page-1,False])
            page_list.append([repr(page),page,True])
            if total_pages>=page+1:
                page_list.append([repr(page+1),page+1,False])
            if page
                if page+2<>total_pages:
                    page_list.append(['...',None,False])
                page_list.append([repr(total_pages),total_pages,False])
        if page-1==0:
            page_list.append([repr(page),page,True])
            if total_pages>=page+1:
                page_list.append([repr(page+1),page+1,False])
            if total_pages>=page+2:
                page_list.append([repr(page+2),page+2,False])
                page_list.append(['...',None,False])
            if total_pages>=page+3:
                page_list.append([repr(total_pages),total_pages,False])
        if page>=total_pages and page>1:
            if page-3>0:
                page_list.append([repr(1),1,False])
            if page-2>0:
                page_list.append(['...',None,False])
                page_list.append([repr(page-2),page-2,False])
            if page-1>0:
                page_list.append([repr(page-1),page-1,False])
        
            page_list.append([repr(page),page,True])
            
        if page==total_pages:
            #page_list.append(['',total_pages,False])
            page_list.append(['',total_pages,False])
        elif page
            #page_list.append(['',page+1,False])
            page_list.append(['',page+1,False])    
        return page_list
    except Exception as e:
        tb = sys.exc_info()[2]

        LOG.error(u"ERROR %s <%s> en linea %s !!!\n" % (__name__,repr(e),tb.tb_lineno))

def pagination2html(items=0,items4page=20,page=1,other=''):
    __name__ = "pagination2html"
    LOG = logging.getLogger(__name__)

    sys.stdout = sys.stderr
    logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)

    try:
        page_list = list()
        total_pages = int(items/items4page) if items%items4page==0 else int(items/items4page)+1
        html_list = list()
        if page<=0:
            page=1
        html_list.append(u'''

        if items>0 and total_pages>0:
            page_list = pagination(items,items4page,page)
            for n in page_list:
                if n[1] is None:
                    html_list.append(u'''...''')
                elif n[2]:
                    html_list.append(u'''%s''' % (n[1],total_pages,items4page,other,n[0]))
                else:
                    html_list.append(u'''%s''' % (n[1],total_pages,items4page,other,n[0]))
        html_list.append('''
''')                return ''.join(html_list)
    except Exception as e:
        tb = sys.exc_info()[2]



Y aquí puedes ver el resultado aplicando CSS al código HTML:


El código es muy accesible y modificable si deseas incorporar CSS.

Todo el código que se publica en PURO PYTHON, por sencillo que parezca, sufre pruebas de carga y su fín último es pasar a fase de producción, en este último estadio es posible volver a revisar errores que son subsanados e inmediatamente se corrige en su publicación, como ha sucedido en este caso.




En las relaciones comerciales, la suerte no existe

Prefieres relaciones comerciales basadas en CATÁLOGOS o convertirte en guía personal del proceso comercial ?

PYMETRICK es un proyecto que a grandes rasgos, investiga sobre la creación de infraestructuras tecnológicas para facilitar la relación de empresas y clientes, siendo altamente eficaz en el empleo de recursos.

Con este punto de partida, no debemos olvidar que una parte de las relaciones comerciales se basa en la INTELIGENCIA COGNITIVA ( recientemente - 26/2/2017 - una gran empresa de telecomunicaciones ha presentado su proyecto basado en INTELIGENCIA COGNITIVA en el que ha invertido una escalofriante cifra ). La inteligencia cognitiva, de forma resumida, es el análisis y procesamiento de información que procede del sistema cognitivo del ser humano. Se basa en la división en PROCESOS COGNITIVOS : atención, codificación, almacenamiento y recuperación.

No obstante, la inteligencia cognitiva deja al margen aspectos como la gestión de las emociones propias y ajenas - INTELIGENCIA EMOCIONAL - donde podemos hacer uso de capacidades como comprender, regular, manejar, valorar las propias emociones y percibir y reconocer las emociones de los otros. La capacidad para utilizar los sentimientos, las emociones e impulsos de forma inteligente, asi como persuadir a las personas o guiar a otros, de forma que sus decisiones influyan positivamente en nuestras vidas y proyectos, pueden representar un 80% de los factores que determinan el éxito; contribuyendo la INTELIGENCIA COGNITIVA en un 20% restante.

Las relaciones comerciales tienen una gran parte de INTELIGENCIA COGNITIVA, los procesos deben suceder según nuestra experiencia y según nuestro aprendizaje en situaciones anteriores, PROCESOS que podríamos clasificar en PATRONES. Algunos PATRONES pueden o deben ser mejorados para diferenciarnos, pero otros NO deberían sufrir modificaciones debido al gran arraigo que pueda existir.

Sin embargo las relaciones entre empresas y clientes se han globalizado y han aportado muchas variables que influyen en los PATRONES DE PROCESOS : diferentes culturas, religiones, idiomas, dispositivos de acceso, diseño de productos, renta per cápita, regiones,...; Todo ello es mucho más accesible desde la INTELIGENCIA EMOCIONAL. Y es posible emplear emociones para realizar actividades cognitivas, o más concretamente, RECONOCER emociones y MANEJAR emociones (dirigiendo los propios pensamientos y comportamientos).

El Modelo Multifactorial de Bar  realiza una conceptualización multifactorial sobre la INTELIGENCIA EMOCIONAL  : 
  1. Intrapersonales:
    • Autoconcepto: Esta habilidad se refiere a respetarse y ser consciente de uno mismo, tal y como unos es, percibiendo y aceptando lo bueno y malo.
    • Autoconciencia Emocional: Conocer los propios sentimientos para conocerlos y saber qué los causó.
    • Asertividad: Es la habilidad de expresarse abiertamente y defender los derechos personales sin mostrarse agresivo ni pasivo.
    • Independencia: Es la habilidad de controlar las propias acciones y pensamiento uno mismo, sin dejar de consultar a otros para obtener la información necesaria.
    • Autoactualización: Habilidad para alcanzar nuestra potencialidad y llevar una vida rica y plena, comprometiéndonos con objetivos y metas a lo largo de la vida.
  2. Interpersonales:
    • Empatía: Es la habilidad de reconocer las emociones de otros, comprenderlas y mostrar interés por los demás.
    • Responsabilidad social: Es la habilidad de mostrarse como un miembro constructivo del grupo social, mantener las reglas sociales y ser confiable.
    • Relaciones Interpersonales: Es la habilidad de establecer y mantener relaciones emocionales caracterizadas por el dar y recibir afecto, establecer relaciones amistosas y sentirse a gusto.
  3. Adaptabilidad
    • Prueba de realidad: Esta habilidad se refiere a la correspondencia entre lo que emocionalmente experimentamos y lo que ocurre objetivamente, es buscar una evidencia objetiva para confirmar nuestros sentimientos sin fantasear ni dejarnos llevar por ellos.
    • Flexibilidad: Es la habilidad de ajustarse a las cambiantes condiciones del medio, adaptando nuestros comportamientos y pensamientos.
    • Solución de problemas: La habilidad de identificar y definir problemas así como generar e implementar soluciones potencialmente efectivas. Esta habilidad esta compuesta de 4 partes:
      1. ser consciente del problema y sentirse seguro y motivado frente a él
      2. definir y formular el problema claramente (recoger información relevante)
      3. generar tanto soluciones como sea posible
      4. tomar una solución sobre la solución a usar, sopesando pros y contras de cada solución.
  4. Manejo del Estrés
    • Tolerancia al estrés: Esta habilidad se refiere a la capacidad de sufrir eventos estresantes y emociones fuertes sin venirse abajo y enfrentarse de forma positiva con el estrés. Esta habilidad se basa en la capacidad de escoger varios cursos de acción para hacerle frente al estrés, ser optimista para resolver un problema, y sentir que uno tiene capacidad para controlar influir en la situación.
    • Tolerancia al estrés: Esta habilidad se refiere a la capacidad de sufrir eventos estresantes y emociones fuertes sin venirse abajo y enfrentarse de forma positiva con el estrés. Esta habilidad se basa en la capacidad de escoger varios cursos de acción para hacerle frente al estrés, ser optimista para resolver un problema, y sentir que uno tiene capacidad para controlar influir en la situación.
    • Control de impulsos: Es la habilidad de resistir o retardar un impulso, controlando las emociones para conseguir un objetivo posterior o de mayor interés.
  5. Estado de Animo y Motivación
    • Optimismo: Es mantener una actitud positiva ante las adversidades y mirar siempre el lado bueno de la vida.
    • Felicidad: Es la habilidad de disfrutar y sentirse satisfecho con la vida, disfrutarse uno mismo y a otros, de divertirse y expresar sentimientos positivos.

Para nuestro propósito debemos desarrollar o adaptar los PATRONES DE PROCESOS teniendo en cuenta los tres primeros puntos del Modelo Multifactorial. Como ejemplo, PYMETRICK adopta la Empatía y Responsabilidad Social, aplicando WAI-ARIA (Accessible Rich Internet Applications), pero este tema, por su importancia, se merece un artículo propio donde hablaremos de cuál es su estado actual y evolución. 

Nos falta mucho para hacer las cosas bien, pero es nuestro objetivo y espero que el suyo.