CakePHP Brasil

11 setembro 2008

Trabalhando com JSON no CakePHP 1.2

Arquivado em: CakePHP, Tutoriais — Tags:, , , , , , — Juan Basso @ 10:13 pm

Com o crescimento do uso de AJAX, da maioria dos frameworks de JavaScript (jQuery, Prototype, mooTools, YUI, ExtJS, …) e de uma dúvida no Groups do Google (Action que renderize apenas o layout, sem necessidade de uma view), resolvi escrever um post falando sobre como usar JSON no CakePHP de forma automática para retorno dos dados, sem precisar gerar um arquivo de view para cada action e que não fere o MVC.
A Solução

Para solucionar o caso, achei que o melhor jeito seria criando uma classe de View nova. A classe View do CakePHP ela sempre procura um arquivo de view, além do template. Com a nova classe, seria feita a renderização ali mesmo, sem a necessidade de novos arquivos.

A classe que criei (JsonView) pode ser baixada aqui. Ela deve ser colocada na pasta views de da sua aplicação (nenhuma sub-pasta) com o nome de json.php. Ou seja, no final, você terá o caminho app/views/json.php.
Como Usar

Para usar é bem simples. No seu controller, quando você for retornar um código em JSON, basta alterar a variável $view do controller para usar a nova classe. Além disso, os dados que você quer que retorne, devem ser setados com o nome ‘json‘ no seu controller. Caso não seja, ele vai renderizar normalmente. Exemplo de uso no controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class UsuariosController extends AppController {
	var $uses = array('Usuario', 'Grupo');
 
	function index($json = false) {
		$this->set('usuarios', $this->Usuario->find('list'));
		if ($json) {
			$this->view = 'Json';
			$this->set('json', 'usuarios');
		}
	}
 
	function multilista($json = false) {
		$this->set('usuarios', $this->Usuario->find('list'));
		$this->set('grupos', $this->Grupo->find('list'));
		if ($json) {
			$this->view = 'Json';
			$this->set('json', array('usuarios', 'grupos'));
		}
	}
}

Neste caso, quando o parâmetro de index não for true, ele vai renderizar como se fosse uma requisição normal. Caso passe como true, ele irá renderizar como JSON. Já no método multilista, além do parâmetro para verificar se é JSON, ele passa um array de variáveis para a view JSON, assim a classe irá renderizar mais de uma variável.

Outra maneira de se fazer é definir a variável $view da classe diretamente com ‘Json’ (assim como foi feito com $uses no exemplo). Assim, sempre que você der um set na variável ‘json’, a classe da View se liga e renderiza em json, caso contrário mantém o normal.

Conclusão

Este é um método fácil e rápido de renderizar as requisições JSON, sem precisar criar um arquivo para cada requisição e sem precisar de muito código (tanto no controller, quanto na view).

O código que fiz, é compatível com PHP 4 e 5, então é possível usar com o CakePHP sem medo em qualquer versão de PHP.

Abraços e bom uso. :) Dicas são sempre bem vindas.

12 maio 2008

Controller sem Model

Arquivado em: CakePHP — Tags:, , , — Juan Basso @ 9:08 pm

Estava lendo o blog de Daniel Hofstetter e vi uma coisa muito interessante que deve ser ressaltado e alertado ao pessoal. Quando você usa controladores e não quer utilizar modelos, você pode fazer isto de duas maneiras:

1
2
3
class MeuController extends AppController {
    var $uses = null; 
}

OU

1
2
3
class MeuController extends AppController {
    var $uses = array(); 
}

Eu uso normalmente o “$uses = null;”, mas com este post vou mudar de atitude. O motivo é o seguinte: quando você faz o uso de modelos dentro do AppController, por exemplo, você utiliza a variável $uses também informando o nome do modelo. Entretando, como o seu controlador é uma classe filha do AppController, ele acaba “destroindo” a variável dos modelos e ao utilizar nas funções do AppController ele dizia que a propriedade não estava definida.
Quando você utiliza $uses = array(), o Cake faz um merge, ou seja, junta o vetor vazio do seu controlador com o vetor com informações do AppController.

Portanto, vamos utilizar $uses = array() daqui em diante quando não quisermos utilizar modelos. Assim, evitamos problemas mais sérios.

Powered by WordPress