Custom Column Classes
Create reusable column classes to standardize column formatting across your application. Custom columns encapsulate styling, JavaScript rendering, and export configurations into a single, reusable component.
When to Create Custom Column Classes
Consider creating custom column classes when you:
- Have repeated column configurations across multiple DataTables
- Want to standardize formatting for specific data types (money, dates, percentages)
- Need consistent styling and rendering across different views
- Want to centralize export formatting logic
Basic Structure
Custom column classes extend BaseColumn and configure the column in the constructor:
<?phpdeclare(strict_types=1); namespace App\DataTables\Columns; use Yajra\DataTables\Html\Editor\Columns\BaseColumn; final class MoneyColumn extends BaseColumn{ public function __construct(array $attributes = []) { parent::__construct($attributes); // Configure the column here }}
Available Methods
addClass()
Add CSS class names to the column:
$this->addClass('text-right');
renderJs()
Set a JavaScript rendering function for the DataTables display:
$this->renderJs('number(",", ".", 2, "", "")');
The function formats numbers with thousand separators and decimal places using DataTables' number() helper.
exportFormat()
Set the Excel number format for exports:
$this->exportFormat('#,##0.00');
Common formats:
#,##0.00- Number with 2 decimals$#,##0.00- Currency0.00%- Percentagemm/dd/yyyy- Date
exportRender()
Define a callback to transform values during export:
$this->exportRender(fn (mixed $row, mixed $value): float => round((float) ($value ?? 0), 2));
The callback receives:
$row- The model/row instance$value- The raw column value
Returns the formatted value for export.
Example: MoneyColumn
This MoneyColumn class configures right-aligned display, JavaScript number formatting, and Excel-compatible export:
<?phpdeclare(strict_types=1); namespace App\Editor\Columns; final class MoneyColumn extends BaseColumn{ public function __construct(array $attributes = []) { parent::__construct($attributes); $this->addClass('text-right') ->renderJs('number(",", ".", 2, "", "")') ->exportFormat('#,##0.00') ->exportRender(fn (mixed $row, mixed $value): float => round((float) ($value ?? 0), 2)); }}
Usage in DataTable:
use App\DataTables\Columns\MoneyColumn; protected function getColumns(): array{ return [ // ... MoneyColumn::make('price', 'orders.price'), MoneyColumn::make('total', 'orders.total'), // ... ];}
Other Use Cases
PercentageColumn
<?phpdeclare(strict_types=1); namespace App\DataTables\Columns; final class PercentageColumn extends BaseColumn{ public function __construct(array $attributes = []) { parent::__construct($attributes); $this->addClass('text-center') ->renderJs('function(data) { return (data * 100).toFixed(2) + "%"; }') ->exportFormat('0.00%') ->exportRender(fn (mixed $row, mixed $value): float => round((float) ($value ?? 0) * 100, 2)); }}
PhoneColumn
<?phpdeclare(strict_types=1); namespace App\DataTables\Columns; final class PhoneColumn extends BaseColumn{ public function __construct(array $attributes = []) { parent::__construct($attributes); $this->addClass('text-center') ->exportFormat('@') // Text format in Excel ->exportRender(fn (mixed $row, mixed $value): string => preg_replace('/[^0-9+]/', '', $value ?? '')); }}
Namespace Organization
Place custom column classes in a dedicated namespace:
app/└── DataTables/ └── Columns/ ├── MoneyColumn.php ├── PercentageColumn.php └── PhoneColumn.php
Or for Editor-specific columns:
app/└── Editor/ └── Columns/ └── MoneyColumn.php
See Also
- Add Column - Add computed columns
- Edit Column - Modify existing columns
- Export Column - Export configuration
- Export Options - Export format options