1. Go to this page and download the library: Download bnomei/kirby-blueprints library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
#[
Label([
'en' => 'Introduction',
'de' => 'Einleitung',
]),
Type(FieldTypes::TEXT),
]
public Field $introduction;
// load the fields stored as traits
autoloader(__DIR__)->classes();
// load every possible extension else with the autoloader
Kirby::plugin('your/example', autoloader(__DIR__)->toArray([
// add your additional extension definitions here. like...
'options' => [
'cache' => true,
],
]);
use Bnomei\Blueprints\Schema\Field;
use Bnomei\Blueprints\Schema\FieldTypes;
// "fluent definition" from this plugin
return Field::make(FieldTypes::TEXTAREA)
->label('Description')
->toArray();
use Bnomei\Blueprints\Schema\Field;
use Bnomei\Blueprints\Schema\FieldTypes;
// "named parameter definition" from this plugin
return Field::make(
type: FieldTypes::TEXTAREA,
label: 'Description'
)->toArray();
use Kirby\Cms\Page;
class ExamplePage extends Page
{
// nothing here yet
}
use Bnomei\Blueprints\Attributes\ExtendsField;
use Bnomei\Blueprints\Attributes\Label;
use Bnomei\Blueprints\Attributes\Type;
use Bnomei\Blueprints\HasBlueprintFromAttributes;
use Bnomei\Blueprints\HasPublicPropertiesMappedToKirbyFields;
use Bnomei\Blueprints\Schema\FieldTypes;
use Kirby\Cms\Page;
use Kirby\Content\Field;
class ArticlePage extends Page
{
use HasBlueprintFromAttributes;
use HasPublicPropertiesMappedToKirbyFields;
#[
Label([
'en' => 'Introduction',
'de' => 'Einleitung',
]),
Type(FieldTypes::TEXT),
]
public Field $introduction;
}
// no code completion. your IDE does NOT know
// that `introduction()` method is a Field.
var_dump($page->introduction()->value());
// with this plugin your IDE will know that
// the public property `introduction` is a Field
// and you can use code completion and see the
// set attributes on hovering the property.
var_dump($page->introduction->value()); // <-- property not method!
// omitted the use statements for brevity's sake
class MemberPage extends Page
{
use HasBlueprintFromAttributes;
use HasPublicPropertiesMappedToKirbyFields;
#[
Label('Birthday'),
ExtendsField('fields/special-date'),
]
public Field $birthday;
}
// omitted the use statements for brevity's sake
trait HasDescriptionField
{
#[
Type(FieldTypes::TEXTAREA),
Label([
'de' => 'Beschreibung',
'en' => 'Description',
]),
Buttons([
Button::BOLD,
Button::ITALIC,
Button::SEPARATOR,
Button::LINK,
]),
MaxLength(3000),
Spellcheck(true),
]
public Field $description;
}
// omitted the use statements for brevity's sake
class BlogpostPage extends Page
{
use HasBlueprintFromAttributes;
use HasPublicPropertiesMappedToKirbyFields;
use HasDescriptionField; // <-- re-use the trait
}
// use statements omitted for brevity's sake
class ProductPage extends \Kirby\Cms\Page
{
use HasBlueprintFromAttributes;
use HasPublicPropertiesMappedToKirbyFields;
// this is the same trait as the example above
use HasDescriptionField;
#[
CustomType('qrcode'),
Property('Custom key', 'custom data'),
]
public \Kirby\Content\Field $qrcode;
#[
Type(FieldTypes::EMAIL),
Placeholder('Email Field from Property')
]
public \Kirby\Content\Field $email;
#[
Blueprint
]
public static function nameOfThisMethodDoesNotMatterOnlyTheAttribute(): array
{
return Page::make(
title: 'Product',
status: PageStatus::make(
draft: 'Beer',
unlisted: 'Wine',
listed: 'Whiskey',
),
icon: Icon::PIN,
image: PageImage::make(
back: 'black',
icon: '📝',
query: 'page.cover.toFile()'
),
options: PageOptions::make()
->preview('{{ page.url }}#product'),
navigation: PageNavigation::make()
->sortBy('date desc'),
tabs: [
Tab::make(
label: 'Shop',
icon: Icon::CART,
columns: [
Column::make()
->width(1 / 3)
->fields([
'price' => [
'type' => 'number',
'label' => 'Price',
],
'email' => true, // from PHP
]),
Column::make(
width: 2 / 3,
fields: [
// generic
'intro' => Field::make(
type: FieldTypes::TEXTAREA,
label: 'Introduction',
// for custom props use a method with attributes or...
properties: [
Ink::MAXLENGTH => 3000,
Ink::SPELLCHECK => false,
Ink::BUTTONS => false,
],
)
// OR
// ->property(Ink::MAXLENGTH, 3000)
// ->property(Ink::SPELLCHECK, false)
// ->property(Ink::BUTTONS-, false)
// OR
// ->maxLength(3000)
// ->spellcheck(false)
// ->buttons(false)
,
// from methods with attributes
'qrcode' => true,
'description' => true,
]
),
],
),
Tab::make(label: 'Badger')
->icon(Icon::BADGE),
],
)->toArray();
}
}
Column::make()
->width(1 / 3)
->fields([
'price' => [
'type' => 'number',
'label' => 'Price',
],
// will be expanded to the field definition from the
// attributes set on the `public Field $email` property.
'email' => true,
]),
use ...;
class ElephantPage extends Page
{
use HasInk;
#[
Label('Left Ear'),
Type(FieldTypes::TEXT),
]
public Field $leftEar;
#[
Label('Right Ear'),
Type(FieldTypes::TAGS),
]
public Field $rightEar;
#[
Blueprint
]
public static function elephantsBlueprint(): array
{
// DANGER: do not use kirby() or site() or page() here
// $user = kirby()->user(); // will cause issues with blueprint loading
return Ink::page(
title: 'Elephant',
columns: [
Ink::column(2 / 3)->fields([
'leftEar',
Ink::field(Ink::BLOCKS)
->label('Trunk')
->property(Ink::EMPTY, '🐘'),
'rightEar',
]),
Ink::column(1 / 3)->sections([
Ink::fields()->fields([
Ink::field(Ink::TEXT)
->label('User')
->property(Ink::PLACEHOLDER, '{{ user.nameOrEmail }} ({{ user.role.name }})'),
]),
Ink::info()
->label('Kirby Version')
->theme(Ink::INFO)
->text('{{ kirby.version }}'),
Ink::files()
->label('Files'),
]),
],
)->toArray();
}
}
#[
// load with system.loadPlugins:after hook and no cache
Blueprint(defer: true, cache: 0)
]
class ExamplePage extends \Kirby\Cms\Page {
// can be used safely to speed up all kind of blueprints
use \Bnomei\Blueprints\HasBlueprintCache;
// not recommended for dynamic blueprints
use \Bnomei\Blueprints\HasBlueprintCacheResolve;
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.