PluginProbe ʕ •ᴥ•ʔ
Admin Columns / 7.1.4
Admin Columns v7.1.4
7.1.4 7.0.19 2.3.5 2.4 2.4.1 2.4.10 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.6.1 2.5.6.2 2.5.6.3 2.5.6.4 3.0 3.0.1 3.0.2 3.0.3 3.0.5 3.0.7 3.1 3.1.1 3.1.10 3.1.2 3.1.3 3.1.5 3.2.3 3.2.7 3.3.1 3.4.1 3.4.6 3.4.8 4.0.1 4.0.3 4.1.6 4.2.2 4.2.5 4.3 4.3.2 4.4.1 4.4.4 4.4.5 4.5.5 4.6.1 4.7.18 4.7.19 4.7.20 4.7.7 7.0.13 7.0.14 7.0.16 trunk 1.0 1.1 1.1.3 1.2 1.2.1 1.3 1.3.1 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.5.1 1.4.6 1.4.6.1 1.4.6.2 1.4.6.3 1.4.6.4 1.4.7 1.4.8 1.4.9 2.0.0 2.0.1 2.0.2 2.0.3 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.2 2.2.1 2.2.1.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.5.1 2.2.6 2.2.6.1 2.2.6.2 2.2.6.3 2.2.6.4 2.2.7 2.2.8 2.2.8.1 2.2.9 2.3.1 2.3.2 2.3.3
codepress-admin-columns / classes / Acf / RequestHandler / FieldSettingsAddColumn.php
codepress-admin-columns / classes / Acf / RequestHandler Last commit date
FieldSettingsAddColumn.php 3 days ago
FieldSettingsAddColumn.php
142 lines
1 <?php
2
3 declare(strict_types=1);
4
5 namespace AC\Acf\RequestHandler;
6
7 use AC\Acf\AcfColumnFactory;
8 use AC\Acf\ColumnMatcher;
9 use AC\Capabilities;
10 use AC\ColumnCollection;
11 use AC\ColumnTypeRepository;
12 use AC\ListScreen;
13 use AC\ListScreenRepository\Storage;
14 use AC\Nonce;
15 use AC\Request;
16 use AC\RequestAjaxHandler;
17 use AC\Response\Json;
18 use AC\TableScreenFactory;
19 use AC\Type\EditorUrlFactory;
20 use AC\Type\ListScreenIdGenerator;
21 use AC\Type\TableId;
22
23 class FieldSettingsAddColumn implements RequestAjaxHandler
24 {
25 private Storage $storage;
26
27 private TableScreenFactory $table_screen_factory;
28
29 private AcfColumnFactory $acf_column_factory;
30
31 private ColumnTypeRepository $column_type_repository;
32
33 private ListScreenIdGenerator $list_screen_id_generator;
34
35 private ColumnMatcher $column_matcher;
36
37 public function __construct(
38 Storage $storage,
39 TableScreenFactory $table_screen_factory,
40 AcfColumnFactory $acf_column_factory,
41 ColumnTypeRepository $column_type_repository,
42 ListScreenIdGenerator $list_screen_id_generator,
43 ColumnMatcher $column_matcher
44 ) {
45 $this->storage = $storage;
46 $this->table_screen_factory = $table_screen_factory;
47 $this->acf_column_factory = $acf_column_factory;
48 $this->column_type_repository = $column_type_repository;
49 $this->list_screen_id_generator = $list_screen_id_generator;
50 $this->column_matcher = $column_matcher;
51 }
52
53 public function handle(): void
54 {
55 if (! current_user_can(Capabilities::MANAGE)) {
56 return;
57 }
58
59 $request = new Request();
60 $response = new Json();
61
62 if (! (new Nonce\Ajax())->verify($request)) {
63 $response->error();
64 }
65
66 $table_id = new TableId((string)$request->get('table_id'));
67
68 if (! $this->table_screen_factory->can_create($table_id)) {
69 $response->error();
70 }
71
72 $table_screen = $this->table_screen_factory->create($table_id);
73 $field_data = json_decode((string)$request->get('field_data'), true);
74
75 if (! is_array($field_data) || empty($field_data['name'])) {
76 $response->error();
77 }
78
79 $acf_field = function_exists('acf_get_field') ? acf_get_field($field_data['name']) : false;
80
81 if (is_array($acf_field)) {
82 $field_data = $acf_field;
83 }
84
85 $column = $this->acf_column_factory->create($table_screen, $field_data);
86
87 if (! $column) {
88 $response->error();
89 }
90
91 $list_screen = $this->find_writable_list_screen($table_id);
92
93 if ($list_screen) {
94 $existing_column = $this->column_matcher->find_column($list_screen, $field_data['name']);
95
96 if ($existing_column) {
97 $editor_url = EditorUrlFactory::create($table_id, false, $list_screen->get_id())
98 ->with_arg('open_columns', (string)$existing_column->get_id());
99
100 $response->set_parameter('editor_url', (string)$editor_url);
101 $response->success();
102 }
103
104 $columns = ColumnCollection::from_iterator($list_screen->get_columns());
105 $columns->add($column);
106
107 $list_screen->set_columns($columns);
108 $this->storage->save($list_screen);
109 } else {
110 $columns = $this->column_type_repository->find_all_original($table_screen);
111 $columns->add($column);
112
113 $list_screen = new ListScreen(
114 $this->list_screen_id_generator->generate(),
115 $table_screen->get_labels()->get_singular(),
116 $table_screen,
117 $columns
118 );
119
120 $this->storage->save($list_screen);
121 }
122
123 $editor_url = EditorUrlFactory::create($table_id, false, $list_screen->get_id())
124 ->with_arg('open_columns', (string)$column->get_id());
125
126 $response->set_parameter('editor_url', (string)$editor_url);
127 $response->success();
128 }
129
130 private function find_writable_list_screen(TableId $table_id): ?ListScreen
131 {
132 foreach ($this->storage->find_all_by_table_id($table_id) as $list_screen) {
133 if (! $list_screen->is_read_only()) {
134 return $list_screen;
135 }
136 }
137
138 return null;
139 }
140
141 }
142