Ir para conteúdo

POWERED BY:

Arquivado

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

Tylër

[Resolvido] Paginação sem BD para o cakePHP

Recommended Posts

Boa noite a todos

 

Estou tentando adaptar a paginação com scandir para o cakePHP mas estou com dúvidas se devo adicionar a paginação no método view() do controller ou na view view.ctp

 

Segui este tópico: http://www.htmlstaff...er.php?id=22985

 

function view( $slug = null, $json = false ) {

 	$gal = $this->Gallery->findBySlug($slug);
 	$this->set( 'g', $gal ); # lendo um post com slug

 	# Paginar imagens do bd
 	#Definimos o diretório onde estão os arquivos a serem listados
 	#Obs.: A função scandir só funciona no PHP 5 ou superior
 	$path = '../../../files/images/galleries';
 	$dImg = 'images';
 	$dTmb = 'thumbs';
 	$id = $gal['Gallery']['id'];

 	$arquivos = scandir( $path.'/'.$id.'/'.$dTmb.'/' );
 	$listagem = array();

 	foreach( $arquivos as $f ) {
 	if( strpos($f,'.') !== 0 ) {
 	array_push( $listagem, $f );
 	}
	}

 	#Definimos quantos arquivos exibir por página
 	$paginas = array_chunk( $listagem, 5 );

 	#Montamos os links da paginação
 	for( $i=1; $i< count($paginas)+1; $i++ ) {
 	echo "[ <a href=\"?lista=$i\">$i</a> ] ";
 	}
 	echo "
";
 	$pagina = (int)@$_GET["lista"];
 	$paginas[$pagina];

 	#Exibimos o resultado da paginação
 	foreach( $paginas[$pagina] as $arquivo ) {
 	echo "$arquivo
";
 	}
 	# Fim da paginacao
 	
 	if( $json ) {
 	$this->view = 'Json';
 	$this->set( 'json', 'g' );
 	}

	}

Pergunta: Existe alguma forma de fazer isso automático no cake? Tipo, um $paginate sem BD?

 

Aguardo contato.

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamo lá gente! :mellow:

 

Tentar usar scandir pra paginar como o paginate() do cakePHP faz. Será que dá certo?

 

Referências:

http://book.cakephp....nation-in-Views

http://www.htmlstaff...er.php?id=22985

http://bakery.cakephp.org/articles/view/form-posting-with-_get-parameters

 

O ruim deste, é que não consigo capturar o parâmetro "page":

http://forum.imaster...ados-de-um-dir/

 

Já neste, consigo mostrá-lo, utilizando pr(), mas não sei como capturá-lo:

http://book.cakephp....ttribute-params

url: http://ts_cakephp/ts/galleries/view/__lbum_de_fotos_2/1
Array
(
 [0] => __lbum_de_fotos_2
 [1] => 1
)
function view( $slug = null, $page = null ) {

 $g = $this->Gallery->findBySlug($slug);
 $this->set( 'g', $g ); # lendo um post com slug

 $path = '../../../files/images/galleries';
 $dImg = 'images';
 $dTmb = 'thumbs';
 $id = $g['Gallery']['id'];
 $slugTitle = $g['Gallery']['slug'];

 #Definimos o diretório onde estão os arquivos a serem listados
 #Obs.: A função scandir só funciona no PHP 5 ou superior
 $arquivos = scandir( $path.'/'.$id.'/'.$dTmb );

 $listagem = array();

 foreach( $arquivos as $f ) {
 if( strpos($f,'.') !== 0 ) {
 array_push( $listagem, $f );
 }
 }

 # Definimos quantos arquivos exibir por página
 $paginas = array_chunk( $listagem, 5 );

 # Montamos os links da paginação
 for( $i = 1; $i < count($paginas)+1; $i++ ) {
 echo '[ <a href=".$_SERVER['SERVER_NAME'].'/ts/galleries/view/'.$slugTitle.'/'.$i.">'.$i.'</a> ] ';
 }
 echo "
";

 $pagina = $this->params['pass'];
 pr($pagina); exit;
 $paginas[$pagina];

 #Exibimos o resultado da paginação
 foreach( $paginas[$pagina] as $arquivo ) {
 //echo $html->image( '/files/images/galleries/'.$id.'/'.$arquivo, array( 'alt'=>'image' ) );
 echo '<img src="http://'.$_SERVER['SERVER_NAME'].'/files/images/galleries/'.$id.'/thumbs/'.$arquivo.'" alt="image" />';
 echo ' | ';
 }
 # Fim da paginacao
 }

Isto por enquanto está no controller, pois estou pesquisando por uma forma mais reusável no cake pra criar isto...

 

Gostaria de ajuda!

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma ótima dica! Obrigado!

 

Bom, encontrei alguns exemplos que realmente podem fazer a diferença mas nada com paginador não...

 

http://www.bensnider.com/2008/07/22/cakephp-lightbox-helper/
http://cocoacrusty.com/?p=106
http://bakery.cakephp.org/articles/view/lightroom-helper

Vou realizar testes e trago novidades assim que puder.. ( vou ficar fora por uns tempos e por isso talvez não vou poder responder aos tópicos )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma ótima dica! Obrigado!

 

Bom, encontrei alguns exemplos que realmente podem fazer a diferença mas nada com paginador não...

 

http://www.bensnider.com/2008/07/22/cakephp-lightbox-helper/
http://cocoacrusty.com/?p=106
http://bakery.cakephp.org/articles/view/lightroom-helper

Vou realizar testes e trago novidades assim que puder.. ( vou ficar fora por uns tempos e por isso talvez não vou poder responder aos tópicos )

 

O lightbox já tem um paginador proprio que você nao precisa fazer nada, ele mesmo cria tudo e é bem fácil de usar.

por exemplo aqui http://www.gn10.com.br/plugins/lightbox.html

 

se você posicionar o mouse um pouco abaixo do canto superior direito, vai aparecer uma flecha pra você ir pra proxima foto e assim por diante..

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não entendeu o que o lightbox faz

 

Isto não é um paginador.

Paginação é você dividir uma listagem de alguma coisa em páginas.

O lightbox não faz isso, o que ele faz na verdade é a transição de imagens que estão na mesma página, então não é possível chamá-lo de paginador....

 

Bom, de volta a estaca zero!

 

Os links que pesquisei são estes:

 

http://forum.imaster...ost__p__1592982

 

http://forum.imaster...ost__p__1593452

Compartilhar este post


Link para o post
Compartilhar em outros sites

@lucasvocals, obrigado por ajudar mas...

achei que você quisesse fazer isso quando exibisse as imagens...

 

Não. A dúvida é paginação em cakephp mesmo.

 

bom, te apresento o comando foreach então..

 

Já estou utilizando foreach conforme apresentado acima:

http://forum.imaster...ost__p__1592982

 

* Com a ajuda do @kakaroto fomos um pouco além...

 

$url = $_SERVER['REQUEST_URI'];
 	$explode = explode( "/", $url );

 	if ( !isset($explode[5]) )
 	$valor = "";
 	else
 	$valor = $explode[5];

 	if ( $valor != "" )
 	$id_da_pagina = $explode["5"];
 	else
 	$id_da_pagina = 0;

 	$g = $this->Gallery->findBySlug($slug);
 	$this->set( 'g', $g ); # lendo um post com slug

 	$path = '../../../files/images/galleries';
 	$dImg = 'images';
 	$dTmb = 'thumbs';
 	$id = $g['Gallery']['id'];
 	$galleryTitle = $g['Gallery']['title'];
 	$slugTitle = $g['Gallery']['slug'];

 	
 	$dir = $path .'/'.$id .'/'.$dTmb;
 	if ( $foldername = opendir( $dir ) ) {
 	while (false !== ($filename = readdir($foldername))) {
 	if ( $filename != "." && $filename != ".." ) {
 	$files[] = $filename;
 	$url_thumbs = $path.'/'.$id.'/'.$dTmb.'/'.$files[0];
 	$url_images = $path.'/'.$id.'/'.$dImg.'/'.$files[0];
 	$dadosImg = array( 'thumbs'=>$url_thumbs, 'images'=>$url_images, 'title'=>$galleryTitle );
 	$this->set( $dadosImg );
 	}
 	}
 	closedir( $foldername );
 	}
Só que não tem a paginação..

E também só mostra um resultado, gostaria que o $this-Lset() settasse a listagem, mas não encontrei algo parecido nas pesquisas da internet...

 

* Só uma observação: Parece que o cake não possui nenhum componente nativo que faça isso, então vou ter que utilizar o "porco" do php mesmo... <_<

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, voltei com a paginação pronta!

 

Minha url será assim:

http://site.br/ts/panels/galleries/view/__lbum_de_fotos
http://site.br/ts/panels/galleries/view/__lbum_de_fotos/1
http://site.br/ts/panels/galleries/view/__lbum_de_fotos/2
http://site.br/ts/panels/galleries/view/__lbum_de_fotos/3
etc...

code by: @kakaroto

$url = $_SERVER['REQUEST_URI'];
 	$explode = explode( "/", $url );

 	if ( !isset($explode[6]) )
 	$valor = "";
 	else
 	$valor = $explode[6];

 	if ( $valor != "" )
 	$id_da_pagina = $explode[6];
 	else
 	$id_da_pagina = 0;

 	$g = $this->Gallery->findBySlug($slug);
 	$this->set( 'g', $g ); # lendo um post com slug

 	$path = '../../../files/images/galleries';
 	$dImg = 'images';
 	$dTmb = 'thumbs';
 	$id = $g['Gallery']['id'];
 	$galleryTitle = $g['Gallery']['title'];
 	$slugTitle = $g['Gallery']['slug'];

 	$dir = $path .'/'.$id .'/'.$dTmb;

 	# lendo imagens do diretorio
 	$album = $path .'/'.$id .'/'.$dTmb;
 	$total = count( $fotos = glob( "$album/{*.jpg,*.png}", GLOB_BRACE ) );
 	$limite_foto = 5;

 	if ( $total > $limite_foto ) {
 	$gerar_link = $total / $limite_foto;
 	$gerar_link = round( $gerar_link );

 	for ( $i = 0; $i < count( $gerar_link ); $i++ ) {
 	if ( $i == 0 )
 	$link = '[ <a href=".$_SERVER['SERVER_NAME'].'/ts/galleries/view/'.$slugTitle.'/ ">Início</a> ] ';
 	//$link = $this->Html->link( 'Início', array( 'action'=>'views', $slugTitle ) );
 	else
 	$link = '[ <a href="http://'.$_SERVER['SERVER_NAME'].'/ts/galleries/view/'.$slugTitle.'/'.($i * $limite_foto).">'.$i.'</a> ] ';
 	//$link = $html->link( $i, array( 'action'=>'views', $slugTitle.'/'.($i * $limite_foto) ) );
 	}
 	$this->set( 'link', $link );
 	}

 	#Exibimos o resultado da paginao
 	$novolimite = ( $id_da_pagina + $limite_foto ) - 1;

 	$a = 0; // aqui e para ele respeita o limite de exibi so cinco fotos
 	foreach( range( $id_da_pagina, $novolimite ) as $posicao_foto ) {
 	if ( $a < $limite_foto ) {
 	if ( @$fotos[$posicao_foto] ) {
 	//pr( $fotos );
 	$url_thumbs = $fotos[$posicao_foto];
 	//$url_images = $fotos[$posicao_foto];
 	$this->set( 'thumbs', $url_thumbs );
 	//$this->set( 'images', $url_images );
 	//$this->set( 'title', $galleryTitle );
 	}
 	}
 	$a++;
 	}

view:

pr( $thumbs );

Imagem Postada

 

Problemas:

 

- Preciso recuperar a url da imagem no diretório thumbs e images,

pois a mesma imagem existe em ambos, mas ampliada e reduzida...

 

- Se eu der um echo nas fotos, aparece a listagem delas,

mas se eu setar com $this->set() aparece só uma...

 

Aguardo ajuda.

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, aqui diz que o $this->set() é capaz de passar um array dentro da variável setada:

$this->set('usuarios', $this->Usuario->find('all'));

No meu caso estou tentando passar esta variável:

$url_thumbs = $fotos[$posicao_foto];
 	//pr( compact( 'url_thumbs' ) );
 	pr( $url_thumbs );
 	$this->set( 'thumbs', $url_thumbs );
Que por sua vez, no pr() dentro do controller lista todas as imagens desta sequência:

../../../files/images/galleries/6/thumbs/4aaa9afd.jpg
../../../files/images/galleries/6/thumbs/4aaa9afdbc6.jpg
../../../files/images/galleries/6/thumbs/a37d860bf592d5.jpg
../../../files/images/galleries/6/thumbs/a37d860bf592d51.jpg
Mas $this->set( 'thumbs', $url_thumbs ); não foi capaz de passar uma lista de imagens para o pr() da view:

../../../files/images/galleries/6/thumbs/a37d860bf592d51.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

@tyler

desculpe a demora e que a minha senha não estava entrando no forum :)

 

sobre a sua pergunta :)

 

Bom, aqui diz que o $this->set() é capaz de passar um array dentro da variável setada:

 

 

sim o set passar um array sim

 

nessa parte aqui

No meu caso estou tentando passar esta variável:


$url_thumbs = $fotos[$posicao_foto];
       //pr( compact( 'url_thumbs' ) );
       pr( $url_thumbs );
       $this->set( 'thumbs', $url_thumbs );

 

 

era so mudar aqui

 


$url_thumbs[] = $fotos[$posicao_foto];

 

 

proxima duvida

 

espero que resolva o seu problema

 

E ai lucas ver ser aparece no gtalk

 

fui

 

@kakarotodev

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oh, obrigado hehe!

você já vem me ajudando muito cara! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Mas tenho uma outra dúvida:

 

Como vamos converter as urls que apontam diretamente para /thumbs/, preciso que também aponte para /images/

 

Tentei:

 

$url_images[] = preg_replace( 'thumbs', 'images', $fotos[$posicao_foto] );
Mas fracassei =/

 

Vamos resolver mais esta kakaroto!

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow, olha ele novamente hehe!

 

Sim, eh verdade, nunca utilizei preg_replace para estes fins e não fazia idéia como agir nessas horas.

Agradeço cara!

 

Obrigado a todos que ajudaram! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

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.