Action que renderize apenas o layout, sem necessidade de uma view

124 views
Skip to first unread message

Vinicius Brandao

unread,
Sep 10, 2008, 6:43:56 PM9/10/08
to cake-...@googlegroups.com
Fiz um layout que tranforma um array em notação JSON para ser utilizado por AJAX. A minha idéia era que em toda action que eu precisasse que o retorno fosse JSON, eu apenas setasse esse layout e desse um $this->set('json_array',$array);

Aí fui desenvolver uma action de teste:

function json(){
    $this->layout = 'js/json';
    $this->set('json_array', array('a'=>1,'b'=>2));
}

Do qual eu queria o seguinte retorno:

{a:1,b:2}

Mas como eu não criei a view json.ctp, o cake reclamou que não existia a view. Então eu fui tentar uma forma de evitar o uso dessa view, mas não consegui. A melhor solução que encontrei foi aumentar minha action para:

function json() {
    $this->layout = 'js/json';
    Configure::write('debug',0);
    $this->set('json_array', array('a'=>1,'b'=>2));
    $this->render(null,null,VIEWS.DS.'pages'.DS.'empty.ctp');
    $this->autoRender = false;
}

E criar uma view na pasta pages chamada empty.ctp que é um arquivo de texto vazio.

Alguém sabe uma forma mais elegante de fazer isso que eu tô querendo? (renderizar um layout sem precisar da view)

Cesar Fuentes

unread,
Sep 11, 2008, 8:49:25 AM9/11/08
to cake-...@googlegroups.com
cara, não entendi muito bem... eu faço isso pra pegar um json:

function destaques(){
$agora = date("Y-m-d H:i:s");
$destaques = $this->Texto->find('all', array('conditions' =>
array('Texto.tipo' => TEXTO_NOTICIA, 'Texto.status' => 2,
'Texto.data_publicacao <' => $agora), 'order' => 'data_publicacao
desc', 'limit' => 3, 'fields' => array('id', 'titulo', 'resumo')));
foreach($destaques as $destaque){
$destaque['Arquivo'][0]['link_imagem'] =
$this->webroot.'files'.url($destaque['Arquivo'][0]['id'],
$destaque['Arquivo'][0]['extensao']);
$destaques1[] = $destaque;
}
//echo '<pre>'; print_r($destaques1);
echo $this->json->encode($destaques1);
exit;
}

2008/9/10 Vinicius Brandao <vbme...@gmail.com>:

Vinicius Brandao

unread,
Sep 11, 2008, 8:56:46 AM9/11/08
to cake-...@googlegroups.com
hmm

realmente a sua solução parece mais simples.

Obrigado pela ajuda. Acho que viajei um pouco hehehe

2008/9/11 Cesar Fuentes <fue...@fuentes.be>

Vinicius Brandao

unread,
Sep 11, 2008, 4:29:34 PM9/11/08
to cake-...@googlegroups.com
Amigo,

Tentei fazer o que você falou mas não funcionou. Retorna esse erro:

Notice (8): Undefined property:  UnidadesDeMedidaController::$json [APP/controllers/unidades_de_medida_controller.php, line 57]

Isso que você usa é um component é?


2008/9/11 Vinicius Brandao <vbme...@gmail.com>

Juan Basso

unread,
Sep 11, 2008, 7:23:41 PM9/11/08
to Cake PHP Português
Fuentes,

Seu exemplo não está errado, vai funcionar. Porém, eu acho que ele
fere o MVC, pois você está retornando a view do seu sistema de dentro
do controller. Para mim echo, print, print_r, var_dump e afins são
totalmente letais ao MVC quando usadas fora da view.

Bem, se eu acho que fere, vamos ao modo alternativo:
Eu criaria uma classe de View, calma, não se espantem, isso não é um
bicho de 7 cabeças. Ele é bem simples. Com isso, você faria ali o
gerador de json e todas as regras que você precisa. Você só precisa
implementar a classe e colocar o método render com três parâmetros:
$action, $layout e $file (acho que o nome de cada uma já diz tudo).

Depois, no seu controller, você define $this->view com o nome dessa
classe nova e pronto. Sem gambis, com MVC. :)

Se quiser uma ajuda pra criar a classe de View, posso montar um
protótipo aqui e até postar no blog.


Abraços,

Juan Basso
http://blog.cakephp-brasil.org


On 11 set, 18:29, "Vinicius Brandao" <vbmen...@gmail.com> wrote:
> Amigo,
>
> Tentei fazer o que você falou mas não funcionou. Retorna esse erro:
>
> *Notice* (8) <javascript:void(0);>: Undefined property:
> UnidadesDeMedidaController::$json
> [*APP/controllers/unidades_de_medida_controller.php*, line *57*]
>
> Isso que você usa é um component é?
>
> 2008/9/11 Vinicius Brandao <vbmen...@gmail.com>
>
> > hmm
> > realmente a sua solução parece mais simples.
>
> > Obrigado pela ajuda. Acho que viajei um pouco hehehe
>
> > 2008/9/11 Cesar Fuentes <fuen...@fuentes.be>
>
> >> cara, não entendi muito bem... eu faço isso pra pegar um json:
>
> >> function destaques(){
> >>        $agora = date("Y-m-d H:i:s");
> >>                $destaques = $this->Texto->find('all', array('conditions'
> >> =>
> >> array('Texto.tipo' => TEXTO_NOTICIA, 'Texto.status' => 2,
> >> 'Texto.data_publicacao <' => $agora), 'order' => 'data_publicacao
> >> desc', 'limit' => 3, 'fields' => array('id', 'titulo', 'resumo')));
> >>                foreach($destaques as $destaque){
> >>                        $destaque['Arquivo'][0]['link_imagem'] =
> >> $this->webroot.'files'.url($destaque['Arquivo'][0]['id'],
> >> $destaque['Arquivo'][0]['extensao']);
> >>                        $destaques1[] = $destaque;
> >>                }
> >>                //echo '<pre>'; print_r($destaques1);
> >>                echo $this->json->encode($destaques1);
> >>                exit;
> >>        }
>
> >> 2008/9/10 Vinicius Brandao <vbmen...@gmail.com>:

Juan Basso

unread,
Sep 11, 2008, 9:13:22 PM9/11/08
to Cake PHP Português
Já me adiantei e criei o post lá. O link é
http://blog.cakephp-brasil.org/2008/09/11/trabalhando-com-json-no-cakephp-12/


Juan Basso

On 11 set, 21:23, Juan Basso <jrba...@gmail.com> wrote:
> Fuentes,
>
> Seu exemplo não está errado, vai funcionar. Porém, eu acho que ele
> fere o MVC, pois você está retornando a view do seu sistema de dentro
> do controller. Para mim echo, print, print_r, var_dump e afins são
> totalmente letais ao MVC quando usadas fora da view.
>
> Bem, se eu acho que fere, vamos ao modo alternativo:
> Eu criaria uma classe de View, calma, não se espantem, isso não é um
> bicho de 7 cabeças. Ele é bem simples. Com isso, você faria ali o
> gerador de json e todas as regras que você precisa. Você só precisa
> implementar a classe e colocar o método render com três parâmetros:
> $action, $layout e $file (acho que o nome de cada uma já diz tudo).
>
> Depois, no seu controller, você define $this->view com o nome dessa
> classe nova e pronto. Sem gambis, com MVC. :)
>
> Se quiser uma ajuda pra criar a classe de View, posso montar um
> protótipo aqui e até postar no blog.
>
> Abraços,
>
> Juan Bassohttp://blog.cakephp-brasil.org

Cesar Fuentes

unread,
Sep 11, 2008, 11:00:41 PM9/11/08
to cake-...@googlegroups.com
bom, não sou muito xiita quanto a design patterns... o componente está
em anexo...

você decide!

2008/9/11 Juan Basso <jrb...@gmail.com>:
json.php

Vinicius Brandao

unread,
Sep 12, 2008, 6:32:23 AM9/12/08
to cake-...@googlegroups.com
Obrigado ao dois. Vou dar uma olhada em ambas as opções e ver qual a melhor.

2008/9/12 Cesar Fuentes <fue...@fuentes.be>

Vinicius Brandao

unread,
Sep 12, 2008, 6:43:58 AM9/12/08
to cake-...@googlegroups.com
Juan,

Coloquei um post no meu blog falando sobre o seu post com a referência.

2008/9/12 Vinicius Brandao <vbme...@gmail.com>

Gustavo Carreno

unread,
Sep 12, 2008, 8:24:49 AM9/12/08
to cake-...@googlegroups.com
Boas Cesar,

Sei que é válido usar o $uses.
Mas dava pra retirar essa linha e confiar nas associações para chegar
a modelos mais dentro do aninhamento de associações.
Tipo: $this->Model1->Model2->etc, etc...

Tenho andado a batalhar nesta faz uns tempos.
Faz mais sentido, visto que as associações jé lá estão mesmo. E para
ser franco nem sei se usando o $uses não estamops a contribuir para
uma duplicação dos arrays internos de associações, memória mal gasta?

[]'s
Gus

Cesar Fuentes

unread,
Sep 12, 2008, 10:37:09 AM9/12/08
to cake-...@googlegroups.com
não se você está pegando de um model que não tem associação....

uso o uses porque estou pegando no pages_controller, é pra preencher
os destaques da página inicial...

mas vc tem razão, se houvesse associação não seria necessário.

2008/9/12 Gustavo Carreno <gusca...@googlemail.com>:

Gustavo Carreno

unread,
Sep 12, 2008, 5:45:16 PM9/12/08
to cake-...@googlegroups.com
Hahh, esse bostudo. Sim esse precisa que se lhe diga tudo, o maldito...

[]'s
Gus

2008/9/12 Cesar Fuentes <fue...@fuentes.be>:

Cesar Fuentes

unread,
Sep 12, 2008, 5:54:32 PM9/12/08
to cake-...@googlegroups.com
hauhauah, bostudo? hauahuahau

2008/9/12 Gustavo Carreno <gusca...@googlemail.com>:
Reply all
Reply to author
Forward
0 new messages