## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require flobbos/page-composer
php artisan page-composer:install
Follow prompts (name is arbitrary).
Publish Assets:
php artisan vendor:publish --provider="Flobbos\PageComposer\PageComposerServiceProvider"
Select TranslatableDB and PageComposer options.
Configure Dependencies:
config/translatable-db.php:
'language_model' => 'Flobbos\PageComposer\Models\Language',
tailwind.config.js:
content: [
"./vendor/flobbos/page-composer/src/resources/views/**/*.blade.php",
],
@stack('scripts') and @stack('styles') to your layout file.Run Migrations:
php artisan migrate
Add Routes (in routes/web.php):
route('page-composer::pages.index');
route('page-composer::pages.create');
route('page-composer::pages.edit', $page_id);
route('page-composer::pages.detail', $page_id);
Create a new page via route('page-composer::pages.create') and:
route('page-composer::pages.detail', $page_id).Page Structure:
column_presets).Element Management:
app/Livewire/PageComposerElements/).app/Livewire/PageComposerElements/MyElement.php).config/pagecomposer.php under custom_elements.Livewire Integration:
wire:sort (replaces wire:sortable).public function sortRows($id, $position) {
$this->page->rows[$position] = $this->page->rows[$id];
unset($this->page->rows[$id]);
}
Translation Handling:
flobbos/translatable-db for multi-language support.Previewing:
route('page-composer::pages.detail', $page_id) to render pages with:
@livewire('page-composer::page-detail', ['page' => $page], key($page->id))
Frontend Rendering: Loop through rows/columns/elements in your Blade templates:
@foreach($page->rows as $row)
<div class="flex">
@foreach($row->columns as $column)
<div class="{{ config('pagecomposer.column_widths'][$column->size] }}">
{!! $column->element->render() !!}
</div>
@endforeach
</div>
@endforeach
Dynamic Layouts:
Override column_presets in config/pagecomposer.php to enforce consistent layouts:
'column_presets' => [
['size' => 12, 'label' => 'Full', 'group' => 'full'],
['size' => 6, 'label' => 'Half', 'group' => 'halves'],
],
Element Styling:
Use Tailwind classes from column_widths (e.g., w-full, w-1/2) for responsive columns.
Asset Management:
Uploaded images/videos are stored in storage/app/public/page-composer. Symlink to public:
php artisan storage:link --force
Caching: Clear caches after major changes:
php artisan view:clear
php artisan config:clear
Stale Row Space:
php artisan page-composer:sync-row-space --dry-run
--dry-run to preview changes before applying.Quill Editor Conflicts:
quillEditor (use pageComposerEditor instead).<div x-data="pageComposerEditor({})">
Livewire 4 Migration:
wire:sortable with wire:sort in custom components.(array $items) to ($id, $position) (zero-based).Tailwind Class Mismatches:
column_widths in config/pagecomposer.php matches your Tailwind classes.w-full.Translation Issues:
language_model in config/translatable-db.php points to Flobbos\PageComposer\Models\Language.php artisan config:clear if translations fail to load.Element Creator in Production:
showElementCreator in production to hide the stub generator:
'showElementCreator' => env('APP_DEBUG'),
Livewire Errors:
Check the browser console for Alpine/Quill conflicts. Disable other quillEditor components temporarily.
Database Issues:
Use --dry-run for migrations to inspect SQL changes:
php artisan migrate --dry-run
Asset Loading:
Ensure @stack('scripts') and @stack('styles') are in your layout. Verify Tailwind scans the package views:
// tailwind.config.js
content: [
"./vendor/flobbos/page-composer/src/resources/views/**/*.blade.php",
"./resources/views/**/*.blade.php",
],
Custom Elements:
Flobbos\PageComposer\Livewire\Elements\BaseElement for new elements.config/pagecomposer.php:
'custom_elements' => [
'MyElement' => \App\Livewire\PageComposerElements\MyElement::class,
],
Element Rendering:
Override the render() method in custom elements to modify output:
public function render() {
return view('livewire.page-composer-elements.my-element', ['element' => $this]);
}
Validation Rules:
Extend default rules in config/pagecomposer.php:
'rules' => [
'page.custom_field' => 'required|string',
],
Column Presets:
Dynamically load presets from a database or API by overriding the getColumnPresets() method in a service provider.
Middleware:
Customize route middleware in config/pagecomposer.php:
'middleware' => [
'web',
'auth:sanctum',
'verified',
\App\Policies\PageComposerPolicy::class, // Example custom policy
],
Lazy-Load Elements:
Use wire:ignore for heavy elements (e.g., videos) to improve initial load time:
<div wire:ignore>{{ $element->render() }}</div>
Cache Page Renders:
Cache the page-detail Livewire component by key:
@livewire('page-composer::page-detail', ['page' => $page], key($page->id . '-' . $page->locale))
Batch Sync: For large sites, sync row space in batches:
php artisan page-composer:sync-row-space --batch=100
'quill_toolbar' => [
[['header' => [false, 1,
How can I help you explore Laravel packages today?