A CakePHP 5 Plugin with Bootstrap 5 theme, custom helpers, components, and bake templates for rapid application development.
- PHP 8.2 or higher
- CakePHP 5.1 or higher
- Bootstrap 5 (via FriendsOfCake/bootstrap-ui)
Install the plugin via Composer:
composer require queencitycodefactory/butter-creamLoad the plugin in your application's src/Application.php:
public function bootstrap(): void
{
parent::bootstrap();
$this->addPlugin('ButterCream');
}ButterCream\Controller\Controller- Extended base controller with:- Ajax pagination support with configurable limits
- Automatic ajax layout switching
- Enhanced pagination with page-out-of-bounds handling
- Auto-loaded Flash and Referer components
- PDF and Spreadsheet view support
ButterCream\Controller\Component\FlashComponent- Enhanced flash messaging with HTML support by default
- Methods:
success(),error(),set()
ButterCream\Controller\Component\RefererComponent- Smart referer tracking and redirection
- Configurable ignored URLs
- Normalizes URLs for consistent matching
- Methods:
setReferer()- Store referer for later usegetReferer()- Retrieve current refererredirect()- Redirect to referer or fallbackisMatch()- Check if referer matches a URLignore()- Add URL to ignore list
ButterCream\View\Helper\AjaxHelperrelatedData()- Create containers for AJAX-loaded content
ButterCream\View\Helper\FlashHelper- Enhanced flash message rendering with Bootstrap 5 styling
ButterCream\View\Helper\FormHelper- Extended Bootstrap 5 form helper
create()- Automatic referer tracking in formspostLink()- Enhanced POST links with modal confirmationdeleteBtn()- Pre-configured delete buttonsaveButton()- Pre-configured save button with icon- Custom postLink with Bootstrap modal integration
ButterCream\View\Helper\FormatHelperssn()- Format US Social Security Numberszip()- Format US ZIP codes (5 or 9 digit)phone()- Format US phone numbersparsePhone()- Parse phone number partsformatString()- Apply custom formatting patternsmaskString()- Mask sensitive data
ButterCream\View\Helper\HtmlHelper- Extended Bootstrap 5 HTML helper
ButterCream\View\Helper\PaginatorHelper- Bootstrap 5 styled pagination
ajaxTemplateOptions()- Configure AJAX pagination links- Custom Font Awesome icons for prev/next
- Enhanced
prev(),next(),numbers()methods
ButterCream\View\Helper\TableHelperheader()- Generate sortable table headers- Bootstrap 5 table styling
- Automatic sort integration
ButterCream\View\Helper\TimeHelper- Extended Bootstrap 5 time helper
ButterCream\View\Helper\UrlHelper- Extended URL helper
ButterCream\View\Helper\GravatarHelper- Generate Gravatar image URLs
ButterCream\View\Helper\NestedTreeHelper- Render nested tree structures
ButterCream\Model\Table\AppTable- Automatic data cleaning for weird character encodings (smart quotes, em dashes, etc.)
- Base table class with reusable callbacks
ButterCream\Model\TreeviewTraitfindTreeview()- Custom finder for nested tree data- Configurable key fields and nesting
ButterCream\Model\Validationphone()- Validate US phone numberspostal()- Validate US ZIP codesssn()- Validate US Social Security Numbersbirthdate()- Validate birthdate (not in future)
ButterCream\Model\Entity\File- File management entity with path and base64 getters
- Flysystem integration
ButterCream\Routing\Middleware\SessionTimeoutMiddleware- Configurable session timeout management
- AJAX-aware session extension
- Automatic session destruction on timeout
ButterCream\Routing\Middleware\TrustProxyMiddleware- Configure proxy trust settings
ButterCream\Utility\Format- Static formatting methods for SSN, phone, ZIP codes
- Pattern-based string formatting and masking
ButterCream\Utility\Muddle- Array manipulation utilities
insert()- Insert values using path notationbuildDotNotationPath()- Build paths from arrays
ButterCream\Database\Type\JsonArrayType- Custom JSON array type with batch casting support
ButterCream\View\AppView- Pre-configured with all ButterCream helpers
ButterCream\View\PdfView- PDF generation support via CakePdf
- Pre-configured with ButterCream helpers
Custom bake templates for rapid development with Bootstrap 5 styling:
- Controllers - Pre-configured with Search component and ButterCream base
- Models/Tables - Enhanced table templates with callbacks
- Templates - Bootstrap 5 styled CRUD views
add.twig- Create formsedit.twig- Edit formsindex.twig- List views with tablesview.twig- Detail views
- Form Elements - Bootstrap 5 form styling
ButterCream\Error\ExceptionRenderer- Custom error rendering with ButterCream theme
- Safe error message handling
- Debug-aware error messages
namespace App\Controller;
use ButterCream\Controller\Controller;
class ArticlesController extends Controller
{
// Automatic Flash and Referer components loaded
// Ajax pagination configured
// PDF and Spreadsheet views available
}public function delete($id)
{
$article = $this->Articles->get($id);
if ($this->Articles->delete($article)) {
$this->Flash->success('Article deleted.');
}
// Redirect back to where user came from
return $this->Referer->redirect(['action' => 'index']);
}// In a template
echo $this->Format->phone('5551234567'); // (555) 123-4567
echo $this->Format->ssn('123456789'); // 123-45-6789
echo $this->Format->zip('12345'); // 12345
echo $this->Format->zip('123456789'); // 12345-6789// Create sortable table headers
<table class="table">
<thead>
<tr>
<?= $this->Table->header('id', 'ID') ?>
<?= $this->Table->header('title', 'Article Title') ?>
<?= $this->Table->header('created', 'Created') ?>
</tr>
</thead>
</table>// In a Table class
use ButterCream\Model\TreeviewTrait;
class CategoriesTable extends AppTable
{
use TreeviewTrait;
}
// In a controller
$categories = $this->Categories->find('treeview');The plugin includes custom bake templates that generate Bootstrap 5 styled code:
bin/cake bake model Articles
bin/cake bake controller Articles
bin/cake bake template ArticlesGenerated code will include:
- Bootstrap 5 form styling
- Pre-configured Search component
- ButterCream helpers
- Responsive table layouts
- Modal confirmations for delete actions
Add to your Application.php:
$middlewareQueue->add(new \ButterCream\Routing\Middleware\SessionTimeoutMiddleware([
'timeout' => 30 // minutes
]));$middlewareQueue->add(new \ButterCream\Routing\Middleware\TrustProxyMiddleware(true));- friendsofcake/search - Search functionality
- friendsofcake/bootstrap-ui - Bootstrap 5 integration
- friendsofcake/cakepdf - PDF generation
- queencitycodefactory/cakespreadsheet - Spreadsheet generation
MIT License. See LICENSE file for details.
Butter Cream includes a comprehensive test suite powered by PHPUnit. The current test coverage includes:
- FlashComponent - Custom flash message handling
- RefererComponent - URL normalization and redirect management
- FormatHelper - US formatting (SSN, phone, ZIP)
- Format - String formatting and masking
- Muddle - Array manipulation utilities
- Validation - US data validation (phone, postal, SSN, birthdate)
- TreeviewTrait - Nested data structure support
- SessionTimeoutMiddleware - Session management and timeout handling
# Run all tests
composer test
# Run with coverage (requires Xdebug or pcov)
vendor/bin/phpunit --coverage-html coverage/
# Run specific test file
vendor/bin/phpunit tests/TestCase/Utility/FormatTest.phpWhen adding new features or fixing bugs, please include tests. Test files should:
- Be placed in
tests/TestCase/matching the source structure - Extend
Cake\TestSuite\TestCase - Follow PHPUnit best practices
- Test both success and failure scenarios
See CONTRIBUTING.md for more details on writing tests.
- Issues: GitHub Issues
- Documentation: GitHub Wiki
Contributions are welcome! Please see CONTRIBUTING.md for detailed guidelines on:
- Reporting bugs
- Suggesting enhancements
- Submitting pull requests
- Development setup
- Coding standards
- Testing requirements
Please ensure all tests pass and code follows CakePHP standards before submitting a PR.