Dicas para Uso de Plone 6/Volto
Algumas anotações enquanto estudava Plone 6 e Volto. Não pretende ser 100% completa, mas indicar onde conseguir mais ajuda sobre alguns tópicos.
Projeto
A instalação do Plone cria um projeto "monorepo", contendo backend, frontend e devops.
Vários comandos make
podem ser disparados da raiz do projeto ou de dentro do diretório correspondente. Por exemplo, para iniciar o backend:
# da raiz
~/projeto$ make backend-start
# do diretório backend
~/projeto/backend$ make start
Addons
A filosofia do desenvolvimento Plone é que todo o desenvolvimento deve feito dentro de addons.
O monorepo é criado seguindo esta filosofia, conforme a tabela abaixo:
/backend |
Configuração para subir o backend: porta, dependências, addons externos, etc |
/backend/src |
Addons internos ao repositório |
/backend/src/<nome-projeto> |
Addon principal, criado na instalação |
/frontend |
Configuração para subir o frontend: dependências, addons externos, etc |
/frontend/packages |
Addons internos ao repositório |
/frontend/packages/volto-<nome-projeto> |
Addon principal, criado na instalação |
Addons de backend normalmente (via de regra?) são instalados na interface web do site para fazer seus efeitos.
Uma dúvida minha é se isto é estritamente necessário ou apenas recomendado
Criando um novo projeto
pipx run cookieplone project
make install
Docs - Install Plone with cookieplone Training - Plone Deployment
Backend
O backend é o verdadeiro plone. Escrito em python, tem como base o conjunto de bibliotecas zope
.
A documentação é sofrida e espalhada entre os sites do plone
e as várias bibliotecas zope
. Be afraid.
ZCML
Boa parte da configuração do backend é através de arquivos XML com extensão zcml.
O arquivo configure.zcml
do diretório base de cada addon é lido automaticamente. Outros arquivos .zcml
do addon deve ser incluídos a partir deste, usando a diretiva <include>
.
Algumas diretivas usadas:
<include> |
Indica outro arquivo zcml a ser lido |
<genericsetup:registerProfile> |
Define um conjunto de zcml que vai ser executado quando o addon for instalado ou desinstalado |
<configlet> |
Cria um item de painel de controle. |
<browser:page> |
Define uma "página". Até o momento, só sei que se usa para indicar o conteúdo de um item de painel de controle criado com <configlet> |
<records> |
Cria dados no registry do Plone. Por exemplo, dados referentes a um item customizado de painel de controle. |
<plone:service> |
Define um endpoint de api |
Permissões
Em algumas das diretivas, é necessário especificar a permissão que o item sendo definido terá. As permissões mais comuns são:
Permissão | Descrição |
---|---|
zope2.View |
Visualizar conteúdo. Não precisa estar logado no site. Comum em chamadas de API. |
cmf.ManagePortal |
Gerenciar portal. Comum em itens de painel de controle. |
cmf.ModifyPortalContent |
Gerenciar conteúdo. Permite criar e alterar páginas, etc. |
Documentação na versão 5 do plone
Arquivos De Interesse
instance.yaml |
Use para gerenciar addons |
mx.ini |
Use para incluir repositórios git externos ao monorepo na estrutura de diretórios |
Receitas
Apontando para repositório externo
Ao desenvolver um addon reutilizável, o próprio costuma ter um repositório git separado. Para isto, usa-se o mxdev.
Passos:
-
Configure o arquivo
backend/requirements.txt
, colocando o nome do add-on:interlegis.barra-acessibilidade-backend
-
Configure o arquivo
backend/instance.yaml
:defaunt_context: zcml_package_includes: project_title, interlegis.barra-acessibilidade-backend
-
Configure o arquivo
backend/mx.ini
:[interlegis.barra-acessibilidade-backend] url = https://github.com/collective/example.contenttype.git pushurl = git@github.com:collective/example.contenttype.git extras = test branch = feature-7 ´´´
-
make backend-build
na raiz do projeto para baixar o conteúdo do git.
docs, install an add-on from source
Instalar Addon
-
Adicionar uma linha em
backend/requirements.txt
para o addon -
Acrescentar o addon em
backend/instance.yaml
, no itemzcml_package_includes
:default_context: zcml_package_includes: project_title, <addon name>
-
make backend-build
(no diretório raiz) -
Vá no painel de controle, addons e adicione o addon
Não sei se é possível adicionar o addon de maneira programática, de forma que o site suba já com o addon adicionado
Criando item de painel de controle
Frequentemente é necessário também criar um endpoint para acessar o que foi configurado no painel de controle.
Há duas formas de definir algo no painel de controle:
-
Definir interface detalhando os dados do painel de controle
Não consegui achar um projeto com exemplo desta forma, mas é a forma que está explicada na documentação e nos treinamentos.
Checklist típica (os arquivos não precisam ser exatamente esses, é só uma sugestão):
- Criar um schema no arquivo
interfaces.py
, detalhando os campos desejados. - Incluir uma tag
<configlet>
nos profiles de instalação e desinstalação do item de painel de controle, arquivocontrolpanel.xml
. O atributoappId
deve coincidir nos dois arquivos. - Criar um registro no Registry para a configuração, nos profiles de instalação e desinstalação. Arquivo
registry.xml
ouregistry/main.xml
. Usa-se a tag<records>
. - Criar uma página pra responder o item, arquivo
controlpanel/configure.zcml
(tagbrowser:page
) econtrolpanel/controlpanel.py
. - Criar um adapter pro Volto conseguir ver o item. Crie a tag
<adapter>
, em geral no arquivorestapi/configure.zcml
.
Documentação, Control Panels Training "Mastering Plone", add custom control panel Documentação dos tipos
- Criar um schema no arquivo
-
Definir interface apenas com uma string, de forma que os dados sejam guardados como json. Neste caso, define-se um widget no frontend para editar este json. Esta forma é mais comum nos addons do "Awesome Volto".
Checklist típica (os arquivos não precisam ser exatamente esses, é só uma sugestão):
- Criar um schema no arquivo
interfaces.py
. Neste caso, o schema só contém um item, so tipoSourceText
. - Incluir uma tag
<configlet>
nos profiles de instalação e desinstalação do item de painel de controle, arquivocontrolpanel.xml
. O atributoappId
deve coincidir nos dois arquivos. - Criar um registro no Registry para a configuração, nos profiles de instalação e desinstalação. Arquivo
registry.xml
ouregistry/main.xml
. Usa-se a tag<records>
. - Criar uma página pra responder o item, arquivo
controlpanel/configure.zcml
(tagbrowser:page
) econtrolpanel/controlpanel.py
. - Criar um adapter pro Volto conseguir ver o item. Crie a tag
<adapter>
, em geral no arquivorestapi/configure.zcml
.
Projetos de exemplo:
- eea.banner (usado pelo addon de frontend
volto-banner
) - collective.volto.subfooter
- Redturtle Editable Footer
- Criar um schema no arquivo
Docs, Control Panels (bem limitado)
Troubleshooting
-
Item aparece no plone clássico e não aparece no Volto.
O Volto exige os atributos
action_id
eappId
da tag<configlet>
. Além disso, não se esqueça do<adapter>
.
Criando um endpoint para ser usado no frontend
Passos, grosso modo. Veja os exemplos para ter uma ideia melhor.
-
Se já não existir, crie um diretório
restapi
dentro da raiz do backend. O nome não importa, masrestapi
segue o padrão dos projetos que vi. -
Use
<include>
noconfigure.zcml
da raiz para incluir o diretório recém-criado. -
Crie um arquivo
configure.zcml
dentro do diretório. Use a diretiva<plone:service>
para criar o endpoint. -
Crie um arquivo python, exemplo
get.py
, dentro do diretório. Lá deve ser implementada uma classe para devolver os dados desejados. -
No caso de dados guardados em como string e que se deseja servir como json, pode ser necessário um serializer/deserializer. Ainda não sei como funcionam....
Projetos de exemplo:
- eea.banner (usado pelo volto-banner)
- collective.volto.cookieconsent
Frontend (Volto)
O frontend é chamado de Volto. Escrito em react/javascript, é feito para substituir o antigo frontend do plone (feito em python, direto no backend).
Arquivos De Interesse
package.json |
Use para gerenciar addons |
volto.config.js |
Também usado para gerenciar addons |
Receitas
Apontando para repositório externo
Ao desenvolver um addon reutilizável, o próprio costuma ter um repositório git separado. Para isto, usa-se o mrs developer.
Passos:
-
Configure o arquivo
frontend/package.json
:{ "name": "my-volto-project", "addons": [ "name-of-add-on" ] }
``
-
Configure o arquivo
frontend/mrs.developer.json
:{ ... outros ..., "meu-addon": { "output": "./packages/barra-acessibilidade", "package": "<nome do package, exemplo '@interlegis/barra-acessibilidade'", "url": "git@github.com:interlegis/barra-acessibilidade.git", "https": "https://github.com/interlegis/barra-acessibilidade.git", "tag": "<versão, exemplo '1.0'>" } } ´´´
-
make install
no diretóriofrontend
.
Docs, Install an add-on in development mode in Volto 18
Instalar Addon
-
Acrescente o addon em
frontend/package.json
."dependencies": { "@plone/volto": "workspace:*", "@plone/registry": "workspace:*", "volto-ploneconf": "workspace:*", "<nome do addon>": "*" },
-
Acrescente o addon em
frontend/volto.config.js
.const addons = ['<nome do addon>', 'volto-ploneconf'];
Aparentemente, pode também ser feito no
frontend/package.json
, num itemaddons
. Não sei qual a maneira mais recomendada -
No diretório do frontend, use
make install
.
Documentação no treinamento "Mastering Plone"
Utilizando uma API definida no backend
O Volto utiliza react-redux
para acessar o backend.
Passos (usando o projeto volto-banner
como exemplos:
Colocando um componente em todas as páginas
Use a opção appExtras
ao configurar o add-on. Veja no exemplo do addon volto-banner
abaixo.
O componente é incluído no final da página, por default (acho). Se quiser posicionar em outro lugar, use react-portal
, como no exemplo.
Exemplo: addon volto-banner
:
Definindo interface de painel de controle no frontend
A criação de painel de controle normalmente é através de interface no backend e o Volto monta os controles necessários para a edição dos itens desta interface.
Uma outra opção é definir no backend a interface como uma string (contendo um json) e definir no frontend um widget para editar este json. Esta opção possibilita layouts mais complexos.
Exemplos: