---
url: 'https://dxpr.com/pt-pt/hc/documentation/learn-dxpr-builder/development/architecture'
title: 'Arquitetura | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T11:47:35+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  O DXPR Builder tem três partes: um formatador de campo em PHP, um editor
  que corre no navegador, e um conjunto de rotas que o editor chama
  para guardar e obter dados. Esta página explica como combinam.
tags:
  - 'Architectuur en API’s'
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-24T11:47:35+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: Arquitetura
      description: |-
        O DXPR Builder tem três partes: um formatador de campo em PHP, um editor
        que corre no navegador, e um conjunto de rotas que o editor chama
        para guardar e obter dados. Esta página explica como combinam.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T11:47:35+0000'
      dateModified: '2026-10-24T11:47:35+0000'
      author:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      mainEntityOfPage: 'https://dxpr.com/pt-pt/hc/documentation/learn-dxpr-builder/development/architecture'
      articleSection: 'Architectuur en API’s'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/pt-pt/hc/documentation/learn-dxpr-builder/development/architecture'
      description: |-
        O DXPR Builder tem três partes: um formatador de campo em PHP, um editor
        que corre no navegador, e um conjunto de rotas que o editor chama
        para guardar e obter dados. Esta página explica como combinam.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Início
            item: 'https://dxpr.com/pt-pt'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: pt-pt
---
[Help Center](/pt-pt/node/75)/[Documentation](/pt-pt/hc/documentation) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Extend](/hc/documentation/learn-dxpr-builder/extend) /[Architectuur en API’s](/hc/documentation/learn-dxpr-builder/extend/architecture) # Arquitetura.

 Learn DXPR BuilderExtendArchitectuur en API’s

   ## In this guide

O DXPR Builder tem três partes: um formatador de campo em PHP, um editor que corre no navegador, e um conjunto de rotas que o editor chama para guardar e obter dados. Esta página explica como combinam.

## Formatador de campo

O conteúdo é HTML guardado num campo de texto comum do Drupal (`text`, `text_long` ou `text_with_summary`). Um campo fica editável quando a apresentação usa o formatador **DXPR Builder**(`dxpr_builder_text`, em `src/Plugin/Field/FieldFormatter/DxprBuilderFormatter.php`).

O formatador carrega o editor apenas quando tudo isto se verifica:

- o visitante é faturável: utilizador 1, ou uma conta ativa com `edit with dxpr builder` não excluída da edição do DXPR Builder;
- o visitante pode atualizar a entidade;
- a conta tem um endereço eletrónico;
- os limites de utilizadores e conteúdos da licença não são excedidos;
- o site não está na lista de bloqueio do servidor de licenças, e a página não é uma página de revisões.

Os restantes recebem o HTML processado: tokens de caminho expandidos, blocos e vistas do Drupal apresentados nos marcadores, os atributos de editor `data-az*`removidos, e as bibliotecas de que o conteúdo precisa anexadas. A saída para utilizadores com sessão iniciada não fica em cache (`max-age` 0), porque traz definições por utilizador.

## Editor

O editor é um conjunto de ficheiros JavaScript carregados como a biblioteca `dxpr_builder/editor.builder`. Vêm da CDN da DXPR, ou da pasta `dxpr_builder/` do módulo quando tem uma compilação local; a definição **Asset source** em General Settings só aparece nessa altura. O editor analisa o HTML do campo numa árvore de objetos de elemento e escreve-o de volta em HTML ao guardar.

Os tipos de elemento vêm de dois lugares em `dxpr_builder/build/`:

| Folder | Element types |
|---|---|
| `dxpr-builder/core-elements/` | Container, Section, Row, Column, Tabs e os painéis de separador, interrutor e slide |
| `dxpr-elements/elements/` | Elementos de conteúdo e os elementos de esquema Collapsibles, Carousel e Positioned Layers |

Cada elemento guarda as definições no próprio HTML: atributos `data-azat-*`, classes e estilos em linha. O HTML guardado é o único registo do esquema; não há armazenamento de esquema separado. [Elementos personalizados](/hc/documentation/learn-dxpr-builder/development/custom-elements) mostra o formato.

### Analisar HTML existente

Marcação sem atributos do construtor mapeia-se para elementos quando o editor a carrega. Contentores, linhas e colunas Bootstrap viram secções, linhas e colunas. Componentes reconhecidos viram os elementos, por exemplo botões, alertas, cartões, citações, imagens, ícones, barras de progresso, separadores e colapsáveis. Texto, tabelas e outra marcação em linha viram elementos Text, e um `<iframe>` vira um elemento HTML. Etiquetas `<script>` e `<style>` soltas e comentários são descartados. As regras estão em `dxpr-builder/base-element/parse-html.js`.

## Rotas que o editor chama

O editor guarda através de `/dxpr_builder/ajax`, carrega ficheiros através de `/dxpr_builder/ajax/file_upload` e alcança a IA através de `/dxpr_builder/ajax/ai/*`. A maioria das rotas verifica a verificação de acesso de utilizador faturável e um token CSRF; a lista completa com requisitos de acesso está na [referência de API](/hc/documentation/learn-dxpr-builder/development/api#editor-routes).

## Entidades de configuração

| Entity type | Config prefix | Holds |
|---|---|---|
| `dxpr_builder_page_template` | `dxpr_builder.page_template` | Esquemas de página inteira |
| `dxpr_builder_user_template` | `dxpr_builder.user_template` | Secções que os editores guardaram para reutilizar |
| `dxpr_builder_profile` | `dxpr_builder.dxpr_builder_profile` | Limites por função em elementos, blocos, vistas, modelos, conjuntos de ícones e botões do editor de texto |

## Verificação de licença

A chave de produto é um JWT. `DxprBuilderLicenseService` envia-a ao servidor de licenças da DXPR, que devolve o estado da licença e os limites de utilizadores e conteúdos; o resultado fica em cache. Sem chave de produto aplica-se o plano gratuito: um utilizador e 100 conteúdos. O serviço também mantém sincronizada a lista do servidor com os editores deste site.