Skip to content

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 values

Data Options

$column = TextColumn::new('user', 'User')
->setData('user.name'); // Nested data path

Sorting & Searching

$column = TextColumn::new('name', 'Name')
->setOrderable(true) // Enable sorting
->setSearchable(true); // Enable searching

Cell 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 exports

Non-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:

TypeDescription
ColumnType::STRINGText content (default)
ColumnType::NUMNumeric values
ColumnType::NUM_FMTFormatted numbers ($1,000)
ColumnType::DATEDate values
ColumnType::HTMLHTML content

Serialization

Get the DataTables configuration array:

$config = $column->jsonSerialize();
// Returns: ['data' => 'name', 'title' => 'Name', 'orderable' => true, ...]