Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gremio10

[Resolvido] Paginação com array

Recommended Posts

Fala galera, eu estou com um problema, e não consigo resolver...

 

eu tenho um array:

 

$listTips = array( 
                           "definicao" => "Definição", 
                           "descricao" => "Descrição", 
                           "sintoma" => "Sintomas", 
                           "causas" => "Causas", 
                           "diagnostico" => "Diagnóstico", 
                           "tratamento" => "Tratamento", 
                           "tratamento_alternativo" => "Tratamento Alternativo", 
                           "consulte_especialista" => "Consulte Especialista", 
                           "complicacoes" => "Complicações", 
                           "prognostico" => "Prognóstico", 
                           "medicamento" => "Medicações", 
                           "prevencao" => "Prevenção", 
                           "referencias" => "Referências" 
                       );

 

as keys, são campos no banco de dados, e os values, são os nomes respectivos deles...

 

bom, meu código, busca no banco de dados, e faz a verificação de quais os campos não estão vazios...

 

mas ai que tá, depois disso, eu mando ele contar quantos sobraram, mas eu tenho de fazer uma paginação entre eles, e eu não estou conseguindo de forma alguma...

 

minha ultima tentativa foi essa:

 

$pagesKey = array();
           $totalPages = 0;

           foreach( $listTips as $tip => $val )
           {
               if( !empty( $detail[ $tip ] ) )
               {
                   $pages[ $tip ] = $val;

                   if( $this->getRequest()->getParam( "sessao" ) === $tip )
                   {
                       if( $totalPages > 0 )
                       {
                           $prev = $pagesKey[ $totalPages - 1 ];                            
                       }
                       else
                       {
                           $prev = end( $pagesKey );
                       }

                       $current = $pagesKey[ $totalPages ];
                       $next = $pagesKey[ $totalPages + 1 ];
                   }
                   else
                   {
                       if( $totalPages > 0 )
                       {
                           $prev = $pagesKey[ $totalPages - 1 ];                            
                       }
                       else
                       {
                           $prev = end( $pagesKey );
                       }

                       $next = $pagesKey[ $totalPages + 1 ];
                   }

                   $pagesKey[ $totalPages ] = $tip;
                   $totalPages++;
               }
           }

 

mas não deu em nada, eu tento usar o reset() prev(), e outros, na minha index, mas ele não funciona, principalmente o next()...

 

Obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja .. adaptando com o código que te passei ..

<?php

         require_once 'Application/Library/Paginator/Paginator.php';

         $Array = Array ( 
                  'a' => 'b' ,
                  'c' => 'd' ,
                  'e' => 'f' ,
                  'g' => 'h' ,
                  'i' => 'j' 
         ) ;
         $Paginator = new Paginator ( ) ;

         $Paginator -> setLimitOffset ( 2 ) ; // limite de resultados por página
         $Paginator -> setResultsAmount ( count ( $Array ) ); // quantidade de items que serão paginados
         $Paginator -> setCurrentPage ( 2 ) ; // página atual : $_GET [ 'page' ] 

         // ... 

         $Pages = $Paginator -> assemble () ; // Monta a páginação e retorna um PaginatorEntity .. 

         printf ( 'Página atual: %d de: %d, Próxima Página: %d, Página Anterior: %d' , 
                  $Pages->getCurrentPage() ,
                  $Pages->getPageCount() ,
                  $Pages->getNextPage() ,
                  $Pages->getPreviousPage() 
                );

 

Saída:

Página atual: 2 de: 3, Próxima Página: 3, Página Anterior: 1

 

Quando você der um print_r , ou var dump .. em $Pages ..

 

PaginatorEntity Object
(
   [Array] => Array
       (
           [Pages] => Array
               (
                   [0] => 1
                   [1] => 2
                   [2] => 3
               )

           [currentPage] => 2
           [Offset] => 2
           [limitOffset] => 2
       )

)

 

Lembrando que se você também quiser mostrar os links .. pode, ela implementa um IteratorAggregate .. basta fazer um forEach em $Pages

 

Claro que tem os outros métodos também pra você fazer um limit em SQL por exemplo ... o até mesmo encaixar em um for para exibir .. ou no LimitIterator ..

 

<?php
        $Iterator = new ArrayIterator ( $Array ) ;

         forEach ( 
                  new LimitIterator ( $Iterator , $Pages->getOffset() , $Pages->getLimit() ) as $R 
                 ) {
                   print_r ( $R ) ;
         }
         // ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, mas olha só, eu estou usando a url para melhor indexação no google, ou seja, ele ficaria digamos:

 

minhaUriDefault/index/sessao/definicao
...

 

sabendo então que o usuário clicou em definicao eu busco os valores referentes a ele no banco...

Compartilhar este post


Link para o post
Compartilhar em outros sites

sabendo então que o usuário clicou em definicao eu busco os valores referentes a ele no banco...

 

E o que isso tem haver ? você quer pegar a definição no banco, verificar a posição dela, então achar a anterior e próxima ?

Compartilhar este post


Link para o post
Compartilhar em outros sites
E o que isso tem haver ? você quer pegar a definição no banco, verificar a posição dela, então achar a anterior e próxima ?

 

Não do banco, o que faço com banco é uma pesquisa completa, aonde quero que ele vasculhe é no array, que a chave é o nome do campo, e o valor, é o nome real dele...

 

tipo:

 

array(
"pagina1" => "Pagina 1",
"pagina2" => "Pagina 2",
"pagina3" => "Pagina 3"
)

 

sei que se eu clicar em pagina 2 por exemplo, na url, ele iria ficar /pagina2, o nome dele seria Pagina 2, mas nos botoes de anterior e próximo, teriam de ter o pagina1 e pagina3 respectivamente..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria isso .. ?

 

<?php

        $Array = Array(
                    "definicao" => "Definição" ,
                    "descricao" => "Descrição" ,
                    "sintoma" => "Sintomas" ,
                    "causas" => "Causas" ,
                    "diagnostico" => "Diagnóstico" ,
                    "tratamento" => "Tratamento" ,
                    "tratamento_alternativo" => "Tratamento Alternativo" ,
                    "consulte_especialista" => "Consulte Especialista" ,
                    "complicacoes" => "Complicações" ,
                    "prognostico" => "Prognóstico" ,
                    "medicamento" => "Medicações" ,
                    "prevencao" => "Prevenção" ,
                    "referencias" => "Referências"
        );

        // ... coloquei o ternário só pra demonstrar, no caso vai cair em sintoma se não tiver nada setado
        $Current = isset ( $_GET [ 'definicao' ] ) ? ( $_GET [ 'definicao' ] ) : 'prevencao' ;


        function paginate( array &$array , $current ) {
                 if ( isset ( $current ) && count ( $array ) > 0 ) {
                        $keys = array_keys ( $array ) ; $values = array_values ( $array ) ;
                        $position = array_search ( $current , $keys , false ) ;
                        if ( array_key_exists ( ( $position + 1 ) , $values ) ) 
                               $next = $array [ $keys [ $position + 1 ] ] ;
                        if ( array_key_exists ( ( $position - 1 ) , $values ) )
                               $prev = $array [ $keys [ $position - 1 ] ] ;
                        $current = $array [ $current ] ;
                        return array ( 'current' => $current , 'next' => $next , 'prev' => $prev ) ;
                 } 
        }

        print_r( paginate ( $Array , $Current ) );

 

Saída

Array
(
   [current] => Prevenção
   [next] => Referências
   [prev] => Medicações
)

 

Se quiser pegar a key da definição, basta tirar o $array ... ficando assim

$prev = $keys [ $position - 1 ] ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, muito bom seu código, só que tem um único problema, quando eu retrocedo para o primeiro, ele retorna um erro na variável $prev,

e o mesmo ocorre se eu vou para o último...

 

Mas tirando isso, muito bom mesmo...

 

parabéns :clap:

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue aqui o código para a paginação infinita:

 

public function paginate( array &$array , $current ) 
   {
       if ( isset ( $current ) && count ( $array ) > 0 ) 
       {
           $keys = array_keys ( $array ) ; $values = array_values ( $array ) ;
           $position = array_search ( $current , $keys , false ) ;

           if ( array_key_exists ( ( $position + 1 ) , $values ) )
           {
               $next = $keys [ $position + 1 ] ;
           }
           else
           {
               $next = reset( $keys );
           }

           if ( array_key_exists ( ( $position - 1 ) , $values ) )
           {
               $prev = $keys [ $position - 1 ] ;
           }
           else
           {
               $prev = end( $keys );
           }

           $current = $array [ $current ] ;
           return array ( "current" => $current , "next" => $next , "prev" => $prev ) ;
       } 
    }

 

Obrigado Andrey Knupp pela sua ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

estou usando Zend, só que a paginação não é a convencional, tem de ser apenas:

 

pagina atual DE total de paginas <anterior> <proximo>

 

Só pra constar, você pode exibir os links de paginação da maneira que desejar usando o Zend_Paginator, para isso basta editar o arquivo paginator.phtml ou outro arquivo que você tenha definido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim sim, eu utilizo o Paginator, apenas teria de trabalhar com valores pré definidos, e pelo que utilizo, o Paginator, trabalha com dados vindo de um array bi dimensional, não é ?

 

Uma pergunta, o que é o '&' no paginate( array &$array , $current ) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.