Melhor Prática com menu dinâmico

95 views
Skip to first unread message

Marcelo Rodrigo

unread,
Jun 18, 2009, 9:58:24 AM6/18/09
to kohana-php
Galera,

Tenho uma situação aqui e queria ouvir a opinião de vocês na melhor forma de implementar isto.
Em uma aplicação, temos uma estrutura de "templates" que usa view dentro da view.

  1. Temos uma view "esqueleto" chamada index, que só contém <?php echo $header; echo $content; echo $footer;?>
  2. No header, temos um menu (além de outras coisas, claro)
  3. Dentro deste menu, temos um menu que será carregado dinamicamente via ORM

Agora vem o problema: todas as actions dos controllers usam esta view "esqueleto" e teríamos de implementar uma chamada ao ORM para carregar os itens dinâmicos toda e qualquer action de cada controller.

Só que colocar chamadas ao ORM na View eu achei muito POG, alguma idéia de como resolver isto sem ser repetitivo?
Não sei se consegui ser claro.

Qualquer dúvida, estou a disposição.
Atenciosamente,

Marcelo Rodrigo
smartFocus | Tecnologia
http://www.smartfocus.com.br
47 8408-2432 | 47 3001-4100

Reginaldo Sousa

unread,
Jun 18, 2009, 10:12:17 AM6/18/09
to kohan...@googlegroups.com
Cria uma Lib pra fazer isso.

2009/6/18 Marcelo Rodrigo <mrod...@gmail.com>



--
Reginaldo Sousa | Desenvolvedor web
regina...@gmail.com, rms...@hotmail.com
(21) 8728-1850

Marcelo Rodrigo

unread,
Jun 18, 2009, 10:14:47 AM6/18/09
to kohan...@googlegroups.com
Reginaldo,
Eu havia pensado que era POG isto também. Pô, boa idéia ... gostei, valeu :)

Qualquer dúvida, estou a disposição.
Atenciosamente,

Marcelo Rodrigo
smartFocus | Tecnologia
http://www.smartfocus.com.br
47 8408-2432 | 47 3001-4100


2009/6/18 Reginaldo Sousa <regina...@gmail.com>

caio ariede

unread,
Jun 18, 2009, 10:17:48 AM6/18/09
to kohan...@googlegroups.com
O menu é amarrado a action do controller?

Você pode usar as variáveis estáticas públicas da biblioteca Router:
public static $controller;
public static $method;
E ai fazer os "casamentos" entre o menu e os controllers + methods.

$menu['default'] = array('controller_tal' => array('action1', 'action2'));
$menu['menu2'] = array() ...

Caio Ariede
http://caioariede.com/


2009/6/18 Marcelo Rodrigo <mrod...@gmail.com>

caio ariede

unread,
Jun 18, 2009, 10:19:16 AM6/18/09
to kohan...@googlegroups.com
Esqueci de dizer, para chamar as variáveis você pode usar:

Router::$controller e Router::$method

var_dump(Router::$controller);

Na verdade, isso é uma solução mais para você evitar códigos desnecessários dentro do controller, deixando-o mais enxuto.

Caio Ariede
http://caioariede.com/


2009/6/18 caio ariede <caio....@gmail.com>

Beto

unread,
Jun 18, 2009, 10:24:10 AM6/18/09
to kohan...@googlegroups.com
Show esse lance do Router :D
Vai p/ minhas anotações hehehehe.


[]´s

- - - - - - - - - - - - - - - - - - - - -
Luiz Alberto S. Ribeiro [ Beto ]
http://beto.euqueroserummacaco.com


2009/6/18 caio ariede <caio....@gmail.com>
method

Rafael Pacini

unread,
Jun 18, 2009, 10:48:02 AM6/18/09
to kohan...@googlegroups.com
Olá pessoal,

como a discussão é relacionada to pegando carona...

comecei a usar o kohana a poucos dias (primeira experiência com um framework) e não sei se estou trabalhando com os templates da maneira correta ou se há uma melhor solução

ex:

# aqui ficam todos os 'pedaços' que seram chamados de acordo com a necessidade do layout pra cada view.

<?php defined('SYSPATH') or die('No direct access allowed.');

class Template_Controller extends Controller {
   
    public function head()
    {
        $head = new View('template/head');
        $head->render(true);
    }
   
    public function topo()
    {
        $head = new View('template/topo');
        $head->render(true);
    }
   
    public function footer()
    {
        $head = new View('template/footer');
        $head->render(true);
    }
}

?>

# e as views ficam assim:

<?php $template = new Template_Controller(); ?> # tem problema chamar um controller direto na view?
<?php echo $template->head(); ?>
<table>
 <tr>
  <td><b>Nome</b></td>
  <td><b>Cliente</b></td>
  <td><b>Andamento</b></td>
  <td><b>Status</b></td>
 </tr>   
 <?php foreach ($projetos as $projeto){?>
 <tr>
  <td><?php echo $projeto->nome; ?></td>
  <td><?php echo $projeto->nome_empresa; ?></td>
  <td><?php echo $projeto->status; ?></td>
  <td><?php echo '0%'; ?></td>
 </tr>
 <?php }?>
</table>
<?php echo $template->footer(); ?>




2009/6/18 Beto <madeinn...@gmail.com>

Reginaldo Sousa

unread,
Jun 19, 2009, 11:03:21 AM6/19/09
to kohan...@googlegroups.com
Você nunca deve instanciar Controllers.

Os Controllers servem apenas para direcionar o fluxo da aplicação.

2009/6/18 Rafael Pacini <mail....@gmail.com>

Newton Wagner

unread,
Jun 19, 2009, 11:09:04 AM6/19/09
to kohan...@googlegroups.com
Tem problema chamar o controller dentro da view sim. Você está "ferindo" o MVC.

O seu controller é o responsável por organizar as informações e passar
pra view o pacote prontinho pra ela só exibir.


Em relação à melhor forma de usar o Template_Controller eu vou ter que
passar, pois parei de mexer com o fw a algum tempo e nem lembro mais
como ele funciona! :(. Mas já-já alguém responde. :)



2009/6/18 Rafael Pacini <mail....@gmail.com>:
--
Newton Wagner

skype: newtonwagner
msn/gtalk: newt...@gmail.com

http://www.newtonwagner.net/
- http://www.diariodaselva.com.br/

Beto

unread,
Jun 19, 2009, 11:34:56 AM6/19/09
to kohan...@googlegroups.com
tu pode criar uma lib como foi dito anteriormente, tive numa situacao parecida, e ai resolvi usando uma lib que extende-se da Template_Controller, por exemplo:

em 

application/libraries/my_template_controller.php:


class My_Template_Controller_Core extends Template_Controller
{
//template padrao
public $template = 'template';

}


e depois nas views application/views/template.php

<html> ....
</head>
<body>
{ codigo do menu }
<?php echo $content ?>
{codigo do rodape }
</body>
</html>


e depois vc estende seus controllers dessa library:

class MeuController_Controller extends  My_Template_Controller {

    public function teste(){
            //em cada metodo do seu controller vc seta a view q aparecera no template       
            $this->template->content = new View('view desejada');
       
    }

}



Não sei se eu fui claro, mas dessa forma vc tem um template padrao e vai modificando apenas o conteudo ( $this->template->content ) de acordo com a sua necessidade.



[]´s

- - - - - - - - - - - - - - - - - - - - -
Luiz Alberto S. Ribeiro [ Beto ]
http://beto.euqueroserummacaco.com


2009/6/19 Newton Wagner <newt...@gmail.com>

Djam

unread,
Apr 19, 2012, 10:46:10 AM4/19/12
to kohan...@googlegroups.com
Não entendi muito bem, eu também quero fazer um menu dinâmico aqui cujos items que aparecerão dependerão das permissões da pessoa.

Tenho a tabela usuário, a menu, e a restrições, no caso preciso fazer um código para restringir o out da view, no caso escrever isto nela não serve correto.

E este menus aparecer em todos os templates que eu identificar, ai não sei como eu chamaria, a idéia era fazer algo tipo:

No Template:

...
$this->template->title = 'SisAmpara';
$this->template->autenticacao = '';
$this->template->menu = Menu_Core::render()
...

Onde o menu_core gera a lógica do negócio e manda renderizar em uma view tecnicamente "partials", ai com essa chamada eu imprimiria.

Mas não foi, alguem tem idéia como eu faria esta chamada?

Guilherme Maule

unread,
Apr 19, 2012, 11:08:56 AM4/19/12
to kohan...@googlegroups.com
Galera,

Eu tenho a mesma logica para os layout e tenho feito da seguinte forma:

Meu controller: (Vou dar um exemplo)

class Controller_Fornecedor extends Controller_Default {
public $template = 'templateForSite'; //Ele ta definindo o layouy padrao que possui as var $topo etc. Ele esta na pasta views/templateForSite.php
public function action_site()
{
           
           //Cria a logico aqui em array, que seria os itens de seu menu!     
           $categorias = array('Moda','Lojas','Saude','Bares','Servicos','Turismo');

           $this->template->topo = $view = View::Factory('index/menu')
->bind('menu', $categorias);

        }
}

Explicando:

  • $categorias = array('Moda','Lojas','Saude','Bares','Servicos','Turismo');
  • Aqui eu criei um array que pode ser criado dinamicamente, que seria o seu menu
  • $this->template->topo = $view = View::Factory('index/menu')
  • Aqui eu eu estou enviando para a minha Var $topo que esta no meu template views/templateForSite.php O template do menu.
Agora eu preciso enviar ao meu template na pasta views/index/menu.php as variaveis que seria o array, e as logicas que eu quiser.

  • ->bind('menu', $categorias);
  • Aqui eu uso a funcao bind para nomear uma variavel no meu template e carredo a variavel $menu que esta dentro do meu arquivo index/menu.php com o array que eu criei setando em $categorias...
desta forma eu posso carregar varias templantes dentro do meu index, criando separações inteligentes e até puxando ele quando eu quiser. Usando o bind eu envio as logicas que programei no meu controller para o layout mantendo assim as separações.

De boa, se falei besteira aqui. Desculpa, sou novo no Kohana. Espero ter dado uma luz.

Qual quer duvida, me responde.


--
Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php" dos Grupos do Google.
Para ver esta discussão na web, acesse https://groups.google.com/d/msg/kohana-php/-/uxOtofO0BPgJ.
Para postar neste grupo, envie um e-mail para kohan...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para kohana-php+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.



--
Att,
Guilherme Maule dos Reis
Web Designer 
43 - 9129 1400

felipe bastos

unread,
Apr 19, 2012, 3:35:38 PM4/19/12
to kohan...@googlegroups.com
Bom, vou compartilhar o que tenho feito aqui .. e ficou bem simples ..

Primeiro criei um Controller_Restrito_Template que extende Controle_Template e faz a restrição do acesso.

No before() eu verifico se o usuário está logado (Session) ...
Pego o controller e action ..

$controller = $this->request->controller();
$action = $this->request->action();

Identifico a permissão e verifico se o usuário tem essa permissão ..

if(! $usuario->has('permissoes', $permissao))

Se não tiver, ele recebe uma mensagem de erro via Flash::message('error', 'Mensagem de erro') que eu criei.

Quando ele volta para página inicial Request::redirect(), o Flash::render() é acionado, o usuário visualiza, e a mensagem é deletada.

No meu caso, estou com um menu estático .. pois com esse esquema consigo controlar as restrições .. sem problemas .. mas se eu quiser colocar o menu dinâmico .. (coisa que não achei necessário) ..

basta pegar o menu no banco [menu id, controller, action, titulo] e verificar a permissão de cada item do menu.

Isso me traria perda de desempenho, precisaria implementar cache do menu pra não verificar toda hora .. e sabemos que a permissão apenas por menu é burlável. :D
Reply all
Reply to author
Forward
0 new messages