Ir para conteúdo

Arquivado

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

michelmfreitas

Gerar CSV de dados vindo do DB com cakephp

Recommended Posts

Olá pessoal, tudo blz?

Bom, há pouco tempo comecei a trabalhar com cakephp e estou com uma dúvida ao gerar dados para exportação em uma tabela CSV para excel.
Criei as view e controllers, e estou utilizando a classe https://github.com/FriendsOfCake/cakephp-csvview .
Mas, quando clico, não acontece nada. O que pode estar errado no processo?
//função ajax para capturar o click, jogar no método PHP e retornar o link da planilha para download.
$(function(){
$("#botoes button").click(function(){
var botao = $(this).attr('data-download');
$.ajax({
url:webroot('leads/Leads/export'),
type:'post',
data:{
tipo: botao
},
success:function®{
$("#botoes button [data-download=+botao+]").removeClass('btn-danger');
$("#botoes button [data-download=+botao+]").addClass('btn-success');
$("#botoes button [data-download=+botao+]").val('Download');
},error:function(){
console.log('erro');
}
});
});
});

No método:
public function export(){
$dados = $this->param('tipo');
$this->loadModel('CadastroMailing');
$conditions = array('OR'=>array('cadastro_mailing_tipo_id'=>$dados));
$result = $this->CadastroMailing->find('all',array( 'conditions'=>$conditions , 'order'=>array('nome ASC')));
$_serialize = 'result';
$this->viewClass = 'CsvView.Csv';
$this->set(compact('data', '_serialize'));
}

Gostaria que o download iniciasse automaticamente após o clique, mas caso tenha que clicar no botão também resolve meu problema.
Podem me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentou Utilizar as Classe CakeResponse para enviar o cabeçalho para Download

public function download($id) {
        
    $filename = WWW_ROOT . 'files' . DS . $id . '.xls';
    $this->response->file($filename, array(
        'importar' => true,
        'name' => $id
    ));
     //Return reponse object to prevent controller from trying to render a view
    return $this->response;
}

http://andy-carter.com/blog/downloading-files-as-request-responses-in-cakephp-23

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz, Willian, mas não consegui entender e, obviamente, não funcionou.

 

Vamos lá, passo a passo:

 

- Criei um método export() dentro do LeadsController.

- Essa função busca os dados que necessito no banco de dados e guardo no array $result;

- Como orienta o plugin CSVView, serializo e seto o array:

$_serialize = 'result';
$this->viewClass = 'CsvView.Csv';
$this->set(compact('result', '_serialize'));

Após isso, coloco as instruções como o Williams me recomendou.

// url real fica em "admin/Plugin/Leads/View/Leads/index.ctp"

$filename = "Plugin/Leads/mailing.csv"; 

$this->response->file(
	$filename,
	array(
		'download' => true,
		'name' => "mailing"
	)
);

return $this->response;

Em minha view, a requisição vai por ajax, como descrito na primeira mensagem.

 

Pode me auxiliar a entender o que estou fazendo, código e colocar pra funcionar? Pelo que parece, não falta muito. =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha não conheço este plugin, mas com CakeResponse nem necessitaria de ajax, pois ele vai te dar o return ao Controller e Action de onde partiu a requisição.

 

Ou seja, você pode definir qualquer action e controller que desejar, não vai sai da página.

Desde que renderize uma pagina em branco.

public function newsletterExportar() {
    
    $this->render('blank');

    ...


Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não consegui fazer o download. Eu envio o post para o Controller, certo? E ele faz o trabalho...?

 

Veja:

public function export(){
			
if($this->request->is('post')) {
			
		$fields = array('nome', 'email');
			
		$this->loadModel('CadastroMailing');
		$model = "CadastroMailing";
		$conditions = array('OR'=>array('cadastro_mailing_tipo_id'=>$dados));
		$result = $this->CadastroMailing->find('all',array( 'fields' => $fields, 'conditions'=>$conditions , 'order'=>array('nome ASC')));
			
            $filename = "mailing.csv";
            					
		$csv_file = fopen('php://output', 'w');
 
                $this->response->header(array('Content-type: application/csv'));
		$this->response->header(array('Content-Disposition: attachment; filename="'.$filename.'"'));
 
            $header_row = array("id", "name", "email");
 
            fputcsv($csv_file,$header_row,',','"');
            foreach($results AS $result) {
                $row = array(
	                $result->$model->id,
	                $result->$model->name,
	                $result->model->email
                );
 
                fputcsv($csv_file,$row,',','"');
            }
            fclose($csv_file);
        }
        $this->layout = false;
        $this->render(false);
		
		$file = $this->Attachment->getFile($csv_file);
	    $this->response->type('csv');
	    $this->response->download('mailing.csv');
	    $this->response->body($file['content']);
	    $this->response->send();		
		
	}

O que há de errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque seu código dentro do bloco try{} e ve se dispara algum erro

try {

     #code 
      
} catch (Exception $e) {
    die('Error: '. $e->getMessage());
}

Corrige estas var abaixo, retire o $:

 

$result->$model->id,
$result->$model->name,
$result->model->email

Compartilhar este post


Link para o post
Compartilhar em outros sites

Erro algum, Williams. :upset:

 

No console do firebug, retorna parte do código HTML somente.


 

ATUALIZADO:

 

Williams, tinha um outro erro no código. Porém resolvido.

 

Colocando o código dentro do try, ele retornou o erro:

error: View file "/var/www/site/admin/app/Plugin/Leads/View/Leads/1.ctp" is missing.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não está encontrando o arquivo do plugin brow, se tivesse feito na unha seu próprio código, já teria resolvido.

 

Isso é bem simples de se fazer ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue brow!

 

Testado e funcionando só adaptar a sua query

<?php

public function export(){
    
    $this->layout=false;
    $this->render(false);

    try {
		
	$data = array (
            'email@outlook.com',
            'email2@outlook.com;email3@gmail.com',
            'email4@outlook.com'
        );

        $output = sprintf('email_marketing_%s.csv', date('d-m-Y'));

        $fp = fopen('php://output', 'w+'); 
	header('Content-type: application/octet-stream');  
        header('Content-disposition: attachment; filename="'. $output.'"');

        foreach($data as $line){
            $val = explode(";",$line);
            fputcsv($fp, $val);
        }
        fclose($fp);       
		
                    
    } catch (Exception $e) {
		
    }	
		
}

Para montar o array vindo do BD use array_push

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.