Feda /dev/

Merkury

#7140 En un rato que llegue a casa y tenga el portatil a mano, pico uno de cabeza.

Pero vamos la demo no es lo que tienes que usar, ser programador es saber que usar, como usarlo y cuando. La deuda tecnologica de la que hablabas antes con bundles externos tipo PagerFanta aparece cuando en vez de analizar si lo que quieres hacer merece la pena hacerlo tu mismo, creando tu bundle incluso o usar un bundle ya hecho es lo apropiado.

Pero vamos cualquier persona con unos conocimientos minimos, minimos, minimos deberia ser capaz de hacer un puto paginador.

1 1 respuesta
gohrum

#7141 estoy totalmente de acuerdo. Ahora simplemente estoy en fase de descubrimiento, aprender las cosas como van (para que te hagas una idea, el concepto de entity me era prácticamente desconocido) y ya luego a la hora de implementar y hacer proyectos reales valorar el uso de cada herramienta.

Tb la experiencia de haber utilizado lo que hay ayuda a futuras decisiones pero ahora mismo con symfony estoy en el paso 0 y me limito a rpeetir como un loro para entender el funcionamiento.

2 respuestas
Merkury

#7142 Es Symfony y como consejo si solo repites, nunca aprenderas.

1
Merkury

Voy a doble postear para que #7142 vea el ejemplo de paginador.

// EntityRepository

<?php

namespace UserBundle\Repository;

use Doctrine\ORM\EntityRepository;

/**
 * UserRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class UserRepository extends EntityRepository
{
    // Se pasa en la firma del metodo la pagina actual y el limite de resultados.
   // en este caso por defecto, 25
    public function getPaginatedUsers($page, $limit = 25){
        return $this->createQueryBuilder('u')
            ->setFirstResult(($page-1)*$limit) // Calculamos el primer resultado
            ->setMaxResults($limit) // Establecemos el limite.
            ->getQuery()
            ->getResult()
            ;
    }
}

// Usandolo en un controlador.

/**
     * @Route(
     *     "/admin/users/list/{page}/{limit}",
     *     defaults={"page" = 1, "limit" = 25},
     *     requirements={"page" = "\d+", "limit" = "\d+"},
     *     name="user_admin_list"
     * )
     * @Template()
     * @param int $page
     * @return array
     */
    public function listAction($page = 1, $limit = 25)
    {
        $em = $this->getDoctrine()->getManager();

        // Hacemos una query para saber cuantas paginas vamos a tener basandonos 
       // en el limite de resultados por pagina.
        $totalPages = ceil(count($em->getRepository('UserBundle:User')
                ->findAll()) / $limit);
        
        // Nos aseguramos de definir bien primera y ultima página
        $first = $page == 1 ? true : false;
        $last = $page < $totalPages ? false : true;

        // Ejecutamos la query definida anteriormente. 
        $users = $em->getRepository('UserBundle:User')
            ->getPaginatedUsers($page, $limit);

        // Devolvemos cositas
        return array(
            'users' => $users,
            'page' => $page,
            'first' => $first,
            'last' => $last,
            'totalPages' => (int) $totalPages,
        );
    }

Y para el frontend usando twig:

<div class="col-xs-12">
    <nav>
        <ul class="pagination">
            {% set currentPage = page %}
            {% if first != true %}
                <li>
                    <a href="{{ path('user_admin_list', {'page': page-1}) }}"
                       aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
            {% endif %}

            {% for currentPage in currentPage-5..currentPage if currentPage > 0 %}
                <li {% if currentPage == page %}class="active"{% endif %} >
                    <a
                            href="{{ path('user_admin_list', {'page': currentPage }) }}">{{ currentPage }}</a>
                </li>
            {% endfor %}

            {% for currentPage in currentPage+1..currentPage+10 if currentPage <= totalPages %}
                <li {% if currentPage == page %}class="active"{% endif %}>
                    <a
                            href="{{ path('user_admin_list', {'page': currentPage }) }}">{{ currentPage }}</a>
                </li>
            {% endfor %}

            {% if last != true %}
                <li>
                    <a href="{{ path('user_admin_list', {'page': page+1}) }}"
                       aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
            {% endif %}
        </ul>
    </nav>
</div>
2 1 respuesta
RaCe

#7144 te has tomado bastante a pecho que se hayan metido con tu Symfony no? xddd

1 respuesta
Merkury

#7145 No, pero ha pedido un paginador y ahi lo tiene xD

1 respuesta
gohrum

#7146 xd gracias.
Le echo un ojo, siempre voy a preferir tener algo controlado que un bundle externo.

N

Usar

.col-xs-12

es tan de 2013. Por favor.

Kaiserlau

php y encima el theme del code de mv da cancer xD

EnderFX

#7120

En html, siempre dashes para nombres y valores de atributos: "cfg-editor-window"
En JS:

  • camelCase para nombres de propiedades, clases, ids, etc.
  • MAYÚSCULAS_CON_UNDERSCORE para nombres de constantes.

Madre mía los paginados esos en PHP.
Rails, con la gema will_paginate:

class PostsController  ...
  def index
    @posts = Post.paginate(page: params[:page], per_page: params[:limit])
    render json: @posts, status: 200
  end
end
3 respuestas
HeXaN

#7150 Ahora hazlo sin usar una gem, ya que #7120 lo ha hecho sin ningún paquete externo.

1 respuesta
Troyer

#7150 La gracia es que el no ha utilizado ninguna dependencia, si nos ponemos en ejemplos fáciles con dependencias Laravel es tan fácil como hacer:

$users = User::where('votes', '>', 100)->paginate(15);
1 1 respuesta
B

#7150 No he tocado Rails nunca, pero apostaría que la gema esa que dices hará lo mismo por debajo... Ya te digo que la mayoria de frameworks u ORMS en bastantes lenguajes de programacion por debajo hacen lo que ha posteado Merkury.

1 respuesta
Kaiserlau

flask-rest:

apimanager.create_api(Person, results_per_page=2)

Todo json q pase por el return del resource ya va con la paginacion.

Markitos_182

a ver, que hemos dicho sin dependencias: que lo hagáis en ensamblador.

2
EnderFX

#7151 #7152 #7153 Sí, sí, me he colado, no había visto que tenía que hacerse a pelo. Take it easy, geez.

NoRelaX

¿Alguien quiere ganarse 10 pavetes?

http://www.mediavida.com/foro/estudios-trabajo/pago-practicas-grado-superior-damdawasix-581447

1 respuesta
Troyer

#7157 Yo se lo estoy haciendo a cambio de fotos de sus tetas.

1 respuesta
Markitos_182

#7158 Espero que las distribuyas con licencia GPL

3
Ninpo

No se como lo haréis en web, pero en mobile al menos utilizando principios SOLID + una arquitectura buena (VIPER en el caso de iOS) quedan las cosas muy bien hechas y no te cuesta nada cambiar cosas. La idea es abstraerse del framework todo lo que puedas

1 respuesta
cabron

#7160

Los frameworks web como symfony o ror, te imponen una arquitectura, no te puedes abstraer de ellos de ninguna forma por que te dictan la estructura de la aplicación

2 3 respuestas
Ninpo

#7161 Bueno, desconozco el mundo web, pero los principios SOLID se desarrollaron pensando en ese mundillo, por lo que entiendo que hacer inversión de dependencias es posible ¿No?

1 respuesta
PiPePiTo

#7161 Correcto, eso es como usar ASP.NET MVC o usar un API en c# y luego angular... defines la arquitectura como te sale de los huevos (al menos en el backend)...

cabron

#7162

Ya llevan su propio mecanismo de inyección de dependencias, así que tienes que hacerlo como el framework quiere para que funcione todo.

2 respuestas
PiPePiTo

#7164 eso y amor, mucho amor.

Troyer

#7161 Tampoco lo veo como un problema, una vez que aprendes dicha arquitectura te es mucho más fácil entrar en nuevos proyectos o que entre gente nueva en el tuyo donde se utiliza dicho framework.

Por no hablar ya de las arquitecturas de mierda que se montan algunos.

2 respuestas
HeXaN

#7166 El problema viene cuando te dicen "usa X framework para esto" y dicho framework no se adapta. Ahí empiezan los problemas.

1 respuesta
Ninpo

#7164 No hablo de inyeccion si no de inversión de dependencias. En Android por ejemplo, no puedes hacer inyección de dependencias manual como en Swift, si no que tienes que usar Dagger. Aún así eso no te impide tener una buena arquitectura por capas como clean :/

3 respuestas
gohrum

#7166 Bueno, al final ese es el objetivo de utilizar frameworks, poder colaborar con otra gente de forma fácil, y la velocidad de desarrollo.

Eso no se puede conseguir sin tener un sistema "cerrado", de forma que al final es el pez que se muerde la cola.

HeXaN

#7168 Que sí, que todo eso está muy bien cuando usas el lenguaje a pelo, pero si un framework ya te resuelve todo eso de X forma, no hay nada que hacer.

1 respuesta
Tema cerrado

Usuarios habituales

  • desu
  • Fyn4r
  • HeXaN
  • Merkury
  • eXtreM3
  • MisKo
  • Troyer