[ Login | Register | Lost password? ]

Criando o blog - Parte III

Por: Junior Tada
15/02/2014

Controllers e Views

Para quem perdeu, aqui está a parte I e a parte II onde já foi explicado sobre layout e o arquivo db.py do models, criando nossas tabelas. Agora vamos criar os controllers e views.

Dentro da pasta controllers existe o arquivo default.py . Por padrão o web2py vai sempre direcionar para o controller default. É possível criar o controller com qualquer nome, mas para não acontecer problemas de INVALID CONTROLLER é necessário criar um arquivo routes.py para indicar os nomes de controllers criados. Como eu vou explicar como criar o arquivo routes.py apenas no final, quando for abordar deploy em um servidor, ou deixem tudo dentro do controller default.py ou passem a url completa para o navegador. Exemplo: 127.0.0.1:8000/nome_app/nome_controller/função_controller

Isto é, se o projeto tem o nome blog e você tem um controller chamado home com uma função (def) chamada index a url seria:

127.0.0.1:8000/blog/home/index

Como eu não quero o controller com o nome default, pode apagar este arquivo e criar um controller com o nome que você quiser. Eu vou colocar o nome home.py

Neste arquivo vamos criar algumas funções (def):

def index():

    msg = 'função index'

    return dict(msg=msg)

def postagem():

    msg = 'função postagem'

    return dict(msg = msg)

def pesquisa():

    msg = 'função pesquisa'

    return dict(msg = msg)

def envio():

    msg = 'função envio'

    return dict(msg = msg)

def comentario():

    msg = 'função comentario'

    return dict(msg = msg)

def contato():

    return dict()

def erro():

    return dict()

 

Nenhuma dessas funções recebe parâmetros. Se você precisar enviar algo, a melhor maneira é através de argumentos ou variáveis com o protocolo http (args ou vars). Calma, que mais tarde iremos abordar sobre isso.

Toda função que retorna um dict() no web2py vai procurar uma view com o mesmo nome. Portanto, todas essas funções que criamos precisam de uma view. Você pode criar funções que não chamam nenhuma view, como funções internas que não precisem expor nada ao usuário. Basta não retornar um dict().

Agora vamos criar uma pasta com o nome home dentro da pasta view e dentro desta pasta, criar os seguintes arquivos:

index.html

postagem.html

pesquisa.html

envio.html

comentario.html

contato.html

erro.html

 

Index.html

Dentro do aquivo index, vamos invocar a msg que criamos no controller e um link para testar todas as nossas páginas. Todas as páginas herdarão o layout e o que criamos agora, será injetado entro do layout onde foi definido o {{include}}. Essas questões de layout, aparência, etc, vou explicar apenas o básico, o modo como funciona, faça como quiser.

Vamos lá:

<!-- herda o layout -->

{{extend 'layout.html'}}

<!-- exibe a mensagem criada no controller -->

{{=msg}}

<!-- link para as outras views apenas para teste -->

<a href={{=URL(request.application, c='home', f='postagem')}}>Postagem</a>

<a href={{=URL(request.application, c='home', f='pesquisa')}}>Pesquisa</a>

<a href={{=URL(request.application, c='home', f='envio')}}>Envio</a>

<a href={{=URL(request.application, c='home', f='comentario')}}>Comentario</a>

<a href={{=URL(request.application, c='home', f='contato')}}>Contato</a>

<a href={{=URL(request.application, c='home', f='erro')}}>Erro</a>

<!-- Fim-->

 

Quando o usuário acessar a página 127.0.0.1:8000/nome_app/home/index o web2py vai executar o db.py , entrar no arquivo home.py e executar a função index. A função index vai pegar a mensagem, procurar o arquivo view/home/index.html . O arquivo index.html vai pegar o layout e pegar a mensagem através do {{=msg}} e carregar as tags <a>. Ufa!!

Sobre a tag <a>, é um código html simples, a única diferença é que no path/caminho para o link foi criado com código python utilizando o helper URL do web2py. Depois de renderizado o código enviado para o navedor é um arquivo html comum.

O helper URL faz um link para:

request.application → aplicação que chamou

c='home' → o controller que você quer chamar

f='nome_da_função' → a função dentro do controler “c=home” que você quer chamar.

 

Dentro de postagem.html , pesquisa.html , envio.html , comentario.html vamos escrever somente:

<!-- herda o layout -->

{{extend 'layout.html'}}

<!-- exibe a mensagem criada no controller -->

{{=msg}}

 

Dentro de contato.html e erro.html eu propositalmente não coloquei msg. Isto porque queria mostrar um exemplo de página que não recebe nada do controller. Então iremos apenas estender o layout e completar o restante com qualquer código html

<!-- herda o layout -->

{{extend 'layout.html'}}

<!-- construir o restante da página com qualquer código html-->

<p>Bla bla bla</p>

Se você incluir {{=msg}} o web2py resultará em um erro, pois não existe e não foi enviado um objeto msg para a view.

Ps: Enviamos apenas uma mensagem, mas poderia muito bem ser um formulário, uma tabela, uma lista de itens, enfim, qualquer objeto, e é exatamente isso que faremos futuramente.

 

Execute o web2py (arquivo web2py.py ou comando que expliquei anteriormente) e acesse a url:

127.0.0.1:porta(defina por você ou padrão 8000)/nome_app/nome_do_controller/nome_da_função

No exemplo que expliquei:

127.0.0.1:8000/blog/home/index

Será apresentado a página index com o layout e com os links. Clicando em cada link ele deve redirecionar para as respectivas páginas.

Se você deixou tudo no controller default, basta chamar 127.0.0.1:8000/nome_app que ele já joga direto para o index.

 

No próximo post vou falar um pouco sobre erros e tickets.

Categoria: Programação

Tags: ['programacao,python,web2py,web,html']

Comentários: