Facilidades para sua vida – Parte 7 – CakePHP json encode
by Michael Mafort on fev.02, 2009, under CakePHP, Facilidades para sua vida, PHP
Bom nesta parte vamos tratar de um problema muito comum quando vamos trabalhar com ajax, utilizando json como padrão de dados. O principal problema que enfrentamos é referente ao uso de palavras acentuadas e configurações do servidor, então para livrar deste problema criei um component que transforma as informações de uma query em json.
jsonComponent.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class jsonComponent extends Object { public function encode($data){ $tmp_arr = array(); if( is_array($data) ){ foreach( $data as $key => $value ){ if( is_array($value) ){ $tmp_arr[] = "'$key':{" . $this->encode($value) . "}"; } else{ $tmp_arr[] = "'$key':'$value'"; } } } else { return "'$data'"; } return join(", ", $tmp_arr); } } |
Para utilizá-lo basta inserir em seu controller a variável:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $components = array('json'); //para converter um array em json use: function minha_funcao(){ $produtos = array('Produto'=>array( array('id'=>1, 'descricao'=> 'Carne moída', 'valor'=>10.50), array('id'=>2, 'descricao'=>'Feijão preto', 'valor'=>2.90))); $json = "{" . $this->json->encode($produtos) . "}"; echo $json; //resultado será: //{'Produto':{'0':{'id':'1', 'descricao':'Carne moída', 'valor':'10.5'}, '1':{'id':'2', 'descricao':'Feijão preto', 'valor':'2.9'}}} |
Ou você poderá criar diretamente um novo método ao seu app_model da seguinte forma:
app_model.php
1 2 3 4 5 6 7 8 | public function json($type='all', $conditions=array()){ $result = $this->find($type, $conditions); App::import("Component", "json"); $json = new jsonComponent(); return "{". $json->encode($result) ."}"; } |
Com o método no app_model, você vai chamar o seu método da seguinte forma:
1 2 3 4 5 6 7 8 9 | //Utilize a mesma sintaxe do find $meu_json = $this->MeuModel->json('all', array('conditions'=>array('MeuModel.preco < 2'), 'fields'=>array('MeuModel.id','MeuModel.descricao'))); echo $meu_json;//{'Produto':{'0':{'id':'1', 'descricao':'Carne moída', 'valor':'10.5'}, '1':{'id':'2', 'descricao':'Feijão preto', 'valor':'2.9'}}} //Lembre-se sempre de definir o header antes da saída de dados "echo" quando estiver utilizando json. //Exemplo: header('Content-Type: text/javascript'); echo $meu_json; |
No javascript para acessar os valores pode-se usar:
1 2 3 | var json = {'Produto':{'0':{'id':'1', 'descricao':'Carne moída', 'valor':'10.5'}, '1':{'id':'2', 'descricao':'Feijão preto', 'valor':'2.9'}}}; produto_um = json.Produto[0].id; // use um loop para percorrer dinamicamente todo o objeto, recomendo utilizar "for in". |
Bom espero que possa ser mais uma facilidade para vocês também.
Abraço!