Adding Blocks - Overview ​
Blocks are the atomic building units of Bagisto Visual. This guide will walk you through creating custom blocks for your theme.
What You'll Learn ​
This section covers everything you need to know about building blocks:
- Creating a Block: Step-by-step guide to creating your first block
- Block Attributes: Configuring settings, presets, and nested blocks
- Static Blocks: Rendering blocks in Blade templates
- Container Blocks: Creating blocks that accept child blocks
When to Create Custom Blocks ​
Create custom blocks when you need:
- Reusable components that appear across multiple sections (buttons, testimonials, badges)
- E-commerce elements specific to your store (custom product cards, pricing displays)
- Branded components that reflect your design system (CTAs, social proof, icons)
- Content types that merchants will manage repeatedly (team members, features, FAQs)
Block Types Overview ​
Bagisto Visual provides three base block types to extend:
BladeBlock ​
The most common block type. Uses Blade templates for rendering.
Best for:
- Standard content blocks (text, images, buttons)
- Blocks with settings but no complex logic
- Most use cases
LivewireBlock ​
Dynamic blocks powered by Livewire components.
Best for:
- Interactive blocks (forms, calculators, live search)
- Blocks that need real-time updates
- AJAX-based functionality
SimpleBlock ​
Minimal blocks without settings or logic.
Best for:
- Structural elements (dividers, spacers)
- Static content
- Pure presentation blocks
Quick Example ​
Here's a simple block to get you started:
PHP Class (src/Blocks/Testimonial.php):
namespace Themes\YourTheme\Blocks;
use BagistoPlus\Visual\Block\BladeBlock;
use BagistoPlus\Visual\Settings\Text;
use BagistoPlus\Visual\Settings\Textarea;
use BagistoPlus\Visual\Settings\Image;
class Testimonial extends BladeBlock
{
protected static string $view = 'shop::blocks.testimonial';
public static function settings(): array
{
return [
Text::make('name', 'Customer name'),
Textarea::make('quote', 'Testimonial quote'),
Image::make('photo', 'Customer photo'),
];
}
}Blade View (resources/views/blocks/testimonial.blade.php):
<div class="testimonial">
@if($block->settings->photo)
<img src="{{ $block->settings->photo }}" alt="{{ $block->settings->name }}">
@endif
<blockquote>{{ $block->settings->quote }}</blockquote>
<cite>{{ $block->settings->name }}</cite>
</div>That's it! This Testimonial block can now be used in any section that accepts it.
Directory Structure ​
/theme/
├── src/
│ └── Blocks/
│ ├── Button.php
│ ├── Testimonial.php
│ ├── ProductCard.php
│ └── Columns.php # Container block
├── resources/
│ └── views/
│ └── blocks/
│ ├── button.blade.php
│ ├── testimonial.blade.php
│ ├── product-card.blade.php
│ └── columns.blade.phpKey points:
- PHP classes go in
src/Blocks/ - Blade views go in
resources/views/blocks/ - One PHP class per block, one Blade view per block
- Class names should be PascalCase, view names should be kebab-case
Development Workflow ​
- Plan your block: Decide what settings it needs and where it will be used
- Create the PHP class: Extend BladeBlock, LivewireBlock, or SimpleBlock
- Define settings: Use the settings() method to configure merchant-editable options
- Create the Blade view: Implement the block's HTML and styling
- Test in sections: Add your block to sections and test in the theme editor
- Refine: Iterate based on how merchants use it
Best Practices ​
✅ Keep blocks focused: One purpose per block (button, testimonial, image) ✅ Make them reusable: Design for multiple contexts, not one specific section ✅ Provide sensible defaults: Settings should have good default values ✅ Use clear naming: Block names should clearly describe their purpose ✅ Document settings: Use descriptive labels for merchant-facing settings ✅ Test responsiveness: Blocks should work on all screen sizes
Next Steps ​
Ready to create your first block? Start with Creating a Block to build a block step-by-step.