Python – Zope - Plone Adolfo Bruno _____________________________________________ Adolfo Bruno GCUFAL Maceió – 16 de Agosto de 2008
Sequência CMS Python Zope Plone Aplicação _____________________________________________ CMS Python Zope Plone Aplicação
CMS Content Management System
O que é um CMS? intranets, cujo objetivo é estruturar e facilitar a _____________________________________________ É um gerenciador para websites, portais e intranets, cujo objetivo é estruturar e facilitar a criação, administração, distribuição, publicação e disponibilidade da informação.
Por que usar um CMS? Sites tendem a crescer desordenadamente _____________________________________________ Sites tendem a crescer desordenadamente Dar o “poder” da edição ao usuário Reduzir o tempo de publicação Publicação on-line Padronizar interfaces de apresentação Separar conteúdo, interface e lógica Segurança Web 2.0
Python
O que é Python? Linguagem de programação de alto nível Interpretada ______________________________________________ Linguagem de programação de alto nível Interpretada Interativa Orientada a Objetos Tipagem dinâmica e forte Portável Multiparadigma
História do Python? ______________________________________________ Surgiu no Natal de 1989 Criada por Guido Van Rossum nos Países Baixos Sucessora da ABC Utilizada no sistema operacional Amoeba O nome é em homenagem ao grupo humorístico britânico Monty Python.
Indentação Não existem blocos de comandos ______________________________________________ Não existem blocos de comandos A Indentação é uma característica peculiar no Python Em linguagens como C ou PHP os blocos são delimitados por chaves, no Pascal ou Delphi pelo begin e end
Indentação Indentação correta Indentação Errada ______________________________________________ Indentação correta def valor(self): try: self.c = input('Valor: ') c = self.c return c except: print 'Inválido!' self.valor() Indentação Errada def valor(self): try: self.c = input('Valor: ') c = self.c return c except: print 'Inválido! ' self.valor()
Estruturas de Controle ______________________________________________ Condicional: if, else e elif if nome == “Pedro": idade = 21 Laço iterativo: for lista = ["pedra", "papel", "cenoura"] for item in lista: print item Laço condicional: while while i < 10: print "true"
Funções Funções são criadas utilizando a palavra reservada def ______________________________________________ Funções são criadas utilizando a palavra reservada def def funcao(v1, v2): v3 = v1 + v2 print "O resultado de v1 + v2 é ", v3 funcao(2, 2) Pode executar no prompt: python funcao.py
Classes ______________________________________________ Atributos e métodos privados sempre têm dois ‘_’ antes do seu nome. Em Python podemos utilizar herança simples e herança múltipla class ClasseOne: def __init__(self): self.atribA = 'Atributo A' self.atribB = 10 self.atrubC = None self.__privado = None def umMetodo(self, arg1): print arg1 + self.atribB umaClasse = ClasseOne() print umaClasse.atribA umaClasse.umMetodo(2)
Listas ______________________________________________ A utilização de listas (arrays) em Python é muito simples. lista = [] # cria lista vazia lista = ['laranja', 'banana', 'uva'] # cria lista com 3 elementos print lista[1] # imprime ‘banana’ lista.append(‘abacaxi'); # adiciona um novo elemento no final da lista lista. Insert(i, x) # adiciona um elemento x na posição i lista.remove( x) # remove o elemento x lista[:2] # retorna uma nova lista com os elementos 0 a 2 lista[1:3] # retorna uma nova lista com os elementos 1 a 3
Zope
O que é Zope? ______________________________________________ Servidor de Aplicações criado pela Digital Creations (Zope Corporation) Liberado fonte em 1998 Interface de administração via broswer Escrito em Python Zope (Z Object Publishing Environment) Servidor web, o Zserver Banco de dados orientado a objetos, o ZODB
Multi SGBDs ______________________________________________ O Zope suporta conexões com os bancos de dados relacionais mais utilizados no mercado PostgreSQL MySQL Firebird Oracle SQL Server ODBC
Plone
O que é Plone? ______________________________________________ Criado em 2001 por Alexander Limi e Alan Runyan É um CMS open-source que roda sob o servidor de aplicações Zope Lançado sobre a licença GNU Compatível com a maioria dos navegadores web Adere ao padrões web É extensível (através dos produtos) Fácil customização Internacionalizado para ~60 idiomas Tradução sensível ao idioma do navegador
Verificar se o gcc, g++ e make estão instalados A instalação ______________________________________________ 1. Passo: Instalar Zlib 1 – tar zxvf zlib-1.2.3.tar.gz 2 – ./configure 3 – make test 4 – make install 2. Passo: 1 – vim /etc/ld.so.conf 2 – Adicione: include /usr/local/include 3 – Execute o comando: ldconfig Verificar se o gcc, g++ e make estão instalados
A instalação ______________________________________________ 3. Passo: Instalar o Python 1 – tar zxvf Python-2.4.4.tgz 2 – ./configure 3 – make 4 – make install
A instalação ______________________________________________ 4. Passo: Instalar Imaging 1 – tar zxvf Imaging-1.1.6.tar.gz 2 - Para instalar a Imaging certifique-se que a libjpeg está instalada no sistema. Para isso execute o seguinte comando: whereis libjpeg Caso a saída seja: libjpeg: Significa que a libjpeg não está instalada. Para instalá-la execute o comando: apt-get install libjpeg-progs libjpeg62 libjpeg62-dev
A instalação ______________________________________________ 3- Agora altere a linha JPEG_ROOT no arquivo setup.py, para isso execute dentro do diretório Imaging-1.1.6: vim setup.py Procure pela linha JPEG_ROOT = NONE e a altere para JPEG_ROOT = “/usr/lib” Salve as alterações. E siga para o próximo passo. 4 – python setup.py install
A instalação ______________________________________________ 5. Passo: Instalar o Zope 1 – tar zxvf Zope-2.9.8-final.tgz 2 – ./configure --prefix=/var/zope-2.9.8 --with- python=/usr/local/bin/python 3 – make 4 – make install 5 – useradd zope 6 – chown zope:root /var/zope-2.9.8 -R 7 – /var/zope-2.9.8/bin/mkzopeinstance.py 8 – Informar o seguinte diretório: /var/zope 9 – Informar usuário e senha da instância zope (não do linux!) 10 – Descomentar e editar no arquivo /var/zope/etc/zope.conf “effective-user zope” Onde zope é o usuário criado no momento da criação da instância (passo 8) 11 – chmod 755 /var/zope/log 12 – chmod 755 /var/zope/var 13 – chown zope:root /var/zope -R
A instalação ______________________________________________ 6. Passo: Instalar o Plone 1 – tar zxvf Plone-2.5.5.tar.gz 2 – mv ./Plone-2.5.5 /var/zope/Products 3 – chown zope:root /var/zope -R Para iniciar o zope, execute os seguintes comandos: Iniciar: /var/zope/bin/zopectl start Reiniciar: /var/zope/bin/zopectl restart Parar: /var/zope/bin/zopectl stop
Criando conteúdo ______________________________________________ O Plone disponibiliza objetos para criação, por padrão são: Arquivo, Evento, Imagem, Link, Notícia, Pasta, Pasta Esperta, Página. Assim que é criado algum objeto o Plone atribui uma data de criação; Um objeto pode atribuir: data (criação, efetivação, expiração, inicial, final), criador, estado (esboço público, publicado, privado, pendente).
Objetos e sua diferenças ______________________________________________ Arquivo: Enviar arquivo externo para o site; Evento: Informações de eventos que ficam no calendário; Imagem: Pode ser referenciada em documentos e exibida em álbuns; Link: Um link para recursos interno ou externo; Notícia: Um anúncio que aparecerá no portlet de notícia e na lista de notícia; Pasta: Pode conter outros itens; Pasta Esperta: Realiza busca que é atualizada automaticamente e pode exibir itens que casam com um critério especificado; Página: Pode conter conteúdo, uma página do site.
Instalando Produtos ______________________________________________ Qual o produto? RichDocument Onde achar? www.plone.org Como instalar? Copiar o arquivo descompactado para a pasta Products; Reiniciar o servidor; Ir ao site > Configuração do site > Adicionar remover produtos. E instalar o produto. Ou então, Ir na ZMI -> Portal Quickinstaller -> Escolher o produto e instalar.
Ferramentas do Plone no Zope ______________________________________________ http://localhost:8080/manage portal_actions portal_catalog portal_properties portal_quickinstaller portal_skins portal_types portal_workflow portal_css portal_javascripts
portal_actions ______________________________________________ Responsável pelo cadastro e alteração de ações do portal, por exemplo: site_actions, document_actions, portal_tabs; Title = Título Id = Identificação única URL = Caminho para script/página que será executado Permission = Permissão necessária para executar a ação Category = Categoria que a ação pertence Visible = É visível ou não
portal_catalog Baseado no ZCatalog do ZOPE; ______________________________________________ Baseado no ZCatalog do ZOPE; Indexa todos os objetos do Plone; Adiciona índices, metadados e políticas que facilitam a busca de objetos no Plone;
portal_properties ______________________________________________ Define as principais propriedades para a árvore de navegação e também para o site em geral;
portal_quickinstaller ______________________________________________ Responsável por adicionar e remover produtos Plone;
portal_skins Localização dos templates do Plone e dos produtos; ______________________________________________ Localização dos templates do Plone e dos produtos;
portal_types ______________________________________________ Gerencia os tipos de objetos do Plone Aba Contents -> Lista todos os tipos de objetos Properties -> Detalhes do objeto Actions -> Ações possíveis de executar pelo objeto Aba Aliases -> Determina os templates de Visão, Edição, Propriedades, compartilhamento dos objetos;
portal_workflow Determina o workflow para cada objeto do Plone ______________________________________________ Determina o workflow para cada objeto do Plone Aba Workflow -> Determina o workflow do portal_type Aba Contents -> Lista os workflows existentes
portal_css - portal_javascripts ______________________________________________ Em portal_css são registrados todos os css do plone; Em portal_javascripts são registrados todos os javascripts do plone;
Zope Page Templates (ZPT) ______________________________________________ Zope Page Templates (ou linguagem de templates Zope) é um instrumento do servidor de aplicação Zope para a geração de páginas web dinâmicas. O objetivo é proporcionar um fluxo de tarefas natural entre designers e programadores.
ZPT x DTML ______________________________________________ DTML “Document Template Markup Language” (Linguagem de Marcação para Modelos de Documentos) é a linguagem de apresentação e script baseada em tag do Zope. Podemos usar o DTML em dois tipos de objetos no Zope, DTML Documents e DTML Methods DTML sofre por uma deficiência para separar apresentação, lógica e conteúdo (dados). O namespace do DTML adiciona muita “mágica”, sem permitir controle suficiente.
ZPT na prática ______________________________________________ Page Templates usam a Template Attribute Language (TAL). TAL consiste em atributos especiais para as tags HTML. Por exemplo, um titulo dinâmico de uma página deveria ficar assim: <title tal:content="here/title">Page Title</title>
ZPT na prática Para criar um Page Template vamos até a ZMI: ______________________________________________ Para criar um Page Template vamos até a ZMI: Em seguida:
ZPT na prática ______________________________________________ <html> <body> <p> Esse é o <b tal:content="template/title">título</b> </p> </body> </html>
ZPT na prática - Expressões ______________________________________________ A expressão, "template/title" do exemplo anterior é uma expressão de caminho ou path expression. Esse é o tipo mais comum de expressão. Outras expressões: 'request/URL': A URL da requisição web atual. 'user/getUserName': O nome do usuário autenticado. 'container/objectIds': Uma lista dos ids dos objetos que estão na mesma pasta do template.
ZPT na prática - Comandos TAL ______________________________________________
ZPT na prática No Page Template que criamos, a linha: ______________________________________________ No Page Template que criamos, a linha: Esse é o <b tal:replace="template/title"> título</b> Renderizou: Esse é o Meu Template. Portanto, A tag <b> foi trocado pelo valor de “template/title”
ZPT na prática ______________________________________________ Outra maneira de inserir texto é com a instrução: tal:content Uso similar ao tal:replace, porém o a tag não é removida e o valor é inserido dentro dela; Ex.: <head> <title tal:content="template/title">Titulo</title> </head>
ZPT na prática - Repetindo estruturas ______________________________________________ <table border="1" width="100%"> <tr> <th>Número</th> <th>Id</th> <th>Meta-Type</th> <th>Titulo</th> </tr> <tr tal:repeat="item container/objectValues"> <td tal:content="repeat/item/number">#</td> <td tal:content="item/getId">Id</td> <td tal:content="item/meta_type">Meta-Type</td> <td tal:content="item/title">Title</td> </table>
ZPT na prática - Repetindo estruturas ______________________________________________ A instrução tal:repeat na linha da tabela significa “repita essa linha para cada item na minha lista de objetos do container”. A instrução coloca os objetos da lista na variável item, um de cada vez (essa variável é conhecida como variável de repetição), e faz uma copia da linha usando essa variável. O valor de "item/getId" em cada linha é o id do objeto para a linha, e também como em "item/meta_type" e "item/title".
ZPT na prática – Elementos condicionais ______________________________________________ Usando a instrução tal:condition podemos checar vários tipos de condições. tal:condition deixa a tag e seu conteúdo no lugar se a expressão é verdadeira, mas remove-os se for falsa. O Zope considera o numero zero, uma string em branco, uma lista vazia, e a variável de ambiente nothing como falsos valores. Sendo assim quase todos outros valore são considerados como verdadeiros, incluindo números diferentes de zero, e strings com algum valor (até mesmo espaços em branco!).
ZPT na prática – Elementos condicionais ______________________________________________ <div tal:define=“items container/objectValues”> <table tal:condition= "items" border="1" width="100%"> <tr> <th>Número</th> <th>Id</th> <th>Meta-Type</th> <th>Titulo</th> </tr> <tr tal:repeat="item items"> <td tal:content="repeat/item/number">#</td> <td tal:content="item/getId">Id</td> <td tal:content="item/meta_type">Meta-Type</td> <td tal:content="item/title">Title</td> </table> </div>
ZPT na prática – Controle de atributos ______________________________________________ É possível alterar os atributos das tags através instrução tal:attributes Ex.: <a href="link" tal:attributes="href here/getILink; ">link</a> Resultado: <a href= "linkToSomeWhere">link</a>
ZPT na prática – Definindo variáveis ______________________________________________ Você pode definir suas próprias variáveis usando a instrução: tal:define; Ex.: <ul tal:define="items container/objectIds" tal:condition="items"> <li tal:repeat="item items"> <p tal:content="item">id</p> </li> </ul>
ZPT na prática ______________________________________________ É possível ter mais de uma instrução numa única tag HTML, nesse caso eles são executados na seguinte ordem: 1 - define 2 - condition 3 - repeat 4 - content ou replace 5 - attributes 6 - omit-tag
ZPT na prática – Chamadas de scripts ______________________________________________ É possível utilizar chamadas de scripts Python ao invés das expressões de caminho(path expressions); Para isso usa-se o termo ‘python:’ Ex.: <div tal:content=“python:item.getId ()“>id</div>
ZPT na prática – Expressões string ______________________________________________ Expressões string permitem unir com facilidade expressões de caminho com texto. Todo o texto depois do termo string: é procurado por expressões de caminho. Cada expressão deve ser precedida do sinal de dólar ($). Ex.: "string:Somente texto. Sem path expressions. " "string:Seu nome é ${user/getUserName}!"
ZPT na prática – Macros ______________________________________________ As page templates tem a capacidade de reutilização da ‘aparência’ e elementos em várias páginas; Para isso utilizamos as Macros. Elas definem uma seção da página que pode ser reutilizada por outras; Uma macro pode ser uma página inteira, ou somente uma parte como cabeçalho ou rodapé; Macros são definidos por atributos chamados de METAL(Macro Expansion Tag Attribute Language)
ZPT na prática – Macros ______________________________________________ Definindo uma macro: <p metal:define-macro="copyright"> Copyright 2001, <em>Foo, Bar, and Associates</em> Inc. </p> Utilizando a Macro <b metal:use-macro="container/master_page/macros/copyright"> Aqui fica a macro! </b> Resultado <p> Copyright 2001, <em>Foo, Bar, and Associates</em> Inc.</p>
Aplicação com Archetypes ______________________________________________ Framework para desenvolvimento ágil ✔ Dá suporte aos tipos do Plone ✔ Gera automaticamente ✔ Formulários ✔ Visões ArchGenXML ✔ Geração automática de códigos Archetypes ✔ Baseado em modelos
Referências Meu contato www.plone.org www.zope.org Lista zope-pt ______________________________________________ www.plone.org www.zope.org Lista zope-pt www.python.org adolfobruno@gmail.com www.dmd2.com.br Meu contato
Muito Obrigado!!