This plugin makes it super easy to create modular websites with Kirby.
Warning
Using Kirby 4, you'll have to stick to version 2.8.4.
π¦ Module Creation
- ποΈ Create modules in
site/blueprints/modules/[module].ymlandsite/snippets/modules/[module].php - π Alternatively:
site/modules/[module]/folder with[module].ymland[module].phpinside - π§ Use the
make:moduleCLI command to generate new modules
π§© Core Functionality
- π Automatically creates a hidden modules storage page for pages with a modules section
- π¨ Keeps
changeTemplateoptions up to date - π Allows moving modules to other modules storage pages
- π§ Sets the
navigationoption so you can use the arrows to move between modules - π Easily render modules with
<?= $page->modules() ?> - π§° Useful methods like
hasModules(),isModule()andmoduleId() - π·οΈ Optionally auto-generate unique slugs for modules
- ποΈ View draft modules on parent pages via the panel preview button
- π Extended
url()method with anchor links on the parent page - π¦ Accessing Module URLs directly redirects to the parent page with an anchor
βοΈ Customization Options
- ποΈ Set a default module type
- π« Exclude specific module types
- π Option to auto-publish modules
- π Control redirect behavior after module creation
Download this repository to /site/plugins/kirby-modules.
Alternatively, you can install it with composer: composer require medienbaecker/kirby-modules
- Install the plugin
- Set up your first module in
site/blueprints/modules/[module].ymlandsite/snippets/modules/[module].php - Add a
modulessection to a page blueprint and create some modules - Render the modules in your template with
<?= $page->modules() ?>
I created an example repository with Kirby's plainkit, this plugin and three very simple modules.
A module is a regular page, differentiated from other pages by being inside a modules container. This approach makes it possible to use pages as modules without sacrificing regular subpages.
π Page
π Subpage A
π Subpage B
π Modules
π Module A
π Module B
Similar to blocks, you can create module blueprints in site/blueprints/modules/ and module templates in site/snippets/modules/. E.g. site/blueprints/modules/text.yml and site/snippets/modules/text.php.
It's also possible to use a separate site/modules/ folder. In this case, you create your module blueprint in site/modules/text/text.yml and the module template in site/modules/text/text.php.
Add a modules section to any page blueprint and a modules container will be automatically created.
In the template you can use <?= $page->modules() ?> to render the modules.
title: Default Page
sections:
modules: true<?= $page->modules() ?>title: Text Module
fields:
textarea: true<div class="<?= $module->moduleId() ?>" id="<?= $module->uid() ?>">
<h1><?= $module->title() ?></h1>
<?= $module->textarea()->kt() ?>
</div>You can access the module page object with $module and the parent page object with $page.
The $module->moduleId() method returns the module ID as a BEM class, e.g. module--text or module--gallery.
The following options are available to add to your site/config/config.php:
return [
'medienbaecker.modules.default' => 'gallery' // default: 'text'
];return [
'medienbaecker.modules.exclude' => [
'hero',
'anotherForbiddenModule'
]
];return [
'medienbaecker.modules.autoslug' => true
];return [
'medienbaecker.modules.autopublish' => true
];return [
'medienbaecker.modules.redirect' => true
];This plugin creates a ModulePage model, overwriting certain methods.
You can extend this model with your own model:
// site/config/config.php
return [
'medienbaecker.modules.model' => 'CustomModulePage'
];// site/models/module.php
class CustomModulePage extends ModulePage {
// methods...
}By default, this plugin automatically populates the create option of the modules section with all modules. If you want to manually define the available modules, you can do so in your blueprint:
modules:
create:
- module.text
- module.imagesThis project is licensed under the terms of the MIT license.