Introduction

Introduction

Tailor website content to your exact requirements.

Tailor Tutorial

This video describes how to quickly create a complete blog solution with Tailor.

Watch the tutorial

Tailor is a feature that defines file-based content structures used by your website, such as a company blog or team page. Tailor automatically generates a backend user interface for managing records and provides CMS Components for displaying and linking records on the frontend.

When using Tailor you can skip the traditional plugin development workflow and go straight to defining content. Fields are defined simply as blueprint templates and content is stored in special database tables. The blueprint template can also specify navigation and other modifiers.

# Directory Structure

Blueprints are YAML files that reside in the app/blueprints directory by default, in addition to the themes/.../blueprints directory for a CMS theme. Where to place your blueprints depends on the context: App Blueprints are globally available, whereas Theme Blueprints are only available when that theme is selected.

# App Blueprints

Below you can see an example blueprint directory structure. Each blueprint can reside in any directory and any file name can be used. Blueprints can be organised in subdirectories of any nesting depth.

├── app | └── blueprints ← Blueprints Start Here | ├── blog | │ └── blog.yaml | │ └── author.yaml | ├── about | │ └── about.yaml | ├── wiki | │ └── article.yaml

# Theme Blueprints

Next is an example of a blueprint structure inside the demo theme. Just like in the app directory, blueprints can reside in any directory with any filename, with any nesting depth. The admin panel navigation for these blueprints will only appear when the theme is selected, often controlled by the multisite settings.

├── themes | └── demo | ├── blueprints ← Blueprints Start Here | │ └── settings.yaml | │ └── color-scheme.yaml

# Blueprint Types

The blueprint type property determines how the blueprint should be implemented. There are several types available and most blueprints will specify form field definitions.

Type Description
Entry the standard content structure that supports drafts.
Global a single record in the database and is often used for settings and configuration.
Mixin defines reusable field definitions that can be imported and mixed in with other field definitions.

Each blueprint type is described in more detail in the Blueprints article.

# Blueprint Structure

Blueprints are 100% portable. They use internal identifiers and can reside in any directory with any file name.

Blueprints are defined using the YAML syntax and will always contain three identifiers, a unique UUID, a user-friendly handle and the blueprint type. The filename and folder of a blueprint is used to organise blueprints and is not used as an identifier. All other properties are defined in the blueprint's relevant documentation article.

uuid: edcd102e-0525-4e4d-b07e-633ae6c18db6
handle: Blog\Post
type: entry
name: Post

fields:
    # [...]

The blueprint handle is a human-readable approach to referencing a blueprint object. Using the above blueprint as a reference, we can reference the entries using the handle.

Handles follow a similar naming convention to PHP namespaces and can be organised with the backslash \ separator.

[section blog]
handle = "Blog\Post"

The blueprint uuid is a unique identifier used when blueprints reference other blueprints. For example, when a field references a mixin. When first creating a blueprint, you can choose to not include a UUID and one will be magically created for you on the first migration.

_blog_content:
    source: edcd102e-0525-4e4d-b07e-633ae6c18db6
    type: mixin

# Integration with Multisite

Blueprints do not use multisite capabilities by default. You may use the multisite property to enable this. When enabled, records can be unique to each configured site.

handle: Blog\Post
type: entry
# ...
multisite: true

When multisite is enabled, all fields in the blueprint become translatable. To keep the same value for a field, set the translatable property to false. In this example, when saving the record the name field will be copied to every site when it is saved.

# ...
multisite: true

fields:
    name:
        label: Full Name
        type: text
        translatable: false

You may also set the value to sync to keep the records synchronized across sites, which is helpful for categories and tags. When using sync, each record will always exist on every site, although the content can be different.

multisite: sync

When using Site Groups, the records will be propagated to all sites within that group. This can be changed by setting the multisite property to all to sync within all sites.

multisite: all

Setting to locale will sync the records to all sites that share the same locale.

multisite: locale

# Migrating Blueprints

Blueprints and their structure are migrated in the database during the normal database migration process. When a change is made manually to a blueprint file, you should run the tailor:migrate command to update the database tables.

php artisan tailor:migrate

Blueprints are cached when debug mode is turned off. The migration command can also be used to clear the blueprint cache.

# Refreshing Content

You may delete all the content managed by Tailor using the tailor:refresh command.

php artisan tailor:refresh

To refresh a single blueprint use the --blueprint option and specify its handle.

php artisan tailor:refresh --blueprint="Blog\Post"

# Propagating Content

When using the sync option for multisite, you may retroactively propagate records using the tailor:propagate command.

php artisan tailor:propagate

To propagate a single blueprint use the --blueprint option and specify its handle.

php artisan tailor:propagate --blueprint="Blog\Category"

# Pruning Content

As a general rule Tailor will never drop table columns and delete content. If a field is removed, the column will be renamed instead of dropped. For example, an old field named content may appear as x_content_fb418fac in the database table. Tables for old blueprints are also kept in case they are ever restored.

You may prune unused database columns with the tailor:prune command. This command will also drop tables that no longer have an associated blueprint.

php artisan tailor:prune

You may only prune fields using the --fields modifier. To only prune tables, use the --tables modifier.

php artisan tailor:prune --fields
php artisan tailor:prune --tables

To prune a single blueprint use the --blueprint option and specify its handle.

php artisan tailor:prune --blueprint="Blog\Post"