Skip to the content
Documentation

Help center

Help for Developers

Build on it: extensions, templates, settings, the APIs, the command line and upgrades.

5997 pages

Start here

Read these pages in this order.

  1. Develop with Git: grow from user to developer The recommended way to build websites with Exponential. Install the kernel and every se7enxweb extension as...
  2. Extension development: the book (start here) A complete book on growing from user to builder, extension developer and theme developer with Exponential:...
  3. Add a database table A migration that creates a table of the site's own on every engine from a share/db_schema.dba definition, w...
  4. AI, agents and agentic: start here The landing page for people who use AI with Exponential and for people who build agents and agentic workflo...
  5. Ecosystem: start here The landing page for the Exponential Ecosystem - the greater Exponential world within the PHP stack, its us...
  6. Integrators: start here The landing page for system integrators and integration developers who connect Exponential with CRM, ERP, P...

Good to know

  • Migrations

    The start of everything about migrations in Exponential 6.0.15 - schema and content changes written once as files under version control and applied to every installation of a site in the same order, with a caption…

  • Migrations: a first PHP migration, step by step

    In this tutorial you write two PHP migrations for a site: one creates a table exp_news_note with a first row, the other publishes a folder "News" below the content root and notes it in the table. You check them, look at…

  • Add a database table

    A migration that creates a table of the site's own on every engine from a share/db_schema.dba definition, writes a first row, and drops it again in down() - with the dry run, the run, the checks and the rollback.

  • Testing migrations: check, simulate, diff and CI

    Four layers of tests for migrations - the lint without a database, the dry run, the simulation with a diff on PostgreSQL or SQLite, and a PHPUnit test on a throwaway SQLite database - and how to run them in CI.

  • Deploying with migrations: CI/CD and GitHub Actions

    Run migrations as part of every deploy - the order of the steps, a complete GitHub Actions workflow that checks pull requests and deploys over SSH, the exit codes a pipeline acts on, the installation lock, and runs…

  • Team workflow with git: branches, conflicts and order

    How several developers write migrations on branches without stepping on each other - timestamps and order, requires for real dependencies, two migrations with the same timestamp, rebasing, renaming only before a merge…

Search by topic

Each button lists the pages of one topic for Developers.

What changed in the source code most recently: the main branch of se7enxweb/exponential, read from its public feed by this server.

Show merge commits too

  1. Added: An Exponential Documentation section in the README that links … (opens in a new window) ·
    Message
    Added: An Exponential Documentation section in the README that links to doc.exponential.earth
    
    The section says how the documentation portal saves time and money on a project, and gives starting points for common needs: editing content, layouts, users and access, installation, concepts, configuration, templates, features, the reference, extensions and the help center. Every link was checked against the live site.
    The heading of the notice for new users is capitalized.
    d5263e7883
  2. Updated: The documented INI load order matches the kernel, in English… (opens in a new window) ·
    Message
    Updated: The documented INI load order matches the kernel, in English and German
    
    The configuration guide listed the active extensions below the siteaccess and
    an extension's siteaccess directory above it. eZINI reads them the other way:
    after the defaults come the extensions a siteaccess activates for itself
    (ActiveAccessExtensions[]), the extension siteaccess directories, the
    siteaccess, the extensions in ActiveExtensions[] and settings/override. An
    active extension therefore wins over settings/siteaccess//.
    
    - CONFIGURING: the layer table in that order, the extension listed first wins
      inside a layer (not the last one), and the advice for a siteaccess value
      that has to beat an extension.
    - The settings page guide, the per-site settings of extensions, the
      after-installing order note, the students' mistakes table, the book
      comparison and the multisite extension list say the same.
    - The 6.0.15 changelog names the correction.
    0e113e81b7
  3. Updated: The mail address refusal test runs only where the mail fork … (opens in a new window) ·
    Message
    Updated: The mail address refusal test runs only where the mail fork is installed
    
    ezpMailMessageIdTest MI-05 checks a behavior of se7enxweb/expcomponents-mail
    1.10.2. A vendor/ that still holds the upstream zetacomponents/mail 1.10.1,
    as an installation does until its next composer update, does not refuse the
    address, so the test now skips there instead of failing. A fresh install,
    as CI makes, has the fork and runs it.
    1365318ef3
  4. Updated: The expcomponents documentation names the released forks and… (opens in a new window) ·
    Message
    Updated: The expcomponents documentation names the released forks and the switch of 6.0.15, in English and German
    
    All 21 forks were released on 2026-11-06 and the kernel requires them, so
    the pages state released versions and constraints instead of proposed ones.
    
    - The feature page, the upgrade notes and the package specification list
      every fork with its release and the constraint of the kernel's
      composer.json; the forks require each other by their fork names and each
      ships a NOTICE file with the upstream notices
    - The image-conversion entries describe the ImageMagick fix that was
      offered upstream as zetacomponents/ImageConversion pull request 9
    - The mail entries and the upgrade notes describe the refusal of
      addresses with whitespace or < > , ; " that comes with mail 1.10.2
    - The contributor guide no longer suggests a "Modified by" line in file
      headers; changes are recorded in commits, the ChangeLog and the release
      notes
    - The WebDAV, mail and feed constraints on the standards and integrator
      pages, and the third-party components page, follow the releases
    - The 6.0.15 changelog has one section for the switch and its
      documentation instead of two
    3034529134
  5. Updated: The documentation names expcomponents as the kernel's librar… (opens in a new window) ·
    Message
    Updated: The documentation names expcomponents as the kernel's libraries, in English and German
    
    Every page that described the Zeta Components as the kernel's current
    libraries now names expcomponents, the fork of them that the kernel
    requires since 6.0.15, and links to the new pages. Historical statements
    (eZ Components in 4.x, Zeta Components up to 6.0.14, the security pull
    requests of April 2026) stay in the past tense.
    
    - Installation: INSTALL.md, UPDATE.md, the introduction, requirements,
      getting the code, setup wizard, troubleshooting and migrating from 4.x
      chapters; the console upgrade guide says that the libraries stage swaps
      the packages
    - Standards: APIs and protocols name the fork packages for SMTP, REST,
      WebDAV and feeds; PHP and Composer says that Composer's class map, not
      ezcBase::autoload, loads the libraries
    - Licensing: the documentation license page, copyright and copyleft,
      third-party components, license compatibility, the licensing and
      bundler FAQs say that the libraries are Apache 2.0 and how that combines
      with the kernel's GPL version 2 or later (not legal advice)
    - Help center: the ecosystem pages, map and glossary, the hosting,
      integrator, PHP developer, trainer, project and contributing pages, who
      is 7x and who is the Exponential Foundation, the PHP developer and
      ecosystem FAQs
    - The glossary has the terms expcomponents, eZ Components and Zeta
      Components; the ezie page, the REST guide, the goals and the support
      page name the fork
    200d7edc15
  6. Added: Documentation of expcomponents, the fork of the Zeta Component… (opens in a new window) ·
    Message
    Added: Documentation of expcomponents, the fork of the Zeta Components the kernel requires, in English and German
    
    Exponential officially forks the Zeta Components under their Apache License
    2.0 as expcomponents (se7enxweb/expcomponents-) and modernizes them
    internally. Four new pages, each in English and German, describe the fork
    in detail:
    
    - The feature page Exponential Components (expcomponents): what the
      libraries are, their history from eZ Components (eZ Systems, New BSD)
      through Apache Zeta Components and Zeta Components (Apache 2.0), why they
      are forked, what stays the same (ezc* classes, APIs, license and
      notices), the package map with each fork's repository and its released
      or proposed version, Composer's replace, how Apache 2.0 combines with
      the kernel's GPL version 2 or later, where the repositories and packages
      are, releases, issues and the intent of the modernization
    - The upgrade notes The switch to expcomponents: who is affected, the
      composer.json before and after, the upgrade by console and by hand,
      projects and extensions that required zetacomponents/* themselves, the
      replace semantics, autoloading, verifying with composer show,
      troubleshooting and rollback
    - The specification The expcomponents packages: per library its purpose,
      the kernel classes, files and features that use it, the replaced
      package and the repository
    - The guide Contributing to expcomponents: clone, tests on every
      supported PHP version, the rules a change keeps, license headers and
      notices, commit messages, the ChangeLog, pull requests, releases and
      versions, syncing with upstream, security reports
    
    The feature, specification and guide indexes list the pages, the German
    path map knows them, and the 6.0.15 changelog has a section and item 30 of
    the upgrade checklist. Versions of forks that are not released yet are
    marked as proposed.
    a3f58e9c65
  7. Updated: The kernel requires Exponential's forks of every Zeta Compon… (opens in a new window) ·
    Message
    Updated: The kernel requires Exponential's forks of every Zeta Component it uses
    
    composer.json and composer.json.dist require the se7enxweb/expcomponents-*
    packages in place of the zetacomponents/* ones: authentication, base, cache,
    configuration, console-tools, database, debug, event-log, feed,
    image-conversion (with image-analysis), mail, mvc-tools, persistent-object,
    signal-slot and system-information, next to archive and webdav. Each fork
    replaces its upstream package, so nothing that requires an upstream name
    breaks, and keeps the ezc* class names and the API. The forks are maintained
    by 7x and the Exponential Foundation under the Apache License 2.0 and are
    tested on PHP 7.4 to 8.5.
    
    expComposerKernelRequirementsTest CR-03 and CR-04 check the fork names.
    The mail fork refuses an address with whitespace or < > , ; " before it
    writes a header: ezpMailMessageIdTest MI-04 checks the localhost Message-Id
    with a valid address whose domain is no host name, and MI-05 the refusal.
    c04189621f
  8. Updated: The tutorial Migrating URLs, the feature page and the URL ma… (opens in a new window) ·
    Message
    Updated: The tutorial Migrating URLs, the feature page and the URL map examples use the migration helpers
    
    The steps of a migration now use the helpers of the import instead of shell
    commands, in English and German:
    
    - Collecting the old addresses: exp:url:from-sitemap and exp:url:from-404, and
      the tabs From the old sitemap and From the 404 log of the import screen; the
      404 log gives paths only, as it hides the values of a query
    - Building the map: exp:url:suggest and the tab Suggest targets, with
      --fill-above and the other suggestions in the note
    - Testing: exp:url:test and Test the old addresses after an import, with the
      states it reports and its exit code
    - The feature page has a section on the helpers and their commands; the
      examples show how to test a file after an import
    - Changelog 6.0.15
    43304f1d6b
  9. Updated: exp:url:test follows a redirect whose answer it stops readin… (opens in a new window) ·
    Message
    Updated: exp:url:test follows a redirect whose answer it stops reading early
    
    The test asks for no body and stops each transfer at its first bytes; curl
    then leaves the redirect address empty, so every 301 and 302 was reported as
    "not redirected" (found on alpha with pages of its own sitemap that move). The
    Location header is now read as the answer arrives and used when curl has none.
    9d746b1336
  10. Added: URL map helpers as tabs of the import screen, and a test of th… (opens in a new window) ·
    Message
    Added: URL map helpers as tabs of the import screen, and a test of the old addresses after an import
    
    The import screen of the administration gets the helpers of the console, so
    a site can be moved without a shell.
    
    - content/urlimport/(source)/sitemap: the old site's addresses from its
      sitemap (an address of a public host only: every address of the host is
      checked and the connection is pinned to it, so nothing on the server's own
      network is fetched), or an uploaded sitemap or list; /(source)/404: this
      site's 404 log, by hits, within the last days; /(source)/suggest: a map
      whose rows lack a target
    - Each with the targets suggested and filled in from a score; the map is
      downloaded as CSV to complete in a spreadsheet, or opened as an import to
      preview (rows without a target are not importable there)
    - After an import, Test requests its old addresses (the first 500) on the
      site of its siteaccess (its SiteURL), follows the redirects and lists the
      rows that did not land; the result stays with the import
    - The tabs are links with the view parameter source; forms post, nothing
      is read from the query string. Shared components and tokens only, in the
      admin4 and admin designs
    - The strings in every administration catalogue
    - The BC note in English and German, the changelog, the generated page of
      the view
    - Tests: the form of a helper, the tab addresses, the site address of the
      test and the kept results of an import, without a database
    b30c01fa63

Showing 1–10 of 40 commits

Recently updated

Free documentation: use it to help yourself and others

This help is free documentation, licensed under the GNU Free Documentation License 1.3 or later. You may use it, share it and improve it:

  • Study it Read any page as often as you like, for any purpose.
  • Copy it and share it Give pages to other users, on paper or as files. Keep the copyright notice, the license notice and a copy of the license with every copy.
  • Translate, adapt and improve it Share your version under the same license, with the original notices and a note of what you changed.
  • Cite it Refer to a page by its title and its address in the help, or its file in the doc directory.
  • Contribute fixes back Use "Edit on GitHub" on any page. Changes are accepted under the same license, so they stay free for everyone.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x