webtrees/example-module

Example module for webtrees

Installs: 19

Dependents: 0

Suggesters: 0

Security: 0

Type:webtrees-module

pkg:composer/webtrees/example-module

dev-main 2026-02-03 00:00 UTC

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.