Icon themes that live in your extension
This page is for developers and designers who want their own class icons or file type icons in the admin. Exponential
draws these small icons from an icon theme, a folder of images. Before July 2026 the only place for a theme was
share/icons/, so a custom icon meant copying files into the core or overriding a kernel class. Since 20 July 2026
(commit 3a40db1988) an extension can ship its own icon theme: the functions of the former bciconextensions and
bciconextensions_share_icons extensions are part of the kernel.
Warning
.htaccess slows down every request. When .htaccess files are enabled (AllowOverride anything but None), let alone
used, Apache looks for them and reads and evaluates them on every request, in every directory of the path, and
page loading times go up drastically (measured). The only real fix is to switch the feature off for
the virtual host: AllowOverride None in the HTTPS virtual host, and the rules in the virtual host's own
configuration as mod_rewrite rules. That is far faster in production speed tests and well worth the time it takes
to optimize a production configuration. Switch over right away: copy the rules of the
example HTTPS virtual host into your virtual host (with the static cache, also
staticcache_offload.conf), set AllowOverride None, run apachectl configtest, reload Apache and
test the site. The same rules for other servers: nginx, LiteSpeed,
Caddy, IIS, Velocity (built in); where virtual host rules go in a control
panel: Plesk, cPanel, DirectAdmin, ISPConfig.
On LiteSpeed or OpenLiteSpeed, the server's own page cache can also answer anonymous visitors and crawlers without PHP: Page caching with LiteSpeed and OpenLiteSpeed.
Upgrading? If you used those two extensions, remove them from ActiveExtensions[]. No kernel class override and
no EZP_AUTOLOAD_ALLOW_KERNEL_OVERRIDE setup are needed any more.
Put a theme in an extension
Create the folders. One folder per size, then per group:
extension/mycompany_icons/ icons/ crystal-admin/ the theme name 32x32/apps/job.png 16x16_indexed/apps/job.png icon.ini sizes and the class to icon map of this theme settings/icon.ini.append.phpWrite the theme's own
icons/crystal-admin/icon.ini:#?ini charset="utf-8"? [IconSettings] Sizes[] Sizes[normal]=32x32 Sizes[small]=16x16_indexed [ClassIcons] Default=mimetypes/empty.png ClassMap[job]=apps/job.pngName the extension and the theme in the extension's
settings/icon.ini.append.php:[ExtensionSettings] IconExtensions[]=mycompany_icons [IconSettings] Theme=crystal-admin StandardTheme=crystal AdditionalThemeList[]=crystal-admin */ ?>Activate the extension (
ActiveExtensions[]=mycompany_iconsinsettings/override/site.ini.append.php), then:php bin/php/ezpgenerateautoloads.php -e php bin/php/ezcache.php --clear-all --allow-root-userOpen a folder of
jobitems in the admin: the list shows yourapps/job.png.
Extensions listed in IconExtensions[] are searched before share/icons/, in the order listed.
How an icon is found
- The current theme (
Theme), in the extension folders, then inRepository(defaultshare/icons). - Each theme in
AdditionalThemeList[], in the same order of places. StandardTheme.- The theme's or override's
Defaulticon, so a missing file never produces a broken image tag.
Icons in extensions are plain static files: the web server serves them with no extra PHP work per image. The shipped
rules (.htaccess_root, the web server examples, Velocity) serve extension/<name>/icons/ since 6.0.15; a server
configuration of your own needs the one rule in Web server rules.
The crystal-admin theme now ships an icon for the content class identifier job.
Settings
| File | Block | Key | Default | Scope | Meaning |
|---|---|---|---|---|---|
settings/icon.ini | IconSettings | Repository | share/icons | installation | Default icon repository, relative to the document root |
settings/icon.ini | IconSettings | Theme | crystal | installation | Theme tried first |
settings/icon.ini | IconSettings | StandardTheme | crystal | installation | Last fallback theme |
settings/icon.ini | IconSettings | AdditionalThemeList[] | empty | installation | Themes searched before StandardTheme |
settings/icon.ini | ExtensionSettings | IconExtensions[] | empty | installation | Extensions whose icons/ folder is searched; order matters |
The full guide, with the class and the upgrade notes, is Icon support.
Related pages
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.