Estratégia para layout com o Cake

9 views
Skip to first unread message

Cássio Talle

unread,
Sep 3, 2008, 9:41:22 PM9/3/08
to Cake PHP Português
Olá pessoal, estou fazendo um site que tem o seguinte layout:

-Menu superior fixo;

-Submenu Superior; que deve mudar de acordo com o controller que eu
esteja trabalhando:
Ex. Cliquei opção usuário do menu superior, deve aparecer no submenu
as opções (Alterar senha, alterrar perfil, trocar foto)

-Corpo do conteúdo; com o $content_for_layout;

- Um menu lateral fixo; com algumas lógicas, dados do meu usuário,
usuários online, ultimos posts etc..

Primeira pergunta.
Qual é a melhor forma de fazer com que o meu submenu mude acompanhando
os controllers que estão sendo acessados? Lembrando que eu estou
pensando em fazer isso no meu defealt.ctp, mas tb não sei se está é a
melhor opção.

Segunda pergunta;
Eu posso criar um controller para fazer a lógica do meu menu lateral
que estará localizado dentro do meu defealt.ctp?

Aceito obrigado sugestões e dicas de como trabalhar de uma forma mais
otimizada com layouts no cake.

Obrigado.

Juan Basso

unread,
Sep 3, 2008, 11:15:05 PM9/3/08
to Cake PHP Português
Primeira resposta.
Eu acho que a melhor forma de você fazer o seu sub-menu é colocando as
informações dentro de um component e passando para a view quais os sub-
menus que você quer que apareçam. Na view (layout), você coloca para
um element fazer o design.

Segunda resposta.
Acho que a lógica que você quer poderia estar dentro de um component
ao invés de um controller também. Não são lógicas de negócio, certo?
Se forem, devem ser tratadas no model, mesmo que não haja comunicação
com bancos.


Juan Basso

Paulo Diovani

unread,
Sep 4, 2008, 9:36:13 AM9/4/08
to cake-...@googlegroups.com
Não entendo como poderia se utilizar um "component" neste caso.
"Componentes" são fragmentos de código reutilizáveis, mas não tem nenhuma relação (inicialmente) com o "model" ou a "view".

A "action" de um "controller", por padrão, exibe uma "view", que é adicionada dentro do "layout". Mas como carregar valores no layout, que serão exibidos fora desta "view"?

$this->set() funciona para variáveis fora da view, e no restante do layout tb?

2008/9/4 Juan Basso <jrb...@gmail.com>



--
Paulo Diovani
pa...@diovani.com
+55 51 8146 5413
___________________
http://www.diovani.com

Marcelo Linhares

unread,
Sep 4, 2008, 9:57:56 AM9/4/08
to cake-...@googlegroups.com
Eu faço isto utilizando $this->requestAction na versão 1.1X, não to
acompanhando a versão 1.2 pra saber se ainda existe nesta versão.


2008/9/4 Paulo Diovani <diov...@gmail.com>:
--
Marcelo Linhares
Pessoal -> marcelolinhares.com
Procurando vagas em TI ? http://www.vagasem.info
Gerencie seu portfólio da BOVESPA de forma facilitada:
http://www.marcelolinhares.com/bolsa/

Paulo Diovani

unread,
Sep 4, 2008, 10:47:38 AM9/4/08
to cake-...@googlegroups.com
O requestAction aumenta a quantidade de requisições e, consequentemente, diminui a velocidade da aplicação. Devendo se evitada sempre que possível.

No caso do Cássio, o conteúdo dos "blocos" do layout dele dependem do controller e action acessados, assim é desnecessário (r má implementação) se utilizar o requestAction, visto que ele já tem os dados no controller.

Acho que é possível que ele possa utilizar normalmente $this->set() e carregar variáveis para serem utilizadas no layout, caso não funcione, a melhor alternativa que vejo é carregar estas variáveis em sessões, e utilizar o SessionHelper dentro de um Element (ou dentro do próprio layout).

2008/9/4 Marcelo Linhares <marcelo...@gmail.com>

Michael Mafort

unread,
Sep 4, 2008, 10:55:24 AM9/4/08
to cake-...@googlegroups.com
Nossa com requestAction é tão mais prático. Pensando em termos de requisições fazendo um set ou session write vai ter que fazer o mesmo request no banco para trazer os dados, a praticidade do requestAction esta em que se instancia o objeto e já faz a busca, podendo ser chamado em qualquer view ou controller.

2008/9/4 Paulo Diovani <diov...@gmail.com>



--
Michael Mafort
CRIASOL - Desenvolvimento Web
Diretor de Tecnologia
+55 31 9846-5904
michae...@criasol.com.br

Paulo Diovani

unread,
Sep 4, 2008, 10:58:52 AM9/4/08
to cake-...@googlegroups.com
Michael, vc não entendeu o ponto...
Uma vez que estes blocos (menu e status) do layout dele, dependendo controller e actino chamado, ele JÁ TEM os dados na mão. Usar um requestAction neste caso é desperdício de recursos (vai fazer a mesma requisição na base duas vezes).

2008/9/4 Michael Mafort <michae...@gmail.com>

Michael Mafort

unread,
Sep 4, 2008, 11:03:17 AM9/4/08
to cake-...@googlegroups.com
Ai concordo, mas se for para usar um outro método de uma outra classe não vejo muita diferença.

2008/9/4 Paulo Diovani <diov...@gmail.com>

Vinicius Brandao

unread,
Sep 4, 2008, 11:51:47 AM9/4/08
to cake-...@googlegroups.com
E se o requestAction não fizer requisição pra a base?

Mas nesses casos eu crio um element pra cada controller, e adiciono ele nas views do controller. Talvez pensando um pouco mais, usando o $params pra saber em que controller está, seja possível criar um único menu e incluí-lo no layout...

2008/9/4 Michael Mafort <michae...@gmail.com>

Cássio Talle

unread,
Sep 4, 2008, 12:32:00 PM9/4/08
to Cake PHP Português
Olá pessoal...
Eu fiquei um pouco confuso com as opiniões, como eu não sou tão
experiente com o cake gostaria que alguém esboçasse como seria a
implementação destas soluções...

Com o componet e com o requestAction.

Eu tb pensei em usar Session como foi comentado, mas tem lá suas
devantegens e tb não é tão elegante.

obs. Estou usando o CakePHP 1.2

Abraços

On 4 set, 12:51, "Vinicius Brandao" <vbmen...@gmail.com> wrote:
> E se o requestAction não fizer requisição pra a base?
>
> Mas nesses casos eu crio um element pra cada controller, e adiciono ele nas
> views do controller. Talvez pensando um pouco mais, usando o $params pra
> saber em que controller está, seja possível criar um único menu e incluí-lo
> no layout...
>
> 2008/9/4 Michael Mafort <michaelmaf...@gmail.com>
>
> > Ai concordo, mas se for para usar um outro método de uma outra classe não
> > vejo muita diferença.
>
> > 2008/9/4 Paulo Diovani <diovan...@gmail.com>
>
> >> Michael, vc não entendeu o ponto...
> >> Uma vez que estes blocos (menu e status) do layout dele, dependendo
> >> controller e actino chamado, ele JÁ TEM os dados na mão. Usar um
> >> requestAction neste caso é desperdício de recursos (vai fazer a mesma
> >> requisição na base duas vezes).
>
> >> 2008/9/4 Michael Mafort <michaelmaf...@gmail.com>
>
> >>> Nossa com requestAction é tão mais prático. Pensando em termos de
> >>> requisições fazendo um set ou session write vai ter que fazer o mesmo
> >>> request no banco para trazer os dados, a praticidade do requestAction esta
> >>> em que se instancia o objeto e já faz a busca, podendo ser chamado em
> >>> qualquer view ou controller.
>
> >>> 2008/9/4 Paulo Diovani <diovan...@gmail.com>
>
> >>>> O requestAction aumenta a quantidade de requisições e, consequentemente,
> >>>> diminui a velocidade da aplicação. Devendo se evitada sempre que possível.
>
> >>>> No caso do Cássio, o conteúdo dos "blocos" do layout dele dependem do
> >>>> controller e action acessados, assim é desnecessário (r má implementação) se
> >>>> utilizar o requestAction, visto que ele já tem os dados no controller.
>
> >>>> Acho que é possível que ele possa utilizar normalmente $this->set() e
> >>>> carregar variáveis para serem utilizadas no layout, caso não funcione, a
> >>>> melhor alternativa que vejo é carregar estas variáveis em sessões, e
> >>>> utilizar o SessionHelper dentro de um Element (ou dentro do próprio layout).
>
> >>>> 2008/9/4 Marcelo Linhares <marcelolinha...@gmail.com>
>
> >>>>> Eu faço isto utilizando  $this->requestAction na versão 1.1X, não to
> >>>>> acompanhando a versão 1.2 pra saber se ainda existe nesta versão.
>
> >>>>> 2008/9/4 Paulo Diovani <diovan...@gmail.com>:
> >>>>> > Não entendo como poderia se utilizar um "component" neste caso.
> >>>>> > "Componentes" são fragmentos de código reutilizáveis, mas não tem
> >>>>> nenhuma
> >>>>> > relação (inicialmente) com o "model" ou a "view".
>
> >>>>> > A "action" de um "controller", por padrão, exibe uma "view", que é
> >>>>> > adicionada dentro do "layout". Mas como carregar valores no layout,
> >>>>> que
> >>>>> > serão exibidos fora desta "view"?
>
> >>>>> > $this->set() funciona para variáveis fora da view, e no restante do
> >>>>> layout
> >>>>> > tb?
>
> >>>>> > 2008/9/4 Juan Basso <jrba...@gmail.com>
> >>>>> Procurando vagas em TI ?http://www.vagasem.info
> >>>>> Gerencie seu portfólio da BOVESPA de forma facilitada:
> >>>>>http://www.marcelolinhares.com/bolsa/
>
> >>>> --
> >>>> Paulo Diovani
> >>>> pa...@diovani.com
> >>>> +55 51 8146 5413
> >>>> ___________________
> >>>>http://www.diovani.com
>
> >>> --
> >>> Michael Mafort
> >>> CRIASOL - Desenvolvimento Web
> >>> Diretor de Tecnologia
> >>> +55 31 9846-5904
> >>> michaelmaf...@criasol.com.br
>
> >> --
> >> Paulo Diovani
> >> pa...@diovani.com
> >> +55 51 8146 5413
> >> ___________________
> >>http://www.diovani.com
>
> > --
> > Michael Mafort
> > CRIASOL - Desenvolvimento Web
> > Diretor de Tecnologia
> > +55 31 9846-5904
> > michaelmaf...@criasol.com.br
>
>

byBartus

unread,
Sep 4, 2008, 12:44:10 PM9/4/08
to Cake PHP Português
Opa,

cara, fiz no meu site algo semelhante ao que você precisa, mas para a
exibição de banners, pois dependendo do controller e da action
seleciono anúncios de diferentes fontes. Faço isso utiilizando um
"element" e passando variáveis para ele.

Bom, segue o código para fazer teu sub-menu:

No layout default.ctp:

<?php echo $this->element('sub_menu', array('nome_do_controller' =>
$this->params['controller'])); ?>

No element sub_menu.ctp:

<?php switch ($nome_do_controller) {

case "usuarios":
echo "<ul><li>Alterar senha</li><li>Alterar perfil</
li><li>Trocar foto</li></ul>";
break;

default:
echo "";
break;
}?>

Não sei se é a melhor opção para o que vc quer fazer, mas pra mim
ficou muito prático.

vlw t+





On 3 set, 23:41, Cássio Talle <cassiolan...@gmail.com> wrote:

Juan Basso

unread,
Sep 4, 2008, 12:52:53 PM9/4/08
to Cake PHP Português
Session eu concordo que é deselegante e uma utilização errada para o
que ela foi feita. Vão dizer que funciona, tudo bem. No PHP você pode
fazer milhões de coisas, mas que se for um bom programador não deve
fazer. É por esse motivo que muitos depreciam a linguagem, mas isso
não vem ao caso...

Se você usar um controller, você poderia colocar fazer algo assim:

class ... {
function beforeRender(&$controller) {
$submenus = array();
// Sua lógica
$controller->set('submenus', $submenus);
}
}

Dai carrega o component nos controller quer você quiser/precisar.

Detalhe: os itens do $controller->set() valem pro layout também.


Juan Basso

Paulo Diovani

unread,
Sep 4, 2008, 2:59:39 PM9/4/08
to cake-...@googlegroups.com
"Detalhe: os itens do $controller->set() valem pro layout também."
Era essa a minha dúvida. Valeu Juan.

Então, Cássio, se estes teus submenus são carregados a partir da base
de dados, ou dependam de algum determinado dado do controller, o
exemplo do Juan deve ser o que vc precisa. Fica fácil verificar se a
variável menus está definida antes de exibí-los.

Caso contrário, apenas utilizar um elemento, como o byBartus falou,
deve resolver (pessoalmente, eu prefiro o jeito do Juan).

2008/9/4 Juan Basso <jrb...@gmail.com>:

Cássio Talle

unread,
Sep 4, 2008, 4:36:31 PM9/4/08
to Cake PHP Português
Opa, eu usei o beforeRender no meu appcontroller e deu certinho em
todos os meus controllers o submenu...

Agora eu vou trabalhar na div lateral fixa do site...

Abraços...

On 4 set, 15:59, "Paulo Diovani" <diovan...@gmail.com> wrote:
> "Detalhe: os itens do $controller->set() valem pro layout também."
> Era essa a minha dúvida. Valeu Juan.
>
> Então, Cássio, se estes teus submenus são carregados a partir da base
> de dados, ou dependam de algum determinado dado do controller, o
> exemplo do Juan deve ser o que vc precisa. Fica fácil verificar se a
> variável menus está definida antes de exibí-los.
>
> Caso contrário, apenas utilizar um elemento, como o byBartus falou,
> deve resolver (pessoalmente, eu prefiro o jeito do Juan).
>
> 2008/9/4 Juan Basso <jrba...@gmail.com>:

Juan Basso

unread,
Sep 4, 2008, 5:55:31 PM9/4/08
to Cake PHP Português
Eu havia sugerido de colocar em um component separado para não
misturar muito com a rotina normal da página, deixando muito código no
AppController e posteriormente dificultando a leitura. É um passo mais
burocrático (via component), mas do seu jeito também funciona sem
problemas.

Para a div lateral vai bem um component também. :)


Juan Basso

Cássio Talle

unread,
Sep 5, 2008, 8:33:04 AM9/5/08
to Cake PHP Português
Então Juan essa parte eu não entendi muito:

Eu vou usar com um component do controller é desse que vc tá falando
né???

Eu executo ele no beforerender do appcontroller por exemplo e do um
set numa array (com os dados da div)
É assim???

Juan Basso

unread,
Sep 5, 2008, 12:16:42 PM9/5/08
to Cake PHP Português
Exatamente.

O beforeRender pode ser um método do Component. Essa é uma função de
callback dele. Ou seja, se o Component estiver carregado, antes (ou
depois, não lembro a ordem exata) do beforeRender do Controller ele
será executado. E assim, você não precisa declarar nada no seu
AppController além do "var $components = array('EsseQTamoFalando',
'... Outros ...');".

Isso será automático. Entendeu?


Juan Basso
> ...
>
> mais »
Reply all
Reply to author
Forward
0 new messages