domingo, 20 de janeiro de 2008

Algoritmo genérico de paginação!

Esses últimos dias estive dando continuidade ao projeto Flickr PhotoAlbum para testá-lo junto a um cliente. Depois de ter feito a base para o design, comecei a fazer o "motor" da coisa. Daí, como não poderia deixar de ser, precisei fazer um algoritmo de paginação. Dei uma procurada na net mas não encontrei nada de interessante. Então resolvi colocar a mão na massa.

No meu caso o algoritmo deveria buscar em um Vetor/Array 10 fotos de cada vez e mostrá-la em uma determinada página. A idéia é mais ou menos o seguinte: Se for selecionada a página 2 deve-se mostrar as fotos da posição 10 à 19 do vetor. Assim temos a seguinte situação.

Posições do Vetor/Array: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
Página 1 (as 10 primeiras fotos): 0 1 2 3 4 5 6 7 8 9
Página 2 (as próximas 10 fotos): 10 11 12 13 14 15 16 17 18 19


E assim por diante...

Quando comecei a fazer o algorítimo tive a MEGA SORTE de um colega aparecer aqui em casa e me passar uma dica muito boa, foi aí que revolvi compartilhar com vocês.

Ele mesmo já tinha feito tal algorítimo e depois de quebrar a cabeça e ter refatorado o código diversas vezes chegou a uma solução genéria bem legal...

A idéia é mais ou menos a seguinte:

Teremos uma variável para as páginas (algo como "paginaAtual") inciando a contagem em "0"(Zero), ou seja, para a página 1 (Um) o valor será "o"(Zero), para a página "2" (dois) o valor será 1 (Um), e assim por diante.

Feito isso, teremos uma variável (ou uma constante, já que o valor provavelmente não seja alterado) para a quantidade de elementos mostrado na página (algo como "qtdElementosPagina"), no meu caso essa variável terá o valor "10" (Dez), já que preciso mostrar "10" (Dez) fotos de cada vez.

Pronto, agora é só calcular. Se preciso da primeira página (intervalo de 0 a 9) farei o seguinte cálculo:

primeiroElemento = (paginaAtual * qtdElementosPagina)
que dá isso ===> primeiroElemento = 0 * 10 = 0

ultimoElemento = (paginaAtual * qtdElementosPagina) + (qtdElementosPagina - 1 )
que dá isso ===>>
ultimoElemento = (0 * 10) + (10 - 1) = 9

Resultando em:

primeiroElemento= 0
ultimoElemento = 9

Assim, o algoritmo resume-se a passar a página desejada e a quantidade de elementos da página para se obter o intervalo que se precisa. Só lembrando que a página desejada deve sempre ser ela menos um, ou seja, se preciso da página 5, passarei o valor 4 para a variável "paginaAtual".

Bom, obviamente essa é apenas uma das milhares formas de fazer paginação, mas já é um bom começo pra quem vai desenvolver algo nesse sentido.

é isso...

Abraço!

4 comentários:

adriano sousa disse...

Olá! estou procurando por algo como o que você criou para o Flickr, sendo que eu uso um plugin chamado Crossroads para Wordpress que pegas as fotos dos albuns do meu Flickr e coloca em uma pagina do wordpress atraves de uma comando colocado na pagina que seria sinalmenorque!-- flickrset: 72157603796382223 --sinalmaiorque, dai tudo bem era tudo o que eu queria, abrir as fotos em thumbs e que nessas fotos estaria a descrição da mesma, por fim, não consigo fazer a paginação dessas fotos, dai por exemplo eu tenho um album que tem cerca de 300fotos, dai ele carrega o thumbs dessas 300 fotos e isso acaba demorando e dando erros.
Você sabe alguma solução para isso?
Obrigado pela a sua atenção, parabéns pelo seu trabalho.
Adriano Sousa

Unknown disse...

Olá Adriano,

Sempre é bom ter o retorno das pessoas sobre os trabalhos que fazemos... :)

Veja bem, no exemplo que eu fiz de acesso ao flickr é possível pegar imagens de uma determinada TAG, ou seja, eu consigo pegar as fotos da minha conta e ainda escolher uma TAG específica, além também de baixar uma quantidade determinada de fotos.

Não li a documentação do plugin que vc está usando, mas acredito que ele deve ter alguma coisa nesse sentido, se por acaso ele não tiver esse tipo de configuração aconselho a procurar algum outro que faça esse tipo de integração, pois com certeza os erros que estão acontecendo no seu wordpress é por causa da quantidade exagerada de fotos que estão sendo carregadas.

Qq coisa estou à disposição.

Abraço!

José disse...

Dica muito boa !

Me ajudou muito. Consegui montar uma galeria de imagens a partir desse tutotial. Obrigado !

Unknown disse...

Jóia, José! Que bom que te ajudou! Obrigado pelo feedback!