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.

19 maio 2008

Usando jQuery com CakePHP

Arquivado em: Tutoriais — Tags:, , — Juan Basso @ 8:59 pm

Vendo o questionamento de muitas pessoas no Google Groups, vou explicar como usar o jQuery juntamente com o CakePHP.

A primeira coisa que você tem que fazer é baixar o código do jQuery e colocá-lo na pasta vendors\js (tanto faz ser na vendors dentro de app ou fora). Depois disso, nos controllers que você for utilizar o jQuery, inclua o helper Javascript:

1
2
3
class SeuController extends AppController {
  var $helpers = array('Javascript');
}

Se você usa em todas as páginas, pode colocar isto no seu AppController.

Feito isso, você pode usar na sua view (ou layout) o seguinte código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Incluir o jQuery ao projeto
// Neste exemplo estou importando a jquery.tablesorter também
// O segundo parâmetro (false) é para indicar que vai no <head> e não no local onde está sendo executado
$javascript->link(array('jquery', 'jquery.tablesorter'), false);
 
// Aqui vou definir alguns comandos de jQuery
$javascript->codeBlock('
  $(document).ready(function(){
    $("#detalhe_compra").tablesorter({decimal: ",", dateFormat: "uk"});
    $("#resumo_compras").tablesorter({decimal: ",", dateFormat: "uk"});
  });', array('inline' => false));
?>
Minha view normalmente...

Com isso, você faz que o código javascript vá para o <head> do seu HTML e não fique no meio das suas views, o que é deselegante e fora do padrão W3C.

Num próximo post explico como usar jQuery e AJAX.

Powered by WordPress