Michael Mafort

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!


Leave a Reply

Procurando por algo?

Digita ai pra ver se encontramos:

Não achou o que procurava? Envie um comentário para o autor informando o que deseja!