goldnead / statamic-component
README
Statamic-Component is an addon to simplify the creation of separated components in Statamic that combines a bunch of logic like fieldsets & views.
This is for developers who love things DRY. The folder structure in Statamic is usually pretty simple to understand, but as soon a project grows, it can become a bit of a mess. With this addon you are able to group your component files into a single folder.
Features
The aim of this addon was to make statamic projects clearer and more organized. It does this by grouping all the files for a component into a single folder. This makes it easier to find and edit files for a component.
A Component-Folder can include:
- Antlers or Blade Templates
- Stylesheets
- Javascripts
- Fieldsets
Note: Stylesheets and Javascript files are not included by this addon as they are likely part of your own build process.
How to Install
You can search for this addon in the Tools > Addons
section of the Statamic control panel and click install, or run the following command from your project root:
composer require goldnead/statamic-component
How to Use
Creating a Component
To create a component, simply create a folder in your resources/components
folder. The name of the folder will be the name of the component.
Inside the folder, you can add any of the following files/folders:
views
- This folder can contain any number of Antlers or Blade templates. If you only have one file you might want to name it_template.antlers.html
or_template.blade.php
.fieldsets
- This folder can contain any number of fieldsets. Fieldsets are automatically namespaced to the component name. You can find and edit them in theFieldsets
section of the control panel, just as you would with regular fieldsets.<Component-Name>.php
- This file is the main component file. It must be named the same as the folder in CamelCase.
Using a Component
To use a component, you can use the {{ component }}
tag the same way as you would use the {{ partial }}
tag. In fact, the {{ component }}
tag is just an extension of the {{ partial }}
tag:
{{ component:audio-player }} {{# this will use the view located in 'resources/components/AudioPlayer/views/_template.antlers.html' #}}
Alternatively, you can use the {{ component }}
tag with the src
parameter:
{{ component src="audio-player" }}
Honeslty, that's all there is to it. You can use the {{ component }}
tag just like you would use the {{ partial }}
tag.
Configuration
Config File
You can publish the config file by running the following command from your project root:
php please vendor:publish --tag=statamic-component
This will create a statamic-component.php
file in your config/Statamic
folder. The config file contains the following options:
components_path
- The path to the components folder. This is relative to the project root. The default isresources/components
. You'll also have a handycomponent_path()
helper function to use in your PHP code.component_namespace
- This is the namespace to your components directory. This is used to autoload your components and is only used when you use a custom component Class to extend the Component class inside of your component. The default isApp\\Components
.
Fieldset Namespacing and Fieldset-Types
Namespacing
By default, fieldsets are namespaced to the component name. This means that if you have a component called audio-player
and a fieldset called settings
, the fieldset will be namespaced to audio-player.settings
.
Fieldset-Types
Fieldset types are a way to use fieldsets danymically like you would inside of a Replicator or Bard set:
{{ article }} {{ component :src="type" }} {{ /article }}
For example, if you have a component called Audio
which has a fieldsets called
track
and playlist
which are both tied to different views, you can use this approach to avoid polluting your templates with the logic of which views to connect to your views.
You can configure this inside of your <Component-Name>.php
file:
<?php namespace App\Components; use Goldnead\StatamicComponent\Component; class Audio extends Component { public $fieldsetTypes = [ // connects the 'audio_track' fieldset to the 'player' view 'audio_track' => 'player', // connects the 'audio_playlist' fieldset to the 'playlist' view 'audio_playlist' => 'playlist', ]; }
This way, you can define your article Fieldset/Blueprint like this:
title: Article fields: - handle: article field: ... sets: audio_playlist: display: 'Audio Playlist' fields: - import: 'audio::playlist' # use :: to tell statamic to look for a fieldset inside of specific namespace audio_track: display: 'Audio Track' fields: - import: 'audio::track'
Frontend Build
As stated before, this addon does not include any stylesheets or javascript build processes. This is because you are likely using your own build process.
However, here's a quick example of how you can use this addon to create a component with a stylesheet and javascript file with vite:
// resources/js/site.js import * as AudioPlayer from "../components/Audio/Player"; document.addEventListener("DOMContentLoaded", () => { AudioPlayer.init(); }); // resources/components/Audio/Player.js import "./styles/_player.scss"; export function init() { console.log("Audio Player initialized"); }
License
MIT License
Copyright (c) 2023 Goldnead
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.