-
-
Notifications
You must be signed in to change notification settings - Fork 568
/
Copy pathActionController.php
95 lines (71 loc) · 2.76 KB
/
ActionController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
namespace Statamic\Http\Controllers\CP;
use Exception;
use Illuminate\Http\Request;
use Statamic\Facades\Action;
use Statamic\Facades\User;
use Statamic\Support\Arr;
use Symfony\Component\HttpFoundation\Response;
abstract class ActionController extends CpController
{
public function run(Request $request)
{
$data = $request->validate([
'action' => 'required',
'selections' => 'required|array',
'context' => 'sometimes',
]);
$context = $data['context'] ?? [];
$items = $this->getSelectedItems(collect($data['selections']), $context);
$action = Action::get($request->action)->context($context)->items($items);
$validation = $action->fields()->validator();
$request->replace($request->values)->validate($validation->rules());
$unauthorized = $items->reject(function ($item) use ($action) {
return $action->authorize(User::current(), $item);
});
abort_unless($unauthorized->isEmpty(), 403, __('You are not authorized to run this action.'));
if ($action->requiresElevatedSession()) {
$this->requireElevatedSession();
}
$values = $action->fields()->addValues($request->all())->process()->values()->all();
$successful = true;
try {
$response = $action->run($items, $values);
} catch (Exception $e) {
$response = empty($msg = $e->getMessage()) ? __('Action failed') : $msg;
$successful = false;
}
if ($redirect = $action->redirect($items, $values)) {
return [
'redirect' => $redirect,
'bypassesDirtyWarning' => $action->bypassesDirtyWarning(),
];
} elseif ($download = $action->download($items, $values)) {
return $download instanceof Response ? $download : response()->download($download);
}
if (is_string($response)) {
$response = ['message' => $response];
}
$response = $response ?: [];
$response['success'] = $successful;
if (Arr::get($context, 'view') === 'form') {
$response['data'] = $this->getItemData($items->first(), $context);
}
return $response;
}
public function bulkActions(Request $request)
{
$data = $request->validate([
'selections' => 'required|array',
'context' => 'sometimes',
]);
$context = $data['context'] ?? [];
$items = $this->getSelectedItems(collect($data['selections']), $context);
return Action::forBulk($items, $context);
}
abstract protected function getSelectedItems($items, $context);
protected function getItemData($item, $context): array
{
return [];
}
}