PHPackages                             statikbe/laravel-filament-flexible-content-block-pages - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Admin Panels](/categories/admin)
4. /
5. statikbe/laravel-filament-flexible-content-block-pages

ActiveLibrary[Admin Panels](/categories/admin)

statikbe/laravel-filament-flexible-content-block-pages
======================================================

A simple content page management system with a flexible content block builder based on the Filament flexible content blocks package.

4.0.5(2mo ago)121.1k↓45.8%5MITPHPPHP ^8.2CI failing

Since Sep 29Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/statikbe/laravel-filament-flexible-content-block-pages)[ Packagist](https://packagist.org/packages/statikbe/laravel-filament-flexible-content-block-pages)[ Docs](https://github.com/statikbe/laravel-filament-flexible-content-block-pages)[ GitHub Sponsors](https://github.com/Statik.be)[ RSS](/packages/statikbe-laravel-filament-flexible-content-block-pages/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (42)Versions (46)Used By (0)

[![Laravel Flexible Content Block Pages banner](documentation/screenshots/banner.jpg)](documentation/screenshots/banner.jpg)

Filament Flexible Content Block Pages
=====================================

[](#filament-flexible-content-block-pages)

[![Latest Version on Packagist](https://camo.githubusercontent.com/b95b5efe5272c94d31621e69ce0bd9fb96acec9bd20db00019ec2832f00b51ae/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f73746174696b62652f6c61726176656c2d66696c616d656e742d666c657869626c652d636f6e74656e742d626c6f636b2d70616765732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/statikbe/laravel-filament-flexible-content-block-pages)[![GitHub Tests Action Status](https://camo.githubusercontent.com/afbecb2eb2d57525a1c7f86076dfbd071a6c72daed3ed3e7f1d8eca1882d4b7b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f73746174696b62652f6c61726176656c2d66696c616d656e742d666c657869626c652d636f6e74656e742d626c6f636b2d70616765732f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/statikbe/laravel-filament-flexible-content-block-pages/actions?query=workflow%3Arun-tests+branch%3Amain)[![GitHub Code Style Action Status](https://camo.githubusercontent.com/f9dc79c823dc8c2a4e12fc6d73f0c788a522ade2fb9a6ed2e9259b90c4a7f250/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f73746174696b62652f6c61726176656c2d66696c616d656e742d666c657869626c652d636f6e74656e742d626c6f636b2d70616765732f6669782d7068702d636f64652d7374796c652d6973737565732e796d6c3f6272616e63683d6d61696e266c6162656c3d636f64652532307374796c65267374796c653d666c61742d737175617265)](https://github.com/statikbe/laravel-filament-flexible-content-block-pages/actions?query=workflow%3A%22Fix+PHP+code+style+issues%22+branch%3Amain)[![Total Downloads](https://camo.githubusercontent.com/d7e070aa8915722b4798517e8a7e268a8ca62865f3ecf7482c73e4c9c6aaf4f8/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f73746174696b62652f6c61726176656c2d66696c616d656e742d666c657869626c652d636f6e74656e742d626c6f636b2d70616765732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/statikbe/laravel-filament-flexible-content-block-pages)

Filament Flexible Content Block Pages is a CMS solution for Laravel applications built on [Filament Flexible Content Blocks](https://github.com/statikbe/laravel-filament-flexible-content-blocks). This package extends the flexible content block system, into a full page management solution with routing, SEO, menus, tags and multilingual support.

Designed for developers who need a content management system that provides a lot of flexibility to fit requirements, while providing content editors with an intuitive interface for managing pages and content.

Key Features
------------

[](#key-features)

- **📄 Flexible page management** - Create pages with hero images, flexible content blocks, SEO fields, and publication controls
- **🍔 Hierarchical menu builder** - Drag-and-drop interface for creating navigation menus
- **🌍 Multilingual support** - Full localization with automatic route generation for multiple languages
- **🔍 SEO tools** - Automatic sitemap generation, meta tag management, SEO tag pages, and URL redirect handling when slugs change
- **⚡ Ready-to-use admin interface** - Pre-configured Filament panel with all resources and management tools
- **🛠️ Developer-friendly** - Extendable models &amp; tables, customizable templates, and comprehensive configuration options
- **🏷️ Content organization** - Tag system, hierarchical page structure, and settings management
- **🚀 Works out-of-the-box** - Get the package quickly up and running, while focussing on easy configuration, customisation &amp; extendability.

This package makes use of [several great open-source packages](#used-packages) to be able to bundle these features.

Table of contents
-----------------

[](#table-of-contents)

- [Installation](#installation)
    - [Laravel Filament Flexible Content Blocks](#laravel-filament-flexible-content-blocks)
    - [Laravel Localization](#laravel-localization)
    - [Laravel Tags](#laravel-tags)
- [Setup in your project](#setup-in-your-project)
    - [Translations](#translations)
    - [Routes](#routes)
    - [Filament panel](#filament-panel)
    - [Redirects](#redirects)
    - [Schedule](#schedule)
- [Page management](#page-management)
    - [Features](#features)
    - [Creating Pages](#creating-pages)
    - [Page Hierarchy](#page-hierarchy)
    - [Publication Controls](#publication-controls)
    - [Multilingual Support](#multilingual-support)
    - [Frontend Integration](#frontend-integration)
- [Menu builder](#menu-builder)
    - [Features](#features-1)
    - [Adding a menu to Blade](#adding-a-menu-to-blade)
    - [Adding linkable models](#adding-linkable-models)
    - [Menu seeding](#menu-seeding)
- [Settings](#settings)
    - [Use settings](#use-settings)
- [Routing](#routing)
    - [URL Structure](#url-structure)
    - [Route Registration](#route-registration)
    - [Generating URLs](#generating-urls)
    - [Route Helpers](#route-helpers)
- [Redirects](#redirects-1)
    - [Redirect middleware configuration](#redirect-middleware-configuration)
- [Sitemap Generator](#sitemap-generator)
    - [Features](#features-2)
    - [Usage](#usage)
    - [Automatic Generation](#automatic-generation)
- [Tags and SEO Tag Pages](#tags-and-seo-tag-pages)
    - [Features](#features-3)
    - [Tag Management](#tag-management)
    - [Tag Types](#tag-types)
    - [SEO Tag Pages](#seo-tag-pages)
- [Authorisation](#authorisation)
- [Configuration](#configuration)
- [TODO's](#todos)
- [Future work](#future-work)
- [Development](#development)
- [Changelog](#changelog)
- [Contributing](#contributing)
- [Security Vulnerabilities](#security-vulnerabilities)
- [Credits](#credits)
    - [Used packages](#used-packages)
- [License](#license)

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require statikbe/laravel-filament-flexible-content-block-pages
```

**Note:** AI agents are quite good with interpreting the installation instructions below ;-).

Publish the config file with:

```
php artisan vendor:publish --tag="filament-flexible-content-block-pages-config"
```

If you want to alter the names of the database tables, do so in the config file, **before running the migrations**.

You can publish and run the migrations with:

```
php artisan vendor:publish --tag="filament-flexible-content-block-pages-migrations"
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"
php artisan migrate
```

Configure the CSS styling of the frontend by adding these lines to the CSS file of your frontend:

```
@source "../../vendor/statikbe/laravel-filament-flexible-content-block-pages/**/*.blade.php";
@source "../../vendor/statikbe/laravel-filament-flexible-content-blocks/**/*.blade.php";
@source "../../config/filament-flexible-content-blocks.php";
```

In the Tailwind CSS of your Filament back-end (probably `resources/css/filament/admin/theme.css`), add the following lines:

```
@source "../../vendor/statikbe/laravel-filament-flexible-content-block-pages/**/*.blade.php";
@source "../../vendor/statikbe/laravel-filament-flexible-content-blocks/**/*.blade.php";
@source "../../config/filament-flexible-content-blocks.php";
@source "../../vendor/solution-forest/filament-tree/resources/**/*.blade.php";
```

You can now seed the home page and default settings by running:

```
php artisan flexible-content-block-pages:seed
```

Further configure the [third-party packages that are used](#used-packages). Check the installation documentation of the following packages:

### Laravel Filament Flexible Content Blocks

[](#laravel-filament-flexible-content-blocks)

Probably, you will want to tweak the configuration of the Flexible blocks package. Publish the configuration using [the installation guide](https://github.com/statikbe/laravel-filament-flexible-content-blocks?tab=readme-ov-file#installation).

### Laravel Localization

[](#laravel-localization)

Follow [the installation](https://github.com/mcamara/laravel-localization?tab=readme-ov-file#installation)and make sure the middlewares are properly set up if you want to use localised routes.

### Laravel Tags

[](#laravel-tags)

Follow [the installation](https://spatie.be/docs/laravel-tags/v4/installation-and-setup)and publish the config and change the tag model to the package model:

```
[
    'tag_model' => \Statikbe\FilamentFlexibleContentBlockPages\Models\Tag::class,
]
```

Check [the configuration documentation](#configuration) for more explanations on how to tweak the package.

Most likely you want to publish the views, so you can customise it for your project:

```
php artisan vendor:publish --tag="filament-flexible-content-block-pages-views"
```

Setup in your project
---------------------

[](#setup-in-your-project)

### Translations

[](#translations)

If you want translated content and routes, go through the following steps:

1. Configure the `supported_locales` in [the Filament Flexible Content Blocks configuration or in a service provider](https://github.com/statikbe/laravel-filament-flexible-content-blocks/blob/main/documentation/configuration.md#supported-locales)
2. Configure the `route_helper` in [`filament-flexible-content-block-pages.php`](./config/filament-flexible-content-block-pages.php)

If you want to translate the labels, please publish the translation files:

```
php artisan vendor:publish --tag="filament-flexible-content-block-pages-translations"
```

### Routes

[](#routes)

Register the routes in your route file, probably `web.php`. Best at the bottom of the file, since the pages routes with slugs will catch many urls.

```
\Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages::routes();
```

**Note:** If you are using mcamara/laravel-localization for other routes, you need to put the above line OUTSIDE of the laravel-localization middleware group. The middleware is already included in `FilamentFlexibleContentBlockPages::routes()`.

### Filament panel

[](#filament-panel)

The package contains a pre-configured panel. You can register the panel in the `bootstrap\providers.php` configuration file.

```
return [
    // ...
    \Statikbe\FilamentFlexibleContentBlockPages\FlexibleContentBlockPagesPanel::class,
    // ...
],
```

If you want you can build your own panel from the provided resources.

### Redirects

[](#redirects)

Add the redirect middleware, see [Redirect configuration](#redirect-middleware-configuration)

### Schedule

[](#schedule)

We suggest to add media library maintenance tasks to your schedule in `routes/console.php`:

```
Schedule::command('media-library:clean')
    ->weeklyOn(1, '11:00');
Schedule::command('media-library:regenerate --only-missing')
    ->dailyAt('4:20');
```

Page management
---------------

[](#page-management)

The package provides a comprehensive page management system built on flexible content blocks.

[![Page blocks screenshot](documentation/screenshots/page-blocks.png)](documentation/screenshots/page-blocks.png)

### Features

[](#features)

- **Flexible content creation** - Rich page editor with hero sections, flexible content blocks, and media integration
- **Hierarchical organization** - Three-level page structure (parent → child → grandchild) with automatic URL generation
- **Publication workflow** - Draft/published status with optional scheduling (`publishing_begins_at`/`publishing_ends_at`)
- **Multilingual support** - Full translation support, including slug localization
- **SEO optimization** - Built-in meta tags, Open Graph, Twitter cards, and structured data
- **Author system** - Optional author assignment and attribution
- **Media management** - Hero images, content images, and SEO images via [Spatie Media Library](https://github.com/spatie/laravel-medialibrary)
- **Template system** - Custom page templates with fallback support
- **Protected pages** - Undeletable flag for critical pages
- **Replicate pages** - Duplicate a page from the edit page or table (disable in config)
- **Search &amp; filtering** - Full-text search across page content, ready for [Laravel Scout](https://laravel.com/docs/12.x/scout)

### Creating Pages

[](#creating-pages)

[![Page general tab screenshot](documentation/screenshots/page-general.png)](documentation/screenshots/page-general.png)

Create new pages through the Filament admin interface with a multi-tab form:

- **Content Tab** - Title, slug, intro, and flexible content blocks
- **Hero Tab** - Hero image, optional video and call-to-action buttons
- **Publication Tab** - Status, scheduling, and author assignment
- **SEO Tab** - Meta tags, Open Graph, and Twitter card settings
- **Advanced Tab** - Manage the slug, publication dates, page code and undeletable toggle.

Pages use automatic slug generation from the title but can be manually overridden for custom URLs.

### Page Hierarchy

[](#page-hierarchy)

[![Page tree screenshot](documentation/screenshots/page-hierarchy.png)](documentation/screenshots/page-hierarchy.png)

Create organized page structures with automatic URL generation:

```
Homepage (/)
├── About (/about)
│   ├── Team (/about/team)
│   └── History (/about/history)
└── Services (/services)
    ├── Web Development (/services/web-development)
    │   └── Laravel (/services/web-development/laravel)
    └── Consulting (/services/consulting)

```

On the list page, there is an action to manage the page hierarchy via drag and drop.

You can configure hierarchy support in your [configuration file](documentation/configuration.md#page-resource-configuration). In case you need deeper nesting, you can add extra routes.

### Publication Controls

[](#publication-controls)

Control page visibility with by setting publishing begin and end dates. So you can achieve the following statuses by setting these dates in the past or future:

- **Draft** - Page exists but not visible to public users
- **Published** - Page is live and accessible via URL
- **Scheduled** - Automatically publish/unpublish at specific times
- **Preview** - Unpublished pages can be previewed, but are shielded by [a configurable authorisation gate](./documentation/configuration.md#page-resource-configuration).

Use the `published()` scope in your queries to show only published content:

```
$pages = Page::published()->get();
```

### Multilingual Support

[](#multilingual-support)

When using the `LocalisedPageRouteHelper` ([see configuration](./documentation/configuration.md#route-helper)), pages automatically support multiple languages:

- **Translated content** - All text fields support per-locale content
- **Localized URLs** - Each language gets its own slug (e.g., `/en/about`, `/nl/over-ons`)
- **Content blocks** - Flexible content blocks are fully translatable
- **SEO per language** - Meta tags and descriptions for each locale

The content can be copied between languages using the built-in "Copy to locales" action in the content blocks editor.

There is also a language switch component, that provides a simple way to navigate to another locale. For customisation, publish the views and if needed extend the [LanguageSwitch component](src/Components/LanguageSwitch.php).

### Frontend Integration

[](#frontend-integration)

You can best publish the views and customise the styling and HTML structure to your project requirements.

For detailed frontend templating, theme customization, and available Blade components, see the [frontend documentation](documentation/frontend.md).

For advanced page customization, extending models, and custom workflows, see the [extending documentation](documentation/extending-and-customisation.md).

Menu builder
------------

[](#menu-builder)

The package includes a powerful hierarchical menu builder with a drag-and-drop interface, using [solution-forest/filament-tree](https://github.com/solutionforest/filament-tree). Menus support multiple types of links and can be easily styled with custom templates.

### Features

[](#features-1)

- **Hierarchical structure** - With configurable max depth per menu
- **Multiple link types** - Internal routes, external URLs, and linkable models (Pages or your own project models)
- **Drag &amp; drop management** - Intuitive tree interface for reordering and nesting items
- **Translation support** - Multilingual menu labels with locale-aware URLs
- **Conditional visibility** - Show/hide menu items without deleting them
- **Icon support** - Optional icons for menu items (basic implementation currently)
- **Dynamic labels** - Use model titles or custom labels for linked content
- **Caching** - Menus are cached for the best performance

[![Menu builder](documentation/screenshots/menu.png)](documentation/screenshots/menu.png)

### Adding a menu to Blade

[](#adding-a-menu-to-blade)

The package includes a `default` built-in menu style which is developed in a generic way so that you can tweak its styling, by passing some attributes without having to publish the corresponding blade templates.

Example usage to have a horizontal menu using tailwind:

```

```

See the file `../tailwind/components/menu/default.blade.php` for all possible attributes.

### Adding linkable models

[](#adding-linkable-models)

To make your models available in the menu builder, add them to the configuration:

```
// config/filament-flexible-content-block-pages.php
'menu' => [
    'linkable_models' => [
        \App\Models\Page::class,
        \App\Models\Product::class,
        \App\Models\Category::class,
    ],
],
```

Your models should implement the `[HasMenuLabel](src/Models/Contracts/HasMenuLabel.php)` contract and the [HasMenuItemTrait](src/Models/Concerns/HasMenuItemTrait.php) trait:

```
use Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts\HasMenuLabel;
use Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns\HasMenuItemTrait;

class Product extends Model implements HasMenuLabel
{
    use HasMenuItemTrait;

    public function getMenuLabel(?string $locale = null): string
    {
        return $this->getTranslation('name', $locale ?? app()->getLocale());
    }
}
```

**Tip:** If you are using the Flexible Content Blocks title trait in your model, you can implement `HasMenuLabel`easily with [`HasTitleMenuLabelTrait`](src/Models/Concerns/HasTitleMenuLabelTrait.php).

**Note:** The menu data is cached for better page load performance. The cache is cleared with model observers, when the menu is updated or deleted.

### Menu seeding

[](#menu-seeding)

It makes a lot of sense to create most of the menus in seeders, so they can be automatically synced over different environments. See the [menu seeding documentation](documentation/seeders.md) for programmatic menu creation.

For creating custom menu styles and advanced menu customization, see the [menu customization documentation](documentation/extending-and-customisation.md#menu).

Settings
--------

[](#settings)

All settings are stored in one table in one record. The reason is to be able to add spatie medialibrary media as a config value. By using one record and a new media collection for each media setting, you can more easily add media. Furthermore, by manually adding a specific column for a setting, the data types are also correct and castable. In contrast, if we would use a key-value or JSON-based solution, not all our requirements could be served.

Each setting is cached and refreshed when the settings change.

### Use settings

[](#use-settings)

Access settings values using helper functions or static methods:

```
use Statikbe\FilamentFlexibleContentBlockPages\Models\Settings;

// Helper functions (recommended)
$siteTitle = flexiblePagesSetting(Settings::SETTING_SITE_TITLE);
$contactInfo = flexiblePagesSetting(Settings::SETTING_CONTACT_INFO, 'en', 'info@statik.be');
$seoImageUrl = flexiblePagesSettingImageUrl(Settings::COLLECTION_DEFAULT_SEO, Settings::CONVERSION_DEFAULT_SEO);

// Static methods
$siteTitle = Settings::setting(Settings::SETTING_SITE_TITLE);
$seoImageHtml = Settings::imageHtml(Settings::COLLECTION_DEFAULT_SEO, Settings::CONVERSION_DEFAULT_SEO);
$settings = Settings::getSettings();
```

To add custom settings fields and extend the settings functionality, see the [settings extension documentation](documentation/extending-and-customisation.md#settings).

Routing
-------

[](#routing)

The package provides a flexible routing system that supports hierarchical page structures and multilingual sites.

### URL Structure

[](#url-structure)

Pages are organized in a three-level hierarchy:

- **Root pages**: `/about`, `/contact`
- **Child pages**: `/services/web-development`
- **Grandchild pages**: `/services/web-development/laravel`

### Route Registration

[](#route-registration)

Register the package routes in your `web.php` file. Place this at the **bottom** of your routes file since page routes with slugs will catch many URLs:

```
// At the bottom of routes/web.php
\Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages::routes();
```

If you want to implement a custom home page route, you can [configure this](./documentation/configuration.md#enable-home-page-route).

### Generating URLs

[](#generating-urls)

Use the facade to generate URLs for pages:

```
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;

// Generate URL for a page
$url = FilamentFlexibleContentBlockPages::getUrl($page);

// Generate URL for a specific locale
$url = FilamentFlexibleContentBlockPages::getUrl($page, 'en');

// OR there is a shorthand helper:
flexiblePageUrl($page, 'nl');
```

In Blade templates:

```

    {{ $page->getTitle() }}

```

### Route Helpers

[](#route-helpers)

The package includes two route helper implementations:

- **`PageRouteHelper`**: For non-multilingual sites with simple URLs
- **`LocalisedPageRouteHelper`**: For multilingual sites with localized URLs (e.g., `/en/about`, `/nl/over-ons`)

Configure which helper to use in your [configuration file](documentation/configuration.md#route-helper).

For advanced routing customization, custom route helpers, and controller extensions, see the [routing customization documentation](documentation/extending-and-customisation.md#routes).

Redirects
---------

[](#redirects-1)

The package includes automatic redirect management: when the slug of a page changes, a redirect from the old page to the new page is added. These redirects are stored in the database and are manageable with the Filament resource, so you can add your own redirects. For example, you can add handy redirects for marketing campaigns or quick links.

We have integrated [spatie/laravel-missing-page-redirector](https://github.com/spatie/laravel-missing-page-redirector), so you can easily configure other redirects in the Spatie package's config.

### Redirect middleware configuration

[](#redirect-middleware-configuration)

1. Prepend/append the [RedirectsMissingPages.php](src/Http/Middleware/RedirectsMissingPages.php) middleware to your global middleware stack:

```
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->append([
        \Statikbe\FilamentFlexibleContentBlockPages\Http\Middleware\RedirectsMissingPages::class,
    ]);
})
```

2. **Optional:** If you want to hardcode a set of redirects, you can [do this in the config file of the spatie package](https://github.com/spatie/laravel-missing-page-redirector?tab=readme-ov-file#usage). Publish this package:

```
php artisan vendor:publish --provider="Spatie\MissingPageRedirector\MissingPageRedirectorServiceProvider"
```

Sitemap Generator
-----------------

[](#sitemap-generator)

The package includes an automatic sitemap generator that creates XML sitemaps for your website with support for multilingual sites and various content types.

### Features

[](#features-2)

- **Multiple generation methods** - Manual, crawling, or hybrid approach
- **Multilingual support** - Automatic hreflang tags for alternate language versions
- **Smart priority calculation** - Homepage gets priority 1.0, parent pages 0.8, child pages 0.6
- **Dynamic change frequency** - Based on last modification date (weekly, monthly, yearly)
- **Flexible content inclusion** - Pages, routes, linkable models, and custom URLs
- **URL exclusion patterns** - Skip specific URLs or patterns from the sitemap

### Usage

[](#usage)

Make sure the sitemap is enabled in the [configuration](documentation/configuration.md#sitemap-configuration). Generate the sitemap manually by running:

```
php artisan flexible-content-block-pages:generate-sitemap
```

The sitemap will be saved to `public/sitemap.xml` and can be accessed at `https://yoursite.com/sitemap.xml`.

### Automatic Generation

[](#automatic-generation)

You can schedule automatic sitemap generation in your `routes/console.php`:

```
$schedule->command('flexible-content-block-pages:generate-sitemap')
         ->daily()
         ->at('03:00');
```

For advanced configuration options, generation methods, linkable models setup, and extending the sitemap generator service, see the [sitemap customisation documentation](documentation/extending-and-customisation.md#sitemap).

Tags and SEO Tag Pages
----------------------

[](#tags-and-seo-tag-pages)

The package provides a comprehensive tagging system with SEO-optimized tag pages for content organization and search engine visibility. We make use of [Laravel Tags](https://github.com/spatie/laravel-tags) so all features of this spatie package are available. While spatie uses a string for tag type, we have implemented a TagType model with extra SEO and styling functionality.

### Features

[](#features-3)

- **Hierarchical tag system** - Tags organized by customizable tag types (categories, topics, etc.)
- **Multilingual support** - Translatable tag names, slugs, and SEO descriptions
- **SEO tag pages** - Automatically generated landing pages with all content of a tag for search engine optimization
- **Visual organization** - Custom colors and icons for tag types
- **Flexible routing** - Customizable URL patterns for tag pages (default: `/tag/{slug}`)

### Tag Management

[](#tag-management)

Create and manage tags through the Filament admin interface:

- **Tag Types** - Define categories like "Topics", "Industries", or "Technologies"
- **Tags** - Individual tags within each type with multilingual support
- **SEO Settings** - Meta descriptions and tags can be enabled to have an SEO tag page
- **Visual Identity** - Colors and icons for better organization

[![Tag management](documentation/screenshots/tags.png)](documentation/screenshots/tags.png)

### Tag Types

[](#tag-types)

Tag types provide structure and organization. You can add more specific tag types, e.g. for news articles only.

```
// Built-in tag types
TagType::TYPE_DEFAULT = 'default';  // General purpose tags
TagType::TYPE_SEO = 'seo';         // SEO-focused tags with landing pages
```

**Key features:**

- **Default type** - One tag type can be marked as default for new tags
- **SEO pages** - Enable `has_seo_pages` to generate landing pages for tags of this type and an SEO description can be filled in that will be shown on the tag page for more context.
- **Visual styling** - Custom colors and SVG icons for admin interface
- **Translatable names** - Support for multiple languages

### SEO Tag Pages

[](#seo-tag-pages)

When enabled (`has_seo_pages = true` on tag type), the package automatically generates SEO-optimized landing pages. The HTML of the tag pages is focused on the data structure for search engines and is not styled. If you also want to use this for other purposes, you can publish the views and style it.

**Content Inclusion:**SEO tag pages display content from models configured in [`tag_pages.models.enabled`](documentation/configuration.md#tag-pages-configuration):

```
// config/filament-flexible-content-block-pages.php
'tag_pages' => [
    'models' => [
        'enabled' => [
            \Statikbe\FilamentFlexibleContentBlockPages\Models\Page::class,
            \App\Models\BlogPost::class,  // Your custom models
        ],
    ],
],
```

**SEO Benefits:**

- Automatic meta tags and descriptions
- Multilingual hreflang tags
- Content grouping by type or chronologically
- Pagination for large content sets
- Search engine friendly HTML structure
- Tag pages are added to the sitemap

For advanced tag page customization, extending models, custom controllers, and template customization, see the [SEO tag pages documentation](documentation/extending-and-customisation.md#seo-tag-pages).

For tag configuration options, URL patterns, and content inclusion settings, see the [configuration documentation](documentation/configuration.md#tags-configuration).

Authorisation
-------------

[](#authorisation)

Authorisation setup is not included in this package. Most projects will use an authorisation strategy project-wide, e.g. via policies.

However, authorisation can be easily implemented. There are two easy strategies:

1. Use the panel and implement a simple access rule for the panel on the user model in `canAccessPanel(Panel $panel)`.
2. Remove the unwanted resources from the `resources` configuration.
3. Use a Filament authorisation library, like [Filament Shield](https://github.com/bezhanSalleh/filament-shield). Shield can automatically generate policies with permissions that you can link to specific roles.

Configuration
-------------

[](#configuration)

The package provides extensive configuration options to customize models, resources, database tables, and various features. You can modify the published configuration file to match your application's requirements.

For detailed configuration options and examples, see the [configuration documentation](documentation/configuration.md).

If you want to further customise or extend the functionality, have a look [at the options](documentation/extending-and-customisation.md).

Future work
-----------

[](#future-work)

- Add menu item for subtitle in menus.
- A model to store re-usable content blocks, e.g. to create a marketing banner that can be reused on many pages, and edited once.
- Contact form
- FAQ model, resource and flexible blocks
- A component to put on the pages with a quick link to edit this page in Filament
- A trait for page indexing in Laravel Scout
- Improve installation &amp; setup: create an install command

Development
-----------

[](#development)

To update all table of content sections in the documentation files, run:

```
update_toc.sh
```

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

Please review [our security policy](../../security/policy) on how to report security vulnerabilities.

Credits
-------

[](#credits)

- [Sten Govaerts](https://github.com/sten)
- [Kristof Serré](https://github.com/kristofser)
- [Aurel Demiri](https://github.com/AurelDemiri)
- [All Contributors](../../contributors)

### Used packages

[](#used-packages)

We built this on the shoulders of others by combining several Laravel packages into a cohesive CMS solution, making it opinionated. We would like to thank the developers and contributors of the following packages:

- [artesaos/seotools](https://github.com/artesaos/seotools)
- [guava/filament-icon-picker](https://github.com/lukas-frey/filament-icon-picker)
- [mcamara/laravel-localization](https://github.com/mcamara/laravel-localization)
- [solution-forest/filament-tree](https://github.com/solutionforest/filament-tree)
- [spatie/laravel-missing-page-redirector](https://github.com/spatie/laravel-missing-page-redirector)
- [spatie/laravel-sitemap](https://github.com/spatie/laravel-sitemap)
- [spatie/laravel-tags](https://github.com/spatie/laravel-tags)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

52

—

FairBetter than 96% of packages

Maintenance89

Actively maintained with recent releases

Popularity29

Limited adoption so far

Community17

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor1

Top contributor holds 89.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~4 days

Total

39

Last Release

61d ago

Major Versions

3.0.0 → 4.0.02026-02-12

3.0.1 → 4.0.12026-02-18

3.0.2 → 4.0.22026-02-19

3.1.2 → 4.0.32026-02-24

v3.x-dev → 4.0.42026-03-06

### Community

Maintainers

![](https://www.gravatar.com/avatar/1250437446b84017407f7f1900194b1e1c93fcf34b332ba382fb77f69b251cb6?d=identicon)[statikbe](/maintainers/statikbe)

---

Top Contributors

[![sten](https://avatars.githubusercontent.com/u/180665?v=4)](https://github.com/sten "sten (523 commits)")[![lukasdewijn](https://avatars.githubusercontent.com/u/146429694?v=4)](https://github.com/lukasdewijn "lukasdewijn (24 commits)")[![AurelDemiri](https://avatars.githubusercontent.com/u/30560661?v=4)](https://github.com/AurelDemiri "AurelDemiri (15 commits)")[![kristofser](https://avatars.githubusercontent.com/u/5928907?v=4)](https://github.com/kristofser "kristofser (9 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (8 commits)")[![vanneszias](https://avatars.githubusercontent.com/u/178904621?v=4)](https://github.com/vanneszias "vanneszias (3 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (2 commits)")[![ferdbold](https://avatars.githubusercontent.com/u/2939098?v=4)](https://github.com/ferdbold "ferdbold (2 commits)")[![sigridviaene](https://avatars.githubusercontent.com/u/20278988?v=4)](https://github.com/sigridviaene "sigridviaene (1 commits)")

---

Tags

laravelstatikbelaravel-filament-flexible-content-block-pages

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/statikbe-laravel-filament-flexible-content-block-pages/health.svg)

```
[![Health](https://phpackages.com/badges/statikbe-laravel-filament-flexible-content-block-pages/health.svg)](https://phpackages.com/packages/statikbe-laravel-filament-flexible-content-block-pages)
```

###  Alternatives

[guava/filament-knowledge-base

A filament plugin that adds a knowledge base and help to your filament panel(s).

206120.5k1](/packages/guava-filament-knowledge-base)[ralphjsmit/laravel-filament-seo

A package to combine the power of Laravel SEO and Filament Admin.

15398.7k10](/packages/ralphjsmit-laravel-filament-seo)[a2insights/filament-saas

Filament Saas for A2Insights

161.1k](/packages/a2insights-filament-saas)[vormkracht10/laravel-mails

Laravel Mails can collect everything you might want to track about the mails that has been sent by your Laravel app.

24149.7k](/packages/vormkracht10-laravel-mails)[statikbe/laravel-filament-chained-translation-manager

A translation manager tool for Laravel Filament, that makes use of the Laravel Chained Translator.

92108.7k](/packages/statikbe-laravel-filament-chained-translation-manager)[geo-sot/filament-env-editor

Access .env file though Filament admin panel

2432.3k1](/packages/geo-sot-filament-env-editor)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
