webtrees / example-module
Example module for webtrees
Installs: 19
Dependents: 0
Suggesters: 0
Security: 0
Type:webtrees-module
pkg:composer/webtrees/example-module
Requires
- fisharebest/webtrees: ~2.2 || dev-main
- webtrees/module-installer: ^1.0
This package is auto-updated.
Last update: 2026-02-03 15:04:12 UTC
README
This package shows you how to create a custom module in webtrees.
It is designed as a teaching-aid / documentation.
Rather than using this entire module as a starting point for your own module, it is recommended that you start with a minimal module, and copy/paste/edit just the features you need.
Minimal module
A module is a file called module.php that returns an object that implements ModuleCustomInterface.
Here is a minimal module. Create a folder for it, such as /modules_v4/my-module/ and store your module files there.
Although it doesn’t do anything yet, it will appear in the control panel.
<?php // module.php
use Fisharebest\Webtrees\Module\AbstractModule;
use Fisharebest\Webtrees\Module\ModuleCustomInterface;
use Fisharebest\Webtrees\Module\ModuleCustomTrait;
class MyModule extends AbstractModule implements ModuleCustomInterface
{
use ModuleCustomTrait;
}
return new MyModule();
Many PHP developers like to store each class in a separate file. If you are one of these, you would split this into two files. If you have a simple module, you may prefer everything in one file.
<?php // module.php
require_once __DIR__ . '/MyModule.php';
return new MyModule();
<?php // MyModule.php
use Fisharebest\Webtrees\Module\AbstractModule;
use Fisharebest\Webtrees\Module\ModuleCustomInterface;
use Fisharebest\Webtrees\Module\ModuleCustomTrait;
class MyModule extends AbstractModule implements ModuleCustomInterface
{
use ModuleCustomTrait;
}
The code in this package uses the namespace \Webtrees\Example.
You do not need to use namespaces.
If you do, use the format \MyOrganisationName\MyModuleName.
How do I...?
Add a new webtrees component such as a menu, chart, tab, block
Your module needs to implement the corresponding interface and use the corresponding trait. e.g. ModuleMenuInterface and ModuleMenuTrait
You can implement more than one component in the same module.