Define snippet controllers in a similar way to how page controllers work.
By default the plugin will try to find controllers in your snippets
directory.
Lets have a look at a example header
snippet.
📁 snippets
├─ 📄 header.controller.php
└─ 📄 header.php
// header.controller.php
// The return value can be a callback
return function ($site) {
return [
'title' => $site->title(),
];
};
// Or you can simply return an array.
return [
'title' => site()->title(),
];
You can also define snippet controllers in a plugin.
Kirby::plugin('superwoman/superplugin', [
'snippets' => [
// Refer to a file
'header.controller' => __DIR__ . '/snippets/header.controller.php',
// Return an array
'header.controller' => [
'title' => site()->title(),
],
// Return a callback
'header.controller' => function ($site) {
return [
'title' => $site->title(),
];
},
],
]);
You have access to all variables that are also accessible in the snippet. If you pass additional data to the snippet, you can access it in the controller as well.
Note Since version
2.0.0
and Kirby3.9.6
you can also use variadic arguments.
snippet('header', data: ['title' => 'My Title'])
// header.controller.php
return function (string $title = 'Default Title', ...$args) {
return [
'title' => $title,
];
};
Note Since version
2.1.0
you can override variables when using a controller callback.
snippet('header', data: ['size' => $page->size()])
// header.controller.php
return function (Field|string $size = null) {
if ($size instanceof Field) {
$size = $size->value();
}
$size = match ($size) {
'small' => 'height: 50vh',
'medium' => 'height: 80vh',
default => 'height: 100vh',
};
return [
'size' => $size,
];
};
Note Since version
2.2.0
you can prevent a snippet from rendering in a controller callback.
snippet('header', data: ['size' => $page->size()])
// header.controller.php
return function (Field|string $size = null) {
if (is_null($size)) {
snippet_prevent();
}
return [
'size' => $size,
];
};
By default, the plugin searches for controllers by appending .controller
to the snippet name.
You can change the name resolver in the options. Changing the name also affects plugin-defined controllers.
// config.php
return [
'lukaskleinschmidt.snippet-controller' => [
// The default resolver
'name' => fn (string $name) => $name . '.controller',
// You might want to store controllers in a separate folder
'name' => fn (string $name) => 'controllers/' . $name,
],
];
This plugin is free. Please consider to make a donation if you use it in a commercial project.
Download and copy this repository to /site/plugins/snippet-controller
.
git submodule add https://github.com/lukaskleinschmidt/kirby-snippet-controller.git site/plugins/snippet-controller
composer require lukaskleinschmidt/kirby-snippet-controller
MIT