Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
Olá Anderson, obrigado por responder.
Então, eu preciso do ajax pois, quando o user clica no botão correspondente, ele consulta e monta o array de mailings referente.
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
Fiz, Willian, mas não consegui entender e, obviamente, não funcionou.
Vamos lá, passo a passo:
$_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. =/
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');
...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?
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
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.
Foi resolvido ou não foi? :wacko:
Não. Deu este erro .
error: View file "/var/www/site/admin/app/Plugin/Leads/View/Leads/1.ctp" is missing.
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 ;)
Mas esse aí não utilizei a Classe, foi feito realmente na unha, utilizando as funções nativas do PHP.
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
Olá Michel,
Você pode usar um iframe no lugar do ajax e forçar um download pelo PHP:
http://blog.thiagobelem.net/forcando-o-download-de-arquivos-com-php/