#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.
#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.
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">«</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">»</span>
</a>
</li>
{% endif %}
</ul>
</nav>
</div>
#7146 xd gracias.
Le echo un ojo, siempre voy a preferir tener algo controlado que un bundle externo.
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
#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);
#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.
flask-rest:
apimanager.create_api(Person, results_per_page=2)
Todo json q pase por el return del resource ya va con la paginacion.
¿Alguien quiere ganarse 10 pavetes?
http://www.mediavida.com/foro/estudios-trabajo/pago-practicas-grado-superior-damdawasix-581447
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
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
#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?
#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)...
Ya llevan su propio mecanismo de inyección de dependencias, así que tienes que hacerlo como el framework quiere para que funcione todo.
#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.
#7166 El problema viene cuando te dicen "usa X framework para esto" y dicho framework no se adapta. Ahí empiezan los problemas.
#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 :/
#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.
#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.