Flat Page made it easy
Create and manage flat file pages with support for translations.
Author:
Panagiotis Koursaris
Documentation
- Compatibility
- Features
- Installation
- Usage
- Using the FlatPage Facade
- Testing
- Changelog
- Contributing
- Security Vulnerabilities
- Credits
- Show your support
- License
FilamentFlatPage is a plugin for Filament that allows you to easily create and manage flat file pages with support for translations. It provides a simple way to add configurable, translatable pages to your Filament admin panel without the need for a database.
#Compatibility
| Plugin Version | Filament Version |
|---|---|
^0.1.0 |
Filament 4.x |
^0.0.1 |
Filament 3.x |
#Features
- Easily create flat file pages with customizable forms
- Requires no database; data is stored in JSON files
- Multilingual support for creating translatable content via outerweb/filament-translatable-fields
- Seamless integration with Filament admin panel
#Installation
You can install the package via composer:
composer require panakour/filament-flat-page
Optionally, you can publish the config file with:
php artisan vendor:publish --tag="filament-flat-page-config"
This will create a config/filament-flat-page.php file where you can set your preferred options:
return [
'locales' => ['en', 'fr', 'el'],
];
If you want translatable fields, add the plugin to your Filament panel:
use Outerweb\FilamentTranslatableFields\TranslatableFieldsPlugin;
$panel->plugins([
TranslatableFieldsPlugin::make()
->supportedLocales(config('filament-flat-page.locales')),
]);
Optionally, you can publish the views using
php artisan vendor:publish --tag="filament-flat-page-views"
#Usage
- Create a new page that extends
FlatPage:
<?php
namespace App\Filament\Pages;
use BackedEnum;
use UnitEnum;
use Filament\Schemas\Components\Tabs;
use Filament\Schemas\Components\Tabs\Tab;
use Filament\Schemas\Components\Section;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Panakour\FilamentFlatPage\Pages\FlatPage;
class Settings extends FlatPage
{
protected static string | BackedEnum | null $navigationIcon = 'heroicon-o-cog-6-tooth';
protected static string | UnitEnum | null $navigationGroup = 'Settings';
protected static ?string $title = 'Settings';
public function getSubheading(): ?string
{
return __('Manage your website settings');
}
public function getFileName(): string
{
return 'settings.json';
}
protected function getTranslatableFields(): array
{
return ['site_name', 'site_description', 'contact_address', 'contact_form_title', 'contact_form_content'];
}
protected function getFlatFilePageForm(): array
{
return [
Tabs::make('Settings')
->tabs([
Tab::make('General')
->icon('heroicon-o-computer-desktop')
->schema([
Section::make('App Settings')
->icon('heroicon-o-computer-desktop')
->schema([
TextInput::make('site_name')
->required()
->hint('Translatable field.')
->hintIcon('heroicon-o-language')
->label('Site Name'),
Textarea::make('site_description')
->hint('Translatable field.')
->hintIcon('heroicon-o-language')
->label('Site Description')
->rows(3),
]),
]),
Tab::make('Contact')
->icon('heroicon-o-envelope')
->schema([
Section::make('Contact Information')
->icon('heroicon-o-envelope')
->schema([
TextInput::make('contact_email')
->email()
->required()
->label('Contact Email'),
TextInput::make('contact_phone')
->tel()
->label('Contact Phone'),
Textarea::make('contact_address')
->hint('Translatable field.')
->hintIcon('heroicon-o-language')
->label('Address')
->rows(3),
]),
Section::make('Contact Form')
->schema([
TextInput::make('contact_form_title')
->hint('Translatable field.')
->hintIcon('heroicon-o-language')
->label('Contact Form Title'),
Textarea::make('contact_form_content')
->hint('Translatable field.')
->hintIcon('heroicon-o-language')
->label('Contact Form Content')
->rows(3),
]),
]),
Tab::make('Social Networks')
->icon('heroicon-o-heart')
->schema([
Section::make('Social Media Links')
->icon('heroicon-o-heart')
->schema([
TextInput::make('facebook')
->url()
->label('Facebook URL'),
TextInput::make('twitter')
->url()
->label('Twitter URL'),
TextInput::make('instagram')
->url()
->label('Instagram URL'),
TextInput::make('linkedin')
->url()
->label('LinkedIn URL'),
]),
]),
])
->columnSpan('full'),
];
}
}
-
Define your form schema in the
getFlatFilePageForm()method. -
Specify the translatable fields in the
getTranslatableFields()method. -
Set the filename for storing the flat file data in the
getFileName()method.
#Using the FlatPage Facade
You can easily access your flat file data from anywhere in your application using the FlatPage facade:
use \Panakour\FilamentFlatPage\Facades\FilamentFlatPage;
// Get a non-translatable field
$contactEmail = FilamentFlatPage::get('settings.json', 'contact_email');
// Get a translatable field (uses current locale)
$siteName = FilamentFlatPage::get('settings.json', 'site_name');
// Get a translatable field in a specific locale
$siteNameGreek = FilamentFlatPage::get('settings.json', 'site_name', 'el');
// Get all
$allSettings = FilamentFlatPage::all('settings.json');
In Blade templates, you can use it like this:
<h1>{{ \Panakour\FilamentFlatPage\Facades\FilamentFlatPage::get("page.json", "title") }}</h1>
<p>Contact Email: {{ Panakour\FilamentFlatPage\Facades\FilamentFlatPage::get('settings.json', 'contact_email') }}</p>
<p>Site Name: {{ Panakour\FilamentFlatPage\Facades\FilamentFlatPage::get('settings.json', 'site_name', 'en') }}</p>
#Testing
There is a FlatPageTest.php file where you can run to check if tests are passing
composer test
#Changelog
Please see CHANGELOG for more information on what has changed recently.
#Contributing
Please see CONTRIBUTING for details.
#Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
#Credits
#Show your support
Give a ⭐️ if you like this project or find it helpful!
#License
The MIT License (MIT). Please see License File for more information.
The author
A full-stack Software Engineer from Cyprus.
I am an experienced Software Developer with a strong background in the internet industry, working since 2012. My skills include PHP, Go programming language, relational database systems, and JavaScript frameworks such as React, Svelte, and Angular. I hold a computer science degree from the Technological Educational Institute of Western Macedonia.
Featured Plugins
A selection of plugins curated by the Filament team
Custom Dashboards
Let your users build and share their own dashboards with a drag-and-drop interface. Define your data sources in PHP and let them do the rest.
Filament
Custom Fields
Eliminate custom field migrations forever. Let your users create and manage form fields directly in Filament admin panels with 20+ built-in field types, validation, and zero database changes.
Relaticle
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese