Skip to content

Commit d0a7803

Browse files
authored
Merge pull request #3073 from yajra/format-column-callable
feat: allow closure on formatColumn
2 parents 5fd8996 + 78bdf31 commit d0a7803

File tree

2 files changed

+76
-5
lines changed

2 files changed

+76
-5
lines changed

src/DataTableAbstract.php

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use Psr\Log\LoggerInterface;
1111
use Yajra\DataTables\Contracts\DataTable;
1212
use Yajra\DataTables\Contracts\Formatter;
13-
use Yajra\DataTables\Exceptions\Exception;
1413
use Yajra\DataTables\Processors\DataProcessor;
1514
use Yajra\DataTables\Utilities\Helper;
1615

@@ -174,10 +173,8 @@ public static function create($source)
174173

175174
/**
176175
* @param string|array $columns
177-
* @param string|\Yajra\DataTables\Contracts\Formatter $formatter
176+
* @param string|callable|\Yajra\DataTables\Contracts\Formatter $formatter
178177
* @return $this
179-
*
180-
* @throws \Yajra\DataTables\Exceptions\Exception
181178
*/
182179
public function formatColumn($columns, $formatter): static
183180
{
@@ -193,7 +190,29 @@ public function formatColumn($columns, $formatter): static
193190
return $this;
194191
}
195192

196-
throw new Exception('$formatter must be an instance of '.Formatter::class);
193+
if (is_callable($formatter)) {
194+
foreach ((array) $columns as $column) {
195+
$this->addColumn(
196+
$column.'_formatted',
197+
function ($row) use ($column, $formatter) {
198+
return $formatter(data_get($row, $column), $row);
199+
}
200+
);
201+
}
202+
203+
return $this;
204+
}
205+
206+
foreach ((array) $columns as $column) {
207+
$this->addColumn(
208+
$column.'_formatted',
209+
function ($row) use ($column) {
210+
return data_get($row, $column);
211+
}
212+
);
213+
}
214+
215+
return $this;
197216
}
198217

199218
/**

tests/Integration/EloquentDataTableTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,46 @@ public function it_can_return_formatted_columns()
121121
$this->assertEquals(Carbon::parse($user->created_at)->format('Y-m-d'), $data['created_at_formatted']);
122122
}
123123

124+
/** @test */
125+
public function it_can_return_formatted_column_using_closure()
126+
{
127+
$crawler = $this->call('GET', '/eloquent/formatColumn-closure');
128+
129+
$crawler->assertJson([
130+
'draw' => 0,
131+
'recordsTotal' => 20,
132+
'recordsFiltered' => 20,
133+
]);
134+
135+
$user = User::find(1);
136+
$data = $crawler->json('data')[0];
137+
138+
$this->assertTrue(isset($data['created_at']));
139+
$this->assertTrue(isset($data['created_at_formatted']));
140+
141+
$this->assertEquals(Carbon::parse($user->created_at)->format('Y-m-d'), $data['created_at_formatted']);
142+
}
143+
144+
/** @test */
145+
public function it_can_return_formatted_column_on_invalid_formatter()
146+
{
147+
$crawler = $this->call('GET', '/eloquent/formatColumn-fallback');
148+
149+
$crawler->assertJson([
150+
'draw' => 0,
151+
'recordsTotal' => 20,
152+
'recordsFiltered' => 20,
153+
]);
154+
155+
$user = User::find(1);
156+
$data = $crawler->json('data')[0];
157+
158+
$this->assertTrue(isset($data['created_at']));
159+
$this->assertTrue(isset($data['created_at_formatted']));
160+
161+
$this->assertEquals($user->created_at, $data['created_at_formatted']);
162+
}
163+
124164
/** @test */
125165
public function it_accepts_a_relation()
126166
{
@@ -152,5 +192,17 @@ protected function setUp(): void
152192
->formatColumn('created_at', new DateFormatter('Y-m-d'))
153193
->toJson();
154194
});
195+
196+
$router->get('/eloquent/formatColumn-closure', function (DataTables $dataTable) {
197+
return $dataTable->eloquent(User::query())
198+
->formatColumn('created_at', fn ($value, $row) => Carbon::parse($value)->format('Y-m-d'))
199+
->toJson();
200+
});
201+
202+
$router->get('/eloquent/formatColumn-fallback', function (DataTables $dataTable) {
203+
return $dataTable->eloquent(User::query())
204+
->formatColumn('created_at', 'InvalidFormatter::class')
205+
->toJson();
206+
});
155207
}
156208
}

0 commit comments

Comments
 (0)