PHPackages                             itineris/sage-flbuilder - 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. itineris/sage-flbuilder

ActiveLibrary

itineris/sage-flbuilder
=======================

x

0.15.7(9mo ago)149.8k↓43.8%[1 PRs](https://github.com/ItinerisLtd/sage-flbuilder/pulls)proprietaryPHPPHP ^8.1

Since Mar 12Pushed 4mo ago11 watchersCompare

[ Source](https://github.com/ItinerisLtd/sage-flbuilder)[ Packagist](https://packagist.org/packages/itineris/sage-flbuilder)[ RSS](/packages/itineris-sage-flbuilder/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (6)Versions (59)Used By (0)

itineris/sage-flbuilder
=======================

[](#itinerissage-flbuilder)

- [Minimum Requirements](#minimum-requirements)
- [Installation](#installation)
- [Rules](#rules)
- [Caveats](#caveats)
    - [Module Names](#module-names)
- [Customizing `PostGrid`](#customizing-postgrid)
    - [Templates](#templates)
    - [Subclass](#subclass)
- [Usage - Minimum](#usage---minimum)
    - [Step 1 - Define helper class](#step-1---define-helper-class)
    - [Step 2](#step-2)
- [Usage - Custom PHP Module](#usage---custom-php-module)
    - [Step 1 - Define module class](#step-1---define-module-class)
    - [Step 2 - Frontend Template](#step-2---frontend-template)
    - [Step 3 - Add custom module into `SageFLBuilder`](#step-3---add-custom-module-into-sageflbuilder)
- [Usage - Custom Blade Module](#usage---custom-blade-module)
    - [Step 1 - Inherit from `AbstractBladeModule`.](#step-1---inherit-from-abstractblademodule)
    - [Step 2 - Frontend Template](#step-2---frontend-template-1)
    - [Step 3](#step-3)
- [Usage - Custom Settings](#usage---custom-settings)
    - [Step 1 - Define Setting Class](#step-1---define-setting-class)
    - [Step 2](#step-2-1)
- [Usage - Extra Settings](#usage---extra-settings)
- [Usage - Exclude Default Modules / Settings](#usage---exclude-default-modules--settings)
- [Migrating from Fabric](#migrating-from-fabric)

Minimum Requirements
--------------------

[](#minimum-requirements)

- PHP v7.1
- Sage v9.0.0-beta.4
- illuminate/support v5.4
- Advanced Custom Fields PRO v5.6.9
- Beaver Builder Plugin (Pro Version) v2.1.1.1
- Beaver Themer v1.1.1
- Gravity Forms v2.2.6.5

You must ensure these 3 required plugins installed via Bedrock's composer.json.

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

[](#installation)

```
➜ composer require itineris/sage-flbuilder
```

Rules
-----

[](#rules)

- Follow [PSR-4](https://www.php-fig.org/psr/psr-4/)
- Follow [PSR-1](https://www.php-fig.org/psr/psr-1/)
- Do not copy and paste from default modules - huge technical debt in this package
- Do not use `God` class - it is pure technical debt

Caveats
-------

[](#caveats)

### Module Names

[](#module-names)

Beaver Builder can't accept 2 modules with the same file name even they follow PSR-4.

For example, these 3 modules conflict each other:

- `vendor/itineris/sage-flbuilder/src/Modules/Button/Button.php`
- `app/Plugins/FLBuilder/Modules/BrainHouse/Button/Button.php`
- `app/Plugins/FLBuilder/Modules/Trinity/Button/Button.php`

Solution - Use unique class names:

- `vendor/itineris/sage-flbuilder/src/Modules/Button/Button.php`
- `app/Plugins/FLBuilder/Modules/BrainHouseButton/BrainHouseButton.php`
- `app/Plugins/FLBuilder/Modules/TrinityButton/TrinityButton.php`

Customizing `PostGrid`
----------------------

[](#customizing-postgrid)

### Templates

[](#templates)

**Deprecated:** Prior to v0.5.0, `PostGrid::DIR` is used to locate template directory. This is replaced with `AbstractHelper::getPostGridTemplateDir`.

Filter bar and post theme templates are customizable in projects, both Blade and normal `.php` are supported.

For example:

```
➜ tree web/app/themes/greenwich/app/Plugins/FLBuilder
web/app/themes/greenwich/app/Plugins/FLBuilder
├── Helper.php
└── post-grid
    ├── filter-bar-event.blade.php
    ├── filter-bar.php
    ├── post-theme-event.blade.php
    ├── post-theme-product.php
    └── post-theme.blade.php
```

```
class Helper extends AbstractHelper
{
    /**
     * Full path to PostGrid template directory.
     *
     * @return string
     */
    public function getPostGridTemplateDir(): string
    {
        return __DIR__ . '/post-grid';
    }
}
```

### Subclass

[](#subclass)

**Important:** Overriding `PostGrid` is not recommended. Tweak your project to fit in default `PostGrid` whenever possible.

If you must override `PostGrid` with a subclass **as a last resort**, you have to put it into Sage's container **after** `SageFLBuilder::init`:

```
use App\Plugins\FLBuilder\Settings\PostGrid;
use Itineris\SageFLBuilder\Settings\PostGrid as SageFLBuilderPostGrid;

$sageFLBuilder->add(PostGrid::class)
              ->remove(SageFLBuilderPostGrid::class)
              ->init();

sage()->bind(SageFLBuilderPostGrid::class, PostGrid::class);

```

Usage - Minimum
---------------

[](#usage---minimum)

### Step 1 - Define helper class

[](#step-1---define-helper-class)

```
namespace App\Plugins\FLBuilder;

use Itineris\SageFLBuilder\AbstractHelper;

class Helper extends AbstractHelper
{
    // Implement all abstract methods.
}
```

### Step 2

[](#step-2)

Within `app/setup.php` / `app/farbic.php`:

```
use App\Plugins\FLBuilder\Helper;
use Itineris\SageFLBuilder\SageFLBuilder;

$sageFLBuilder = new SageFLBuilder(
    new Helper()
);

$sageFLBuilder->init();
```

Tips: Put these lines into a class method.

Usage - Custom PHP Module
-------------------------

[](#usage---custom-php-module)

### Step 1 - Define module class

[](#step-1---define-module-class)

See:

```
namespace App\Plugins\FLBuilder\Modules\RunnerBlock;

use Itineris\SageFLBuilder\AbstractModule;
use Itineris\SageFLBuilder\AbstractHelper;

class RunnerBlock extends AbstractModule
{
    /**
     * Register the module and its form settings.
     * If needed, register a settings form to use in the "form" field type.
     */
    public static function register(): void
    {
        // Invoke `\FLBuilder::register_module` here
        // Invoke `\FLBuilder::register_settings_form` here
    }

    public function __construct()
    {
        /** @var AbstractHelper $helper */
        $helper = sage(AbstractHelper::class);

        parent::__construct([
            'name' => __('Runner block', 'fabric'),
            'description' => __('Runner block widget', 'fabric'),
            'category' => 'Basic',
            'group' => $helper->getModuleGroup(),
            'dir' => __DIR__,
            'url' => $helper->assetPath(__DIR__),
            'icon' => 'layout.svg',
        ]);
    }
}
```

### Step 2 - Frontend Template

[](#step-2---frontend-template)

Create `includes/frontend.php`:

```
/app/Plugins/FLBuilder/Modules
└── RunnerBlock
   ├── RunnerBlock.php
   └── includes
       └── frontend.php

```

### Step 3 - Add custom module into `SageFLBuilder`

[](#step-3---add-custom-module-into-sageflbuilder)

```
use App\Plugins\FLBuilder\Helper;
use App\Plugins\FLBuilder\Modules\RunnerBlock\RunnerBlock;
use Itineris\SageFLBuilder\SageFLBuilder;

$sageFLBuilder = new SageFLBuilder(
    new Helper()
);

$sageFLBuilder->add(RunnerBlock::class)
              ->init();
```

Usage - Custom Blade Module
---------------------------

[](#usage---custom-blade-module)

Similar to custom PHP module.

### Step 1 - Inherit from `AbstractBladeModule`.

[](#step-1---inherit-from-abstractblademodule)

```
namespace App\Plugins\FLBuilder\Modules\BladeRunnerBlock;

use Itineris\SageFLBuilder\AbstractBladeModule;

class BladeRunnerBlock extends AbstractBladeModule
{
    // Similar to custom PHP module
}
```

### Step 2 - Frontend Template

[](#step-2---frontend-template-1)

Create `includes/frontend.blade.php`:

```
/app/Plugins/FLBuilder/Modules
└── BladeRunnerBlock
   ├── BladeRunnerBlock.php
   └── includes
       └── frontend.blade.php

```

### Step 3

[](#step-3)

```
$sageFLBuilder->add(RunnerBlock::class, BladeRunnerBlock::class)
              ->init();
```

Usage - Custom Settings
-----------------------

[](#usage---custom-settings)

### Step 1 - Define Setting Class

[](#step-1---define-setting-class)

```
namespace App\Plugins\FLBuilder\Settings;

use Itineris\SageFLBuilder\InitializableInterface;

class MySetting implements InitializableInterface
{
    // Implement all required methods.
}
```

### Step 2

[](#step-2-1)

```
$sageFLBuilder->add(RunnerBlock::class, BladeRunnerBlock::class, MySetting::class)
              ->init();
```

Usage - Extra Settings
----------------------

[](#usage---extra-settings)

The following settings are disabled by default:

- [`ProductsArchive`](./src/Settings/ProductsArchive.php)
- [`FourOFourThemeLayout`](./src/Settings/ThemeLayouts/FourOFourThemeLayout.php)
- [`SearchThemeLayout`](./src/Settings/ThemeLayouts/SearchThemeLayout.php)
- [`WooCommerceThemeLayout`](./src/Settings/ThemeLayouts/WooCommerceThemeLayout.php)

To enable them:

```
// Example: Enabling `FourOFourThemeLayout`
$sageFLBuilder->add(FourOFourThemeLayout::class)
              ->init();
```

Usage - Exclude Default Modules / Settings
------------------------------------------

[](#usage---exclude-default-modules--settings)

```
$sageFLBuilder->add(RunnerBlock::class, BladeRunnerBlock::class, MySetting::class)
              ->remove(FilterBar::class, EventsArchive::class)
              ->init();
```

Migrating from Fabric
---------------------

[](#migrating-from-fabric)

Since `sage-flbuilder` uses PSR-4 while `Fabric` doesn't, module names are changed. When migrating from `Fabric`, you have to *search and replace* all module name saved in database:

```
$ wp search-replace 'OLD_NAME' 'NEW_NAME'
$ wp search-replace 'fab_accordion' 'Accordion'
```

This is a bash script for `sage-flbuilder`'s default modules:

```
#!/bin/bash

declare -A modules

# Base Modules
modules[fab_accordion]=Accordion
modules[fab_alert]=Alert
modules[fab_breadcrumbs]=Breadcrumbs
modules[fab_button]=Button
modules[fab_content_image]=ContentImage
modules[fab_filter_bar]=FilterBar
modules[fab_gallery]=Gallery
modules[fab_gravity_form]=GravityForm
modules[fab_page_heading]=PageHeading
modules[fab_page_slider]=PageSlider
modules[fab_secondary_nav]=SecondaryNav
modules[fab_table]=Table
modules[fab_testimonial]=Testimonial
modules[fab_video]=Video

# Add project-specific modules here, for example:
# modules[gh_welcome_section]=WelcomeSection

for i in "${!modules[@]}"
do
    echo "$i -> ${modules[$i]}"
    command="wp search-replace '$i' '${modules[$i]}' --dry-run"
    echo "Running $command"
    result=$(eval "${command} 2> /dev/null")
    if [ $? -eq 0 ];then
        echo "${result##*$'\n'}"
        printf "\n------------\n\n"
    else
        echo "Failed!"
        echo $(result | tail -n 1)
        break
    fi

done
```

###  Health Score

51

—

FairBetter than 96% of packages

Maintenance68

Regular maintenance activity

Popularity29

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity76

Established project with proven stability

 Bus Factor1

Top contributor holds 73.7% 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 ~64 days

Recently: every ~130 days

Total

43

Last Release

298d ago

PHP version history (3 changes)0.1.2PHP ^7.2

0.3.0PHP ^7.1

0.15.0PHP ^8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/c1b05c8ed4ea3f68173555264d0226d5faeb7f315ed9df91890c351ef576ce72?d=identicon)[TangRufus](/maintainers/TangRufus)

---

Top Contributors

[![tangrufus](https://avatars.githubusercontent.com/u/2259834?v=4)](https://github.com/tangrufus "tangrufus (179 commits)")[![codepuncher](https://avatars.githubusercontent.com/u/8135396?v=4)](https://github.com/codepuncher "codepuncher (53 commits)")[![itineris-milos](https://avatars.githubusercontent.com/u/29227000?v=4)](https://github.com/itineris-milos "itineris-milos (4 commits)")[![JackAlexander1](https://avatars.githubusercontent.com/u/34484821?v=4)](https://github.com/JackAlexander1 "JackAlexander1 (3 commits)")[![R00tSquared](https://avatars.githubusercontent.com/u/23155585?v=4)](https://github.com/R00tSquared "R00tSquared (3 commits)")[![matthewgrzegorczyk](https://avatars.githubusercontent.com/u/9909232?v=4)](https://github.com/matthewgrzegorczyk "matthewgrzegorczyk (1 commits)")

### Embed Badge

![Health badge](/badges/itineris-sage-flbuilder/health.svg)

```
[![Health](https://phpackages.com/badges/itineris-sage-flbuilder/health.svg)](https://phpackages.com/packages/itineris-sage-flbuilder)
```

###  Alternatives

[fumeapp/modeltyper

Generate TypeScript interfaces from Laravel Models

196277.9k](/packages/fumeapp-modeltyper)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)

PHPackages © 2026

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