- A read-only content report A worked example of a safe agentic workflow - an agent with a read-only API key walks a folder through the REST API, reads the fields of each page, and writes a report for editors (missing summaries, outdated dates…
- Attribution and copyright notices Where credit goes in an extension - file headers, license files, ezinfo.php Includes, composer.json authors, README credits, Git history - and how to add your name without removing anyone else's.
- Changelogs Write a changelog users can act on - grouped by Added, Updated, Fixed, Removed and Renamed, assembled from the commit messages since the last tag, upgrade notes first - and keep an old extension's changelog.
- Choosing a version number How to pick the next version number of a theme - from what is already published, raising only the last position for normal releases, and moving a higher position only as a deliberate decision about what the release…
- Dark mode and design tokens in themes Give a theme one set of design tokens with light and dark values, follow the visitor's system setting, add an optional toggle without inline scripts, and check contrast, as the admin4 design does.
- eZContentObjectTreeNode The node methods extensions use - fetch(), fetchByURLPath(), subTreeByNodeID() and its parameters, subTreeCountByNodeID(), object(), path, URL alias, access - with a tested example.
- Finding the extensions installed on your site Setup > Extensions, Info > About and the command line: what is installed, and which extension is behind a page, a template, a setting or an operator.
- Keeping every version field in sync A theme's version number lives in up to five places; the list, the order in which to change them before a release, and a one-minute check that they agree.
- Old-style constructors and static calls PHP 8 no longer runs a method named after its class as the constructor, and stops on instance methods called statically. How to find both in an old extension and fix them without breaking code that calls the old names.
- Part 7: Releasing your extension Part 7 of the book: release an extension so others can rely on it - version numbers, permanent tags, metadata bumps, Composer and Packagist, changelogs, GitHub releases, packages, tests, and a checklist.
- Personal API keys for integrations Using personal API keys of a service account for server-to-server integrations over REST - switching keys on for one role, scopes, making and rotating the key, rate limits, audit events, and opening your own REST routes…
- PHP 8 migration notes for your code What to change in older PHP code so it runs cleanly on PHP 8.0 to 8.5 (PHP 7.4 usable without support) under Exponential 6 - dynamic properties, count() on non-arrays, null passed to string functions, SPL return types…
- PHP version compatibility Keep a theme's PHP code (operators, modules, classes) working on every PHP version Exponential supports - PHP 8.0 is the oldest, PHP 7.4 usable without support - with php -l per version, what typically breaks, and how…
- Pretty URLs: URL aliases and URL wildcards How Exponential turns readable addresses into module addresses - automatic URL aliases for content nodes, global aliases for module views, wildcard patterns for redirects and rewrites, history redirects when content…
- Settings in an extension Settings an extension ships: registration lines in kernel INI files, your own INI file with documented defaults, reading it safely with eZINI, per-siteaccess settings and secrets.
- Switch the administration's CSP to enforce Step by step - after the template audit and a period of clean reports, change the Content Security Policy of the administration siteaccess from report-only to enforce, deploy it to every process, and check the header.
- Values and literals The values a template can write down - strings in single or double quotes (no variable interpolation, the escapes the parser knows), integers and floats, true() and false(), arrays and hashes built with array() and…
- Versions, tags and pinning in a bundle How Exponential and its extensions are versioned, why a published release tag never changes and what that means for a bundle, how to find the newest release correctly (version sort, not name sort), how the tilde…
- While and do loops The while and do loop functions of the template language, their syntax with sequence, delimiter, break, continue and skip, and why foreach is almost always the better choice.
- With RAD: a settings-only extension The Settings extension wizard writes settings and event listeners: its topics, the listener class that is safe by default, and moving existing settings with exp:ini move-all instead.
Documentation license
This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.
Exponential Copyright © 1998-2026 Exponential Foundation and 7x