ProcessWire CMS – um guia para iniciantes

Publicados: 2022-03-10
Resumo rápido ↬ Os sistemas de gerenciamento de conteúdo são mais frequentemente opinativos. Por exemplo, a maioria deles espera uma certa estrutura de conteúdo rígida para inserir dados e, em seguida, tem uma maneira específica de acessar e emitir esses dados, fazendo ou não sentido. Além disso, eles raramente oferecem ferramentas eficazes para romper as trilhas predefinidas, se um caso exigir.

ProcessWire é um sistema de gerenciamento de conteúdo (CMS) distribuído sob a Licença Pública Mozilla versão 2.0 (MPL) e Licença MIT. Ele foi projetado desde o início para resolver os problemas causados ​​exatamente por esse tipo de opinião (que, inevitavelmente, resulta em desenvolvedores e usuários frustrados) por ser - você adivinhou - não opinativo. Em sua essência, ele é baseado em alguns conceitos básicos simples e oferece uma API excepcionalmente fácil de usar e poderosa para lidar com conteúdo de qualquer tipo. Vamos direto ao assunto!

Leitura adicional no SmashingMag:

  • Projetando para sistemas de gerenciamento de conteúdo
  • Por que os geradores de sites estáticos são a próxima grande novidade
  • Conjunto de ícones do sistema de gerenciamento de conteúdo (CMS) (12 ícones gratuitos)
  • Introdução aos sistemas de gerenciamento de conteúdo

A GUI do administrador

Após instalar o ProcessWire (que requer PHP 5.3.8+, MySQL 5.0.15+ e Apache), você verá a página inicial da GUI de administração padrão:

Mais depois do salto! Continue lendo abaixo ↓

ProcessWire admin GUI.
A GUI de administração tem uma estrutura bastante simples. Também é totalmente responsivo, por isso parecerá um pouco diferente em telas grandes.

Nota: As páginas que você vê na árvore de páginas hierárquicas (mais sobre isso depois) estão lá porque eu escolhi o perfil do site “Default (Beginner Edition)” durante o processo de instalação. Isso é totalmente opcional. Você também pode começar com um perfil de site em branco, que permite criar tudo do zero.

Você pode escolher entre muitos temas de administração, embora para o ProcessWire 2.6+ o tema padrão ou o tema Reno seja recomendado. Como o Reno vem pré-empacotado com cada instalação do ProcessWire, mudar para ele é muito fácil: basta instalá-lo e selecioná-lo em seu perfil de usuário.

Captura de tela do tema “Reno”.
Instalar um novo tema para a GUI de administração é fácil. Este se chama Reno. (Ver versão GIF animada)

Vamos dar uma olhada rápida na navegação principal de back-end:

Captura de tela da navegação principal no back-end.
  • “Páginas” Este é o ponto de entrada da GUI do administrador. Ele apresenta a árvore de páginas hierárquica e, portanto, todo o conteúdo do seu site no back-end.
  • “Configuração” Este é o local para configurar a arquitetura geral do modelo de dados de sua instalação por meio de modelos e campos (mais sobre isso posteriormente). É também aqui que os módulos do ProcessWire geralmente adicionam uma entrada para sua funcionalidade específica e interface do usuário - por exemplo, visualizando mensagens de log diretamente na GUI do administrador ou gerenciando todos os diferentes idiomas ao lidar com conteúdo multilíngue.
  • “Módulos” Aqui você gerencia todos os módulos do seu site. Pense nos módulos do ProcessWire como plugins do WordPress: eles estendem e personalizam o sistema.
  • “Acesso” Aqui é onde você gerencia usuários, funções de usuário e permissões de usuário.

Três Conceitos Básicos Simples

Os conceitos centrais que formam a arquitetura geral do modelo de dados do ProcessWire são exatamente três: páginas, campos e modelos . Vejamos cada um por um.

Tudo é uma página: ou, uma árvore de página para governá-los todos

Uma página no ProcessWire pode gerar uma página normal no front-end do seu site, pronta para ser visitada por seus usuários (como “Início” e “Sobre” na captura de tela acima). Mas uma página também pode existir apenas no back-end, sem contrapartida no front-end - por exemplo, uma página de configurações ocultas onde você armazena o slogan global, o logotipo e o aviso de direitos autorais do seu site. Quando digo “tudo é uma página” no ProcessWire, estou falando sério. Caramba, até os principais links de navegação na GUI de administração são feitos de páginas ocultas na árvore de páginas hierárquica!

Captura de tela que mostra que até a navegação de back-end é feita de páginas.
No ProcessWire, tudo é uma página. Até a navegação principal e a sub-navegação são feitas de páginas da árvore hierárquica de páginas.

Isso é tão meta que me lembro de um certo meme Xzibit. Mas vamos deixar assim.

O conceito de uma página ser visível apenas no back-end é bastante poderoso porque abre todo um mundo de possibilidades sobre como estruturar e acessar dados por meio de outras páginas (sua imaginação é o único limite). Você pode criar um catálogo de produtos massivo ou um aplicativo de intranet com centenas de milhares de itens com base em uma hierarquia de páginas complexa, ou apenas um blog simples com as categorias e tags usuais de blog (cada categoria e tag sendo uma página na árvore de páginas) .

Joss Sanglier, um membro distinto da comunidade ProcessWire, divide o conceito de páginas para isso:

As páginas do ProcessWire não são grandes quantidades de informações, mas pequenas coisas, nada mais do que um link para o mundo mais interessante de campos e templates; apenas um pequeno pontinho de dados em seu enorme banco de dados fascinante.

As páginas no ProcessWire são usadas para todos os tipos de coisas. Eles podem ser usados ​​como um marcador em sua lista de páginas. Eles podem ser usados ​​como pai de grupo para outras páginas. Eles podem ser usados ​​como categorias, tags ou listas ou usuários. E eles podem até ser usados ​​para seleções suspensas simples – apenas para fornecer um rótulo e valor.

Vamos interagir um pouco com a árvore de páginas hierárquica:

Captura de tela de arrastar e soltar na árvore de páginas.
Você pode mover páginas na árvore de páginas hierárquicas arrastando e soltando. (Ver versão GIF animada)

Como você pode ver, as páginas podem ser editadas, movidas ou descartadas, e podem ter um número infinito de filhos e netos.

Vamos abrir a página “Home”:

Captura de tela da página inicial aberta
A página “Home” do perfil do site “Default (Beginner Edition)” apresenta alguns campos simples, todos opcionais.

Isso nos leva ao próximo conceito central do ProcessWire, campos.

Os campos são os contêineres nos quais você coloca os dados

Os campos são basicamente os contêineres nos quais você coloca dados. Neste ponto, é importante perceber que o ProcessWire não tem o conceito de campos personalizados, como o WordPress tem, porque cada campo no ProcessWire é um campo personalizado . Ao criar um campo, você pode atribuir a ele um rótulo, uma descrição e algumas notas adicionais que aparecerão abaixo dele.

Vamos editar o campo “Título” e adicionar uma descrição e uma nota a ele:

Captura de tela do campo de título com descrição e nota personalizadas.
Cada campo pode receber uma descrição personalizada e uma nota. (Ver versão GIF animada)

Os tipos de campo pré-instalados cobrem as necessidades mais básicas de entrada de dados. Por exemplo, você pode criar coisas como caixas de seleção, seletores de datas, conjuntos de campos (um campo que agrupa outros campos em unidades visualmente lógicas), uploaders de arquivos e imagens e, claro, campos de texto e área de texto (o editor WYSIWYG padrão é CKEditor ).

Há também muitos tipos de campo pré-empacotados e de terceiros para escolher. Um módulo central útil, que não é instalado por padrão, é o campo de repetidor . Ele permite que você crie dinamicamente linhas de conjuntos de dados.

Captura de tela do repetidor.
Os repetidores são uma maneira simples e fácil de criar linhas de dados do mesmo tipo. (Ver versão GIF animada)

O ProcessWire também é adequado para lidar com imagens . Por exemplo, você pode decidir quais variantes de imagem o ProcessWire deve criar automaticamente de uma imagem após carregá-la (o que permite bons casos de uso para imagens responsivas). E escolher uma miniatura para uma imagem é muito fácil.

Captura de tela do corte de uma imagem.
ProcessWire é uma boa opção para trabalhar com imagens. (Ver versão GIF animada)

Outro tipo de campo útil é o tipo de campo de página . Você pode vincular outras páginas à página que está editando no momento e, assim, criar um relacionamento entre elas. Nas configurações do campo, você pode decidir como deve ser a aparência e a interação da entrada com o campo — por exemplo, se uma única página ou várias páginas devem ser selecionáveis ​​ou se apenas as páginas filhas de uma página pai específica devem ser selecionáveis. Se você fosse escrever, digamos, uma postagem de blog, você poderia optar por permitir que apenas as categorias de postagem de blog fossem preenchidas automaticamente.

Captura de tela do campo de página de preenchimento automático.
Um campo de página pode ter manifestações muito diferentes. Aqui está um: A funcionalidade de preenchimento automático permite que você escolha páginas já existentes (no menu suspenso), mas também crie novas páginas diretamente no campo. (Ver versão GIF animada)

Um recurso interessante que você pode ativar nas configurações de um campo é a capacidade de editar o conteúdo do campo no front-end do seu site . Depois que um usuário fizer login no back-end do ProcessWire, ele poderá alternar para o front-end do site e editar e salvar o conteúdo exatamente onde ele será renderizado.

Captura de tela da edição de conteúdo no front-end do seu site.
Você é fã de edição front-end de conteúdo? O ProcessWire oferece cobertura. (Ver versão GIF animada)

Depois de examinar as páginas e campos no ProcessWire, você pode se perguntar: Como uma página sabe quais campos ela possui? E onde posso definir como os campos são ordenados e renderizados em uma página? Então, vamos passar para o último conceito central, templates.

Modelos são os modelos de páginas

Toda vez que você cria uma página na árvore de páginas hierárquica, o ProcessWire precisa saber qual modelo está associado a ela. Isso porque uma página precisa saber quais campos ela deve renderizar, e essa informação sempre faz parte do respectivo template.

Para encurtar a história: os modelos contêm todas as informações que a página precisa saber sobre seu conteúdo (quais campos ela possui, como esses campos são renderizados e como eles se comportam).

Vamos abrir o modelo “Home” da nossa instalação de exemplo.

Captura de tela das configurações do modelo
Os modelos no ProcessWire são muito flexíveis e são uma das razões pelas quais o ProcessWire parece mais uma estrutura do que um CMS. (Ver versão grande)

A principal coisa a notar é o número de configurações. Há realmente muito para descobrir aqui. Por exemplo, você pode limitar o acesso às páginas criadas com este modelo a funções de usuário específicas. Ou você pode decidir se as páginas criadas com este modelo devem ser armazenadas em cache por um período de tempo específico (para melhorar o desempenho), além das condições sob as quais o cache deve ser limpo.

Outra configuração poderosa está oculta na guia “Família”. Aqui, você pode definir se as páginas criadas com este modelo podem ter páginas filhas e quais modelos são permitidos para a página pai ou suas páginas filhas. Isso permite que você crie exatamente o tipo de hierarquia de família de modelos que você deseja. É uma maneira flexível e prática (e, na verdade, uma das maneiras mais poderosas) de estruturar seus dados, e é uma das muitas maneiras pelas quais o ProcessWire mostra sua flexibilidade.

Vamos voltar nossa atenção para a lista de campos em um modelo. Observando a captura de tela acima, você pode ver que a ordem dos campos se assemelha à ordem em que os campos serão renderizados na página inicial. Você pode simplesmente arrastar e soltar os campos para alterar a ordem na lista, alterando assim a ordem de aparecimento ao editar a página inicial.

Metade da captura de tela esquerda: arraste e solte campos nas configurações do modelo. Metade da captura de tela direita: ordem dos campos alterada na página "Início".
Alterar a ordem dos campos nas configurações do modelo (à esquerda) afeta a ordem na qual os campos são renderizados na página (à direita). (Ver versão GIF animada)

Você também pode alterar a largura de um campo na página. Basta clicar em um campo e alterá-lo. Vamos colocar os campos “Título” e “Título” lado a lado.

Captura de tela de campos renderizados lado a lado
Você tem o controle total de como os campos são renderizados na página. (Ver versão GIF animada)

Outro exemplo de como você pode personalizar e adaptar a interface do usuário de uma página e seus campos são as dependências do campo de entrada. Eles permitem que você especifique as condições sob as quais um determinado campo no editor de páginas é mostrado ou obrigatório. Vamos tornar o campo “Título” visível na interface do usuário apenas se o usuário inserir algo no campo “Título” e vamos marcar o campo “Resumo” como obrigatório apenas se o usuário inserir algo no campo “Título”:

Captura de tela de configurações para dependências de campo de entrada
O campo “Título” será exibido na página somente quando o usuário inserir algo no campo “Título”. (Ver versão GIF animada)

Aqui está um vídeo que mostra como as dependências do campo de entrada podem ser usadas para aprimorar a experiência do usuário ao trabalhar com o ProcessWire:

Como as dependências do campo de entrada podem ser usadas para aprimorar a experiência do usuário ao trabalhar com o ProcessWire

O número, a ordem e a aparência dos campos em uma página estão totalmente sob seu controle. Você pode colocar apenas um campo em um modelo, nenhum (não muito útil) ou mais de 50 campos, 100 ou até mais. Você pode encomendá-los da maneira que quiser, especificar quais são obrigatórios ou visíveis e quais não são, e especificar em quais circunstâncias eles devem ser obrigatórios ou visíveis. Aqui é onde brilha a abordagem não opinativa da ProcessWire.

Resumo: páginas, campos, modelos

Vamos recapitular a relação técnica entre páginas, campos e modelos: você adiciona campos a modelos e seleciona um modelo ao criar uma nova página. Os campos que você vê ao editar uma página são os campos que você adicionou ao modelo selecionado.

Outra maneira de ver isso seria através de uma analogia do mundo da programação:

  • Modelos são como aulas.
  • Os campos são como as propriedades das classes.
  • Páginas são instâncias de classes.

Depois de internalizar esses conceitos, você estará equipado com tudo o que precisa saber para desenvolver no ProcessWire. E a razão para isso é que a filosofia da ProcessWire é baseada somente nesses três conceitos. Bem legal, certo?

Arquivos de modelo e a API: um casal destinado a ficar junto

O local onde você recupera os dados inseridos no back-end do ProcessWire e os envia no front-end é, obviamente, o sistema de arquivos — mais especificamente, a pasta /site/templates/ de sua instalação do ProcessWire. Um modelo pode ter um arquivo PHP físico com o mesmo nome associado a ele; então, o template home teria um arquivo home.php na pasta /site/templates/ .

Nota: Como você desenvolve seus arquivos de modelo depende totalmente de você. Se você estiver familiarizado com o estilo WordPress de desenvolvimento de coisas, poderá continuar como está acostumado. Ou, se você tiver uma configuração bastante complexa e grande e quiser criar uma arquitetura mais sofisticada, poderá usar uma abordagem inspirada no MVC, que funcionaria tão bem. Ryan Cramer tem um tutorial introdutório muito bom, intitulado “Como estruturar seus arquivos de modelo”, no qual você pode aprender diferentes abordagens para o desenvolvimento de arquivos de modelo no ProcessWire.

O código que você escreve em um arquivo de modelo consistirá principalmente em construções PHP básicas (condições if , loops foreach , instruções de echo ), marcação HTML e API do ProcessWire. A API é fortemente inspirada em jQuery - então, é como iterar e percorrer o conteúdo que você inseriu no back-end por meio de métodos, seletores e recursos de encadeamento (interface fluente). É fácil de usar e muito expressivo, assim como o jQuery.

Vamos começar analisando alguns exemplos simples para você começar a usar a API. Mas antes de começarmos, lembre-se de marcar a folha de dicas da API do ProcessWire, uma referência útil com uma visão geral de todos os métodos de API disponíveis.

Captura de tela do Cheatsheet do ProcessWire
A folha de dicas da API servirá como um bom companheiro.

O que queremos fazer primeiro é acessar e exibir o conteúdo do campo de uma página. A API expõe uma variável para lidarmos com isso: $page .

Obtendo a página atual com a variável $page

A variável $page contém todos os campos de uma única página. Isso inclui campos internos (como o nome do modelo de uma página), bem como os campos que você, como desenvolvedor, adicionou ao modelo da página.

Vamos abrir home.php , que é o arquivo de template do template home , e adicionar esta linha a ele:

 echo $page->title;

Isso diz ao ProcessWire para pegar o campo “Título” da página em que estamos atualmente (“Início”) e produzi-lo. Digamos que também temos um campo “Título” na página, que queremos usar em vez do campo “Título”, mas somente se o usuário tiver inserido algo nele.

 echo $page->get("headline|title");

Usamos o método get para acessar o campo de uma página (então, $page->get(“title”) é basicamente equivalente ao primeiro exemplo de código acima), e escrevemos “headline|title” no método get . Isso diz ao ProcessWire para primeiro verificar o campo “Headline” e produzir o conteúdo do título. Mas se o campo "Título" estiver vazio, o campo "Título" será usado como substituto.

Também é possível usar variáveis ​​de API em strings PHP. As duas instruções de echo a seguir para gerar o número de filhos de uma página são equivalentes:

 echo "This page has " . $page->numChildren . " children pages."; echo "This page has {$page->numChildren} children pages.";

Vamos pegar os filhos da nossa página raiz (lembre-se, ainda estamos em home.php ) e produzi-los como uma lista de links:

 echo "<ul>"; foreach ($page->children as $child) { echo "<li><a href='{$child->url}'>{$child->title}</a></li>"; } echo "</ul>";

Outro exemplo de um campo interno (como children e url no exemplo acima) é iterar por todos os pais de uma página e criar uma navegação de navegação:

 echo "<ul>"; foreach ($page->parents as $parent) { echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>"; } // output the page itself at the end echo "<li>{$page->title}</li>"; echo "</ul>";

Na página raiz (“Home”), isso apenas geraria seu título, porque $page->parents estaria vazio.

Anteriormente, mostrei a você como criar miniaturas de imagem na GUI de administração. A criação de miniaturas também pode ser feita programaticamente com a ajuda da API. Vamos percorrer todas as imagens carregadas no campo "Imagens", criar uma variante de imagem grande com 600 pixels de largura com altura proporcional e uma miniatura de 150 × 150 pixels, com opções específicas como configurações de corte e qualidade da imagem. No final, queremos vincular a imagem em miniatura à imagem grande. Parece complicado? Não é.

 $options = array( "quality" => 90, "cropping" => "northwest" ); foreach ($page->images as $image) { $large = $image->width(600); $thumbnail = $image->size(150, 150, $options); echo "<a href='{$large->url}'><img src='{$thumbnail->url}' alt='></a>"; }

O ProcessWire é bastante inteligente nesse sentido, pois cria imagens em qualquer tamanho rapidamente e mantém um cache delas, de modo que precisa criar as versões apenas uma vez.

Aqui está um último exemplo de $page para mostrar que a API parece muito com você interagindo com o DOM ao usar jQuery. Vamos pegar o último filho da página pai em que estamos atualmente.

 $wantedPage = $page->parent->children()->last();

Além da variável $page , a API expõe outra importante: $pages .

Obtendo todas as páginas com a variável $pages

Com $pages , você tem acesso a todas as páginas da sua instalação do ProcessWire. Em outras palavras, dá acesso a todo o seu conteúdo de qualquer lugar .

Por exemplo, você pode ter uma página de configurações oculta (ou seja, não acessível no front-end) em sua instalação do ProcessWire; você pode adicionar configurações globais, como o título e a descrição do seu site; e você pode acessar e produzir esses blobs de conteúdo de qualquer arquivo de modelo que desejar.

 $settings = $pages->get("template=settings"); echo "<h1>{$settings->global_title}</h1>"; echo "<p>{$settings->global_description}</p>";

Um caso de uso comum para uma única página de tópico de um blog é mostrar todas as postagens do blog nas quais o tópico é referenciado. Basta escrever isso no arquivo de modelo do tópico:

 $pages->find("template=blog-post, topics=$page");

Observação: topics é um campo no modelo blog-post qual você adicionaria todas as categorias de tópicos específicas da postagem de blog.

Outra configuração poderosa está oculta na guia “Família”. Aqui, você pode definir se as páginas criadas com este modelo podem ter páginas filhas e quais modelos são permitidos para a página pai ou suas páginas filhas. Isso permite que você crie exatamente o tipo de hierarquia de família de modelos que você deseja. É uma maneira flexível e prática (e, na verdade, uma das maneiras mais poderosas) de estruturar seus dados, e é uma das muitas maneiras pelas quais o ProcessWire mostra sua flexibilidade.

Vamos voltar nossa atenção para a lista de campos em um modelo. Observando a captura de tela acima, você pode ver que a ordem dos campos se assemelha à ordem em que os campos serão renderizados na página inicial. Você pode simplesmente arrastar e soltar os campos para alterar a ordem na lista, alterando assim a ordem de aparecimento ao editar a página inicial.

Metade da captura de tela esquerda: arraste e solte campos nas configurações do modelo. Metade da captura de tela direita: ordem dos campos alterada na página "Início".
Alterar a ordem dos campos nas configurações do modelo (à esquerda) afeta a ordem na qual os campos são renderizados na página (à direita). (Ver versão GIF animada)

Você também pode alterar a largura de um campo na página. Basta clicar em um campo e alterá-lo. Vamos colocar os campos “Título” e “Título” lado a lado.

Captura de tela de campos renderizados lado a lado
Você tem o controle total de como os campos são renderizados na página. (Ver versão GIF animada)

Outro exemplo de como você pode personalizar e adaptar a interface do usuário de uma página e seus campos são as dependências do campo de entrada. Eles permitem que você especifique as condições sob as quais um determinado campo no editor de páginas é mostrado ou obrigatório. Vamos tornar o campo “Título” visível na interface do usuário apenas se o usuário inserir algo no campo “Título” e vamos marcar o campo “Resumo” como obrigatório apenas se o usuário inserir algo no campo “Título”:

Captura de tela de configurações para dependências de campo de entrada
O campo “Título” será exibido na página somente quando o usuário inserir algo no campo “Título”. (Ver versão GIF animada)

Aqui está um vídeo que mostra como as dependências do campo de entrada podem ser usadas para aprimorar a experiência do usuário ao trabalhar com o ProcessWire:

Como as dependências do campo de entrada podem ser usadas para aprimorar a experiência do usuário ao trabalhar com o ProcessWire

O número, a ordem e a aparência dos campos em uma página estão totalmente sob seu controle. Você pode colocar apenas um campo em um modelo, nenhum (não muito útil) ou mais de 50 campos, 100 ou até mais. Você pode encomendá-los da maneira que quiser, especificar quais são obrigatórios ou visíveis e quais não são, e especificar em quais circunstâncias eles devem ser obrigatórios ou visíveis. Aqui é onde brilha a abordagem não opinativa da ProcessWire.

Resumo: páginas, campos, modelos

Vamos recapitular a relação técnica entre páginas, campos e modelos: você adiciona campos a modelos e seleciona um modelo ao criar uma nova página. Os campos que você vê ao editar uma página são os campos que você adicionou ao modelo selecionado.

Outra maneira de ver isso seria através de uma analogia do mundo da programação:

  • Modelos são como aulas.
  • Os campos são como as propriedades das classes.
  • Páginas são instâncias de classes.

Depois de internalizar esses conceitos, você estará equipado com tudo o que precisa saber para desenvolver no ProcessWire. E a razão para isso é que a filosofia da ProcessWire é baseada somente nesses três conceitos. Bem legal, certo?

Arquivos de modelo e a API: um casal destinado a ficar junto

O local onde você recupera os dados inseridos no back-end do ProcessWire e os envia no front-end é, obviamente, o sistema de arquivos — mais especificamente, a pasta /site/templates/ de sua instalação do ProcessWire. Um modelo pode ter um arquivo PHP físico com o mesmo nome associado a ele; então, o template home teria um arquivo home.php na pasta /site/templates/ .

Nota: Como você desenvolve seus arquivos de modelo depende totalmente de você. Se você estiver familiarizado com o estilo WordPress de desenvolvimento de coisas, poderá continuar como está acostumado. Ou, se você tiver uma configuração bastante complexa e grande e quiser criar uma arquitetura mais sofisticada, poderá usar uma abordagem inspirada no MVC, que funcionaria tão bem. Ryan Cramer tem um tutorial introdutório muito bom, intitulado “Como estruturar seus arquivos de modelo”, no qual você pode aprender diferentes abordagens para o desenvolvimento de arquivos de modelo no ProcessWire.

O código que você escreve em um arquivo de modelo consistirá principalmente em construções PHP básicas (condições if , loops foreach , instruções de echo ), marcação HTML e API do ProcessWire. A API é fortemente inspirada em jQuery - então, é como iterar e percorrer o conteúdo que você inseriu no back-end por meio de métodos, seletores e recursos de encadeamento (interface fluente). É fácil de usar e muito expressivo, assim como o jQuery.

Vamos começar analisando alguns exemplos simples para você começar a usar a API. Mas antes de começarmos, lembre-se de marcar a folha de dicas da API do ProcessWire, uma referência útil com uma visão geral de todos os métodos de API disponíveis.

Captura de tela do Cheatsheet do ProcessWire
A folha de dicas da API servirá como um bom companheiro.

O que queremos fazer primeiro é acessar e exibir o conteúdo do campo de uma página. A API expõe uma variável para lidarmos com isso: $page .

Obtendo a página atual com a variável $page

A variável $page contém todos os campos de uma única página. Isso inclui campos internos (como o nome do modelo de uma página), bem como os campos que você, como desenvolvedor, adicionou ao modelo da página.

Vamos abrir home.php , que é o arquivo de template do template home , e adicionar esta linha a ele:

 echo $page->title;

Isso diz ao ProcessWire para pegar o campo “Título” da página em que estamos atualmente (“Início”) e produzi-lo. Digamos que também temos um campo “Título” na página, que queremos usar em vez do campo “Título”, mas somente se o usuário tiver inserido algo nele.

 echo $page->get("headline|title");

Usamos o método get para acessar o campo de uma página (então, $page->get(“title”) é basicamente equivalente ao primeiro exemplo de código acima), e escrevemos “headline|title” no método get . Isso diz ao ProcessWire para primeiro verificar o campo “Headline” e produzir o conteúdo do título. Mas se o campo "Título" estiver vazio, o campo "Título" será usado como substituto.

Também é possível usar variáveis ​​de API em strings PHP. As duas instruções de echo a seguir para gerar o número de filhos de uma página são equivalentes:

 echo "This page has " . $page->numChildren . " children pages."; echo "This page has {$page->numChildren} children pages.";

Vamos pegar os filhos da nossa página raiz (lembre-se, ainda estamos em home.php ) e produzi-los como uma lista de links:

 echo "<ul>"; foreach ($page->children as $child) { echo "<li><a href='{$child->url}'>{$child->title}</a></li>"; } echo "</ul>";

Outro exemplo de um campo interno (como children e url no exemplo acima) é iterar por todos os pais de uma página e criar uma navegação de navegação:

 echo "<ul>"; foreach ($page->parents as $parent) { echo "<li><a href='{$parent->url}'>{$parent->title}</a></li>"; } // output the page itself at the end echo "<li>{$page->title}</li>"; echo "</ul>";

Na página raiz (“Home”), isso apenas geraria seu título, porque $page->parents estaria vazio.

Anteriormente, mostrei a você como criar miniaturas de imagem na GUI de administração. A criação de miniaturas também pode ser feita programaticamente com a ajuda da API. Vamos percorrer todas as imagens carregadas no campo "Imagens", criar uma variante de imagem grande com 600 pixels de largura com altura proporcional e uma miniatura de 150 × 150 pixels, com opções específicas como configurações de corte e qualidade da imagem. No final, queremos vincular a imagem em miniatura à imagem grande. Parece complicado? Não é.

 $options = array( "quality" => 90, "cropping" => "northwest" ); foreach ($page->images as $image) { $large = $image->width(600); $thumbnail = $image->size(150, 150, $options); echo "<a href='{$large->url}'><img src='{$thumbnail->url}' alt='></a>"; }

O ProcessWire é bastante inteligente nesse sentido, pois cria imagens em qualquer tamanho rapidamente e mantém um cache delas, de modo que precisa criar as versões apenas uma vez.

Aqui está um último exemplo de $page para mostrar que a API parece muito com você interagindo com o DOM ao usar jQuery. Vamos pegar o último filho da página pai em que estamos atualmente.

 $wantedPage = $page->parent->children()->last();

Além da variável $page , a API expõe outra importante: $pages .

Obtendo todas as páginas com a variável $pages

Com $pages , você tem acesso a todas as páginas da sua instalação do ProcessWire. Em outras palavras, dá acesso a todo o seu conteúdo de qualquer lugar .

Por exemplo, você pode ter uma página de configurações oculta (ou seja, não acessível no front-end) em sua instalação do ProcessWire; você pode adicionar configurações globais, como o título e a descrição do seu site; e você pode acessar e produzir esses blobs de conteúdo de qualquer arquivo de modelo que desejar.

 $settings = $pages->get("template=settings"); echo "<h1>{$settings->global_title}</h1>"; echo "<p>{$settings->global_description}</p>";

Um caso de uso comum para uma única página de tópico de um blog é mostrar todas as postagens do blog nas quais o tópico é referenciado. Basta escrever isso no arquivo de modelo do tópico:

 $pages->find("template=blog-post, topics=$page");

Observação: topics é um campo no modelo blog-post qual você adicionaria todas as categorias de tópicos específicas da postagem de blog.

Vamos trabalhar um pouco mais com o mecanismo seletor do ProcessWire. Deixe-me mostrar alguns exemplos, referindo-se ao site de demonstração do ProcessWire, um diretório de arranha-céus dos EUA. O site de demonstração contém muitas páginas e tem uma arquitetura de modelo de dados interessante (ou seja, coisas como arquitetos, cidades, prédios e locais referenciando uns aos outros), e é um bom caso de uso para mostrar o que você pode fazer com seletores.

Este exemplo encontra todos os arranha-céus que mencionam a frase “empire state building” em sua cópia do corpo:

 $pages->get("template=cities")->find("template=skyscraper, body*=empire state building");

Nota: Primeiro pegamos a página com o template cities ; então, obtemos todas as páginas com o template skyscraper . A razão pela qual podemos encadear os métodos dessa maneira é porque todas as páginas de arranha-céus são sub-filhas da página “Cidades”.

Vamos encontrar todos os arranha-céus dos arquitetos Adrian Smith, Eric Kuhne ou William Pereira e ordenar os resultados por altura em ordem crescente:

 $adrian = $pages->get("template=architect, name=adrian-smith"); $eric = $pages->get("template=architect, name=eric-kuhne"); $william = $pages->get("template=architect, name=william-pereira"); $skyscrapers = $pages->find("template=skyscraper, architects=$adrian|$eric|$william, sort=height");

Você pode otimizar o código encontrando todos os arquitetos solicitados em uma única etapa, em vez de três:

 $architects = $pages->find("template=architect, name=adrian-smith|eric-kuhne|william-pereira"); $skyscrapers = $pages->find("template=skyscraper, architects=$architects, sort=height");

Nota: O método get potencialmente sempre retorna uma página; o método find potencialmente sempre retorna várias páginas.

Você pode revisar ainda mais o código usando subseletores (sim, você pode ter seletores dentro de seletores):

 $skyscrapers = $pages->find("template=skyscraper, architects=[name=adrian-smith|eric-kuhne|william-pereira], sort=height");

Outras variáveis ​​de API

$page e $pages não são as únicas variáveis ​​de API com as quais você pode trabalhar. Existem muitos outros, como $session (para fazer login e logout de usuários e redirecionar para outras páginas), $user (para estabelecer uma conexão com o usuário que está visualizando a página) e $config (que são para configurações específicas para sua instalação do ProcessWire). Vejamos dois exemplos.

Primeiro, vamos redirecionar o usuário para a página inicial:

 $session->redirect($pages->get("template=home")->url);

E vamos fazer algo se o usuário atual estiver logado:

 if ($user->isLoggedin()) { /* do something */ }

Estendendo a funcionalidade do ProcessWire com módulos

O ProcessWire é construído em uma arquitetura modular e facilmente extensível e mostra: Cada instalação consiste no núcleo do ProcessWire (a essência do ProcessWire, que permite a funcionalidade básica) e um conjunto de módulos pré-empacotados (os chamados módulos principais) que ficam no topo do núcleo e estendê-lo.

Módulos principais

Alguns desses módulos pré-empacotados são instalados e ativados por padrão, e outros são desinstalados por padrão. Por exemplo, o sistema de comentários integrado do ProcessWire é um módulo que você pode ativar ou desativar a qualquer momento. Além disso, coisas como o campo de repetidor sobre o qual falamos anteriormente e o suporte a vários idiomas para conteúdo são basicamente apenas módulos que você pode instalar se precisar deles em seu projeto.

Other examples of neat little core modules are Page Names , which validates text input when you're typing a page name (automatically transforming, say, umlauts like a to ae ), and Page Path History , which keeps track of past URLs where pages have lived and automatically redirects to the new location whenever an old URL is accessed.

Finding and Installing Modules

The official modules repository is the main spot where you can find and download ProcessWire modules. On a module's page, you will find the description and purpose of the module and links to the respective GitHub repository and support forum. Module authors are highly encouraged to post their modules in the official repository because it has the highest visibility and is the place people think of first when they want to find a ProcessWire module.

Installing a module is as easy as dragging the module's files to the /site/modules/ directory and installing it in the admin GUI. There are other ways to install a module, such as by installing the Modules Manager, which enables you to browse (and install) modules without leaving the admin GUI.

Commercial Modules

While most modules are free, there are a few commercial ones, too. The ones being promoted in ProcessWire's store are by the lead developer, Ryan Cramer. There you will find the following modules:

  • ProDrafts enables you to maintain separate draft and live versions of any page. It also provides a comparison and diff tool, as well as automatic saving capabilities.
  • ProFields are a group of ProcessWire modules that help you manage more data with fewer fields, saving you time and energy.
  • ProCache (among other things) provides an impressive performance boost for your website by completely bypassing PHP and MySQL and enabling your web server to deliver pages of your ProcessWire website as if they were static HTML files.

Don't miss the screenshots and videos on the module pages to get a first impression. This is finely executed software.

There are also commercial modules outside of the official website, such as Padloper, an e-commerce platform built on top of ProcessWire. To be fair, what is definitely missing in the ProcessWire cosmos is a way for module authors to easily publish their commercial modules in a centralized spot.

How Do ProcessWire Modules Generally Compare to WordPress Plugins?

The reason why ProcessWire has so fewer modules than WordPress (approximately 400 versus more than 40,000) is not so much because it is less popular (an understatement, of course), but more because the core itself is already so feature-rich that adding a ton of modules to extend it is simply not necessary. For example, you don't need a module to create a gallery slideshow or to get the first child of something or to generate thumbnails. All of that (and much more) is already covered out of the box.

So, whereas in WordPress your typical method of solving a problem would be to search for a plugin, in ProcessWire you would first look to the tools available in core; in 90% of cases, that would provide you with the solution.

What You Can Build With ProcessWire

Because ProcessWire behaves more like a framework than a CMS (the core is actually a framework, and the CMS is an application built on top of it), the use cases for building things with ProcessWire are pretty broad. You may want to check out some websites powered by ProcessWire (especially the most liked websites).

ProcessWire is a good fit if you want to develop a JSON REST API, an image-resizing app for employees, a front end for managing millions of products (scalability is pretty impressive — you can have literally millions of pages on a single installation), a web application for displaying the financial results of companies, a simple blog, a website for a big university, or just a simple one-page informational website.

Where To Go From Here: There's A Lot To Discover

Naturally, a beginner's guide can't talk about everything the tool has to offer. So, here is a short list of other ProcessWire features, facts, links and tools worth mentioning:

  • Check out ProcessWire Weekly and ProcessWire's blog to stay up to date on the latest news.
  • ProcessWire has built-in caching mechanisms (for example, a template and markup cache).
  • Wireshell is a command-line interface for ProcessWire based on the Symphony Console component.
  • Security is a top priority for ProcessWire.
  • Visit grab.pw (isn't that the coolest domain name ever?) to download the latest stable version of ProcessWire (ZIP file, 10MB).
  • ProcessWire has a small and friendly community. The discussion board is the central place to discuss any questions and problems.
  • ProcessWire has good multi-language support. The multi-language modules are part of the prepackaged core modules.
  • ProcessWire has a transparent roadmap, and development is very active. There is a new minor release nearly every week.
  • See what others have to say about ProcessWire in the reviews section and on alternativeTo. There's also an interesting Quora thread titled “How does ProcessWire compare to WordPress.”
  • ProcessWire.tv is a searchable collection of ProcessWire tutorial videos.

Resumo

ProcessWire is a system that rewards you [for] being curious. We aim to show you how to fish so that you can catch the big fish.

This statement by Ryan Cramer, the creator of ProcessWire, encapsulates what ProcessWire is all about.

I think what resonates with a lot of people is that ProcessWire is a system that goes from simple to complex, not the other way around. It doesn't assume what you want to build, but instead lays a strong, non-opinionated foundation by offering you effective, powerful tools and leaving the rest to you. That conceptual aesthetic has, to me, a certain appeal to it.