Columns
Columns
Each column in a DataTable is represented by a Column class that configures rendering, sorting, searching, and export behavior.
Creating Columns
Use the static new() method on the column type:
use Pentiminax\UX\DataTables\Column\TextColumn;use Pentiminax\UX\DataTables\Column\NumberColumn;
$nameColumn = TextColumn::new('firstName', 'First Name');$ageColumn = NumberColumn::new('age', 'Age');The first argument is the data key (maps to your JSON/array key), and the second is the display title.
Column Types
TextColumn
For text content:
TextColumn::new('name', 'Name');NumberColumn
For numeric values with proper sorting:
NumberColumn::new('price', 'Price');NumberColumn::new('quantity', 'Qty');DateColumn
For date values:
use Pentiminax\UX\DataTables\Column\DateColumn;
DateColumn::new('createdAt', 'Created');Configuration Methods
All columns inherit these methods from AbstractColumn:
Display Options
$column = TextColumn::new('name', 'Name') ->setTitle('Full Name') // Change header title ->setClassName('text-primary') // CSS class for cells ->setWidth('200px') // Column width ->setVisible(true) // Show/hide column ->setDefaultContent('N/A'); // Fallback for null valuesData Options
$column = TextColumn::new('user', 'User') ->setData('user.name'); // Nested data pathSorting & Searching
$column = TextColumn::new('name', 'Name') ->setOrderable(true) // Enable sorting ->setSearchable(true); // Enable searchingCell Type
$column = TextColumn::new('header', 'Header') ->setCellType('th'); // Use <th> instead of <td>Custom Rendering
Define a JavaScript render function:
$column = TextColumn::new('email', 'Email') ->setRender('function(data, type, row) { return "<a href=\"mailto:" + data + "\">" + data + "</a>"; }');Export Control
$column = TextColumn::new('actions', 'Actions') ->setExportable(false); // Exclude from exportsNon-exportable columns automatically receive the not-exportable CSS class.
Complete Example
use Pentiminax\UX\DataTables\Builder\DataTableBuilderInterface;use Pentiminax\UX\DataTables\Column\NumberColumn;use Pentiminax\UX\DataTables\Column\TextColumn;
class ProductTableService{ public function __construct( private DataTableBuilderInterface $builder, ) {}
public function createTable(): DataTable { $idColumn = NumberColumn::new('id', 'ID') ->setWidth('60px') ->setClassName('text-center');
$nameColumn = TextColumn::new('name', 'Product Name') ->setClassName('fw-bold') ->setOrderable(true) ->setSearchable(true);
$priceColumn = NumberColumn::new('price', 'Price') ->setWidth('100px') ->setOrderable(true) ->setRender('function(data) { return "$" + data.toFixed(2); }');
$statusColumn = TextColumn::new('status', 'Status') ->setWidth('100px') ->setRender('function(data) { var badge = data === "active" ? "success" : "secondary"; return "<span class=\"badge bg-" + badge + "\">" + data + "</span>"; }');
return $this->builder ->createDataTable('products') ->columns([$idColumn, $nameColumn, $priceColumn, $statusColumn]); }}Translating Column Titles
When using AbstractDataTable, the Symfony translator is available:
use Pentiminax\UX\DataTables\Column\TextColumn;use Pentiminax\UX\DataTables\Model\AbstractDataTable;
final class UsersDataTable extends AbstractDataTable{ public function configureColumns(): iterable { yield TextColumn::new('name') ->setTitle($this->translator->trans('datatable.columns.name'));
yield TextColumn::new('email') ->setTitle($this->translator->trans('datatable.columns.email')); }}Column Type Enum
The ColumnType enum controls DataTables’ internal sorting and search algorithms:
| Type | Description |
|---|---|
ColumnType::STRING | Text content (default) |
ColumnType::NUM | Numeric values |
ColumnType::NUM_FMT | Formatted numbers ($1,000) |
ColumnType::DATE | Date values |
ColumnType::HTML | HTML content |
Serialization
Get the DataTables configuration array:
$config = $column->jsonSerialize();// Returns: ['data' => 'name', 'title' => 'Name', 'orderable' => true, ...]