Filtro no controller

14 views
Skip to first unread message

Benício Júnior

unread,
Jun 19, 2009, 7:54:49 AM6/19/09
to Cake PHP Português
Olá amigos,

Estou com uns problemas no Cake. Vou exemplificar somente com duas
tabelas do que necessito: tipos (id, descricao) e subtipos (id,
descricao, tipo_id). O que eu quero é que sejam exibidas os subtipos
agrupados por tipos, só que eu estou utilizando a pages_controller.php
pra setar as variaveis e exibindo na default.ctp. Segue abaixo um
trecho dos códigos que eu tou usando.

pages_controller.php

$this->set("tipos",$this->Tipo->find('all',array('order' =>
'Tipo.descricao ASC','fields' => array('Tipo.id',
'Tipo.descricao'))));

$this->set("subtipos",$this->Tipo->Subtipo->find('all',array(NULL,
'fields' => array('Subtipo.id', 'Subtipo.descricao',
Subtipo.tipo_id),'order' => array('Subtipo.descricao ASC'))));

default.ctp

php foreach ($tipos as $tipo):
echo $html->link($tipo['Tipo']['descricao'],'#');
php foreach ($subtipos as $subtipo):
echo $html->link($subtipo['Subtipo']['descricao'],'#');
php endforeach;
php endforeach;

Dá forma que está sendo exibida vem todas os subtipos dentro de cada
tipo e não especifica. Consegui resolver o problema colocando um IF
dentro da default.ctp e checando o id com tipo_id somente para testar
e funcionou. Mas preciso fazer de uma forma correta e sem POG já que
vou precisar de mais rotinas semelhantes. Tentei fazer como um exemplo
de cidades e estados

$this->set("subtipos",$this->Tipo->Subtipo->find('all',array
('conditions' => array('Subtipo.tipo_id' => $this->data['Tipo']
['id']), 'fields' => array('Subtipo.id', 'Subtipo.descricao',
Subtipo.tipo_id),'order' => array('Subtipo.descricao ASC'))));

O resultado retornado é Subtipo.tipo_id IS NULL. Desde já agradeço a
ajuda da galera. Um abraço a todos

Matheus Oliveira"

unread,
Jul 8, 2009, 6:47:55 PM7/8/09
to Cake PHP Português
Olá Benício, tudo bem?

Pelo o que entendi, acho que isso vai te ajudar:
http://book.cakephp.org/pt/view/91/Tree

Se não for isso, me dá um toque.

Abraços!

Marco Antonio Lima

unread,
Jul 9, 2009, 7:54:39 AM7/9/09
to cake-...@googlegroups.com
Olá Benício, com está?

Escute amigo, você precisou colocar está lógica em page_controller por alguma imposição externa? Por exemplo: O cliente mandou? o chefe mandou? O sistema é legado?

Pergunto isso pq espera-se que pages_controller controle as páginas estáticas de sua aplicação, assim como default.ctp contenha o mínimo de html possível, o suficiente apenas para manter a aparência (Theme) uniforme de seu site.

A página default de sua aplicação seria então composta por default.ctp e home.ctp. E então você poderia criar quantas páginas estáticas fossem necessárias.

Assim, você aproveitaria melhor o poder e as facilidades que os desenvolvedores do Cake criaram para todos nós.

Sendo assim, como você informou que são apenas dois níveis de informação necessárias (Tipos, e subtipos), e considerando que estas tabelas estão relacionadas em "um para muitos", a solução para seus problemas seria:

- Fazer os controllers e models das duas tabelas, até com o bake, se quiser ganhar tempo, com todos os métodos: index, add etc...
- Usar findAll para pegar todos os Tipos, pois como estão relacionadas as tabelas, cada Tipo virá com seus respectivos Subtipos.
- Usar requestAction() e renderElement() para lançar estes dados na page home.ctp, que eu acho que é o que vc precisa.

Achou que a performance da aplicação ficou prejudicada com a utilização de requestAction e renderElement?
Então você pode setar como rota principal da aplicação uma página dinâmica, como a index.ctp do tipos_controller, e usar o método findAll normalmente.

Vale lembrar que a possível perda de performance citada na documentação, quando se utiliza Request e Render, são sentidas apenas nas grandes aplicações com diversas conexões simultâneas. Para as médias e pequenas não vi relatos de reclamações.

Voltando para a solução, usando o findAll, você pode ajustar com os argumentos deste método para fornecer um resultado mais satisfatório. Ou usar o Behavior Containable, ou até mesmo o Compact para mostrar as informações, do jeito que necessita.

Bom, aproveitando o que o Frameworks já lhe fornece, você se livra melhor da POG.

Espero ter ajudado,

Marco A. Lima.



2009/7/8 Matheus Oliveira" <mathe...@gmail.com>
Reply all
Reply to author
Forward
0 new messages