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 / AcfColumnFactory.php
codepress-admin-columns / classes / Acf Last commit date
FieldGroup 2 days ago RequestHandler 2 days ago Service 2 days ago AcfColumnFactory.php 2 days ago ColumnMatcher.php 2 days ago FieldGroupCache.php 2 days ago
AcfColumnFactory.php
173 lines
1 <?php
2
3 declare(strict_types=1);
4
5 namespace AC\Acf;
6
7 use AC\Column;
8 use AC\Column\ColumnIdGenerator;
9 use AC\ColumnFactories\Aggregate;
10 use AC\Setting\ComponentFactory\DateSaveFormat;
11 use AC\Setting\ComponentFactory\FieldType;
12 use AC\Setting\Config;
13 use AC\TableScreen;
14
15 class AcfColumnFactory
16 {
17 private const FIELD_TYPE_MAP = [
18 'button_group' => FieldType::TYPE_SELECT,
19 'checkbox' => FieldType::TYPE_SELECT,
20 'color_picker' => FieldType::TYPE_COLOR,
21 'date_picker' => FieldType::TYPE_DATE,
22 'date_time_picker' => FieldType::TYPE_DATE,
23 'file' => FieldType::TYPE_MEDIA,
24 'image' => FieldType::TYPE_IMAGE,
25 'number' => FieldType::TYPE_NUMERIC,
26 'oembed' => FieldType::TYPE_URL,
27 'page_link' => FieldType::TYPE_POST,
28 'post_object' => FieldType::TYPE_POST,
29 'radio' => FieldType::TYPE_SELECT,
30 'range' => FieldType::TYPE_NUMERIC,
31 'select' => FieldType::TYPE_SELECT,
32 'text' => FieldType::TYPE_TEXT,
33 'true_false' => FieldType::TYPE_BOOLEAN,
34 'url' => FieldType::TYPE_URL,
35 'user' => FieldType::TYPE_USER,
36 'wysiwyg' => FieldType::TYPE_HTML,
37 ];
38
39 private Aggregate $column_factories;
40
41 public function __construct(Aggregate $column_factories)
42 {
43 $this->column_factories = $column_factories;
44 }
45
46 public function create(TableScreen $table_screen, array $field): ?Column
47 {
48 $factory = $this->find_column_factory($table_screen);
49
50 if (! $factory) {
51 return null;
52 }
53
54 $config = $this->create_config($field);
55
56 if (null === $config) {
57 return null;
58 }
59
60 return $factory->create(new Config($config));
61 }
62
63 private function create_config(array $field): ?array
64 {
65 $meta_key = $field['name'] ?? null;
66
67 if (empty($meta_key)) {
68 return null;
69 }
70
71 $type = $field['type'] ?? '';
72
73 $config = [
74 'name' => (string)(new ColumnIdGenerator())->generate(),
75 'type' => 'column-meta',
76 'field' => $meta_key,
77 'label' => $this->resolve_label($field, $type, $meta_key),
78 'field_type' => self::FIELD_TYPE_MAP[$type] ?? '',
79 ];
80
81 switch ($type) {
82 case 'select':
83 case 'button_group':
84 $config['is_multiple'] = ! empty($field['multiple']) ? 'on' : 'off';
85 $config['select_options'] = self::encode_choices($field);
86 break;
87 case 'checkbox':
88 $config['is_multiple'] = 'on';
89 $config['select_options'] = self::encode_choices($field);
90 break;
91 case 'radio':
92 $config['select_options'] = self::encode_choices($field);
93 break;
94 case 'file':
95 if (! empty($field['multiple'])) {
96 $config['is_multiple'] = 'on';
97 }
98 break;
99 case 'date_picker':
100 $config['date_save_format'] = Service\DateSaveFormat::DATE_FORMAT;
101 break;
102 case 'date_time_picker':
103 $display_format = $field['display_format'] ?? null;
104
105 $config['date_save_format'] = DateSaveFormat::FORMAT_DATETIME;
106 $config['date_format'] = $display_format ?: 'wp_date_format';
107 break;
108 }
109
110 $prepend = $field['prepend'] ?? '';
111 $append = $field['append'] ?? '';
112
113 if ($prepend !== '') {
114 $config['before'] = $prepend;
115 }
116
117 if ($append !== '') {
118 $config['after'] = $append;
119 }
120
121 return $config;
122 }
123
124 private static function encode_choices(array $field): string
125 {
126 $choices = $field['choices'] ?? [];
127
128 if (! $choices) {
129 return '';
130 }
131
132 $options = [];
133
134 foreach ($choices as $value => $label) {
135 $options[] = [
136 'value' => (string)$value,
137 'label' => (string)$label,
138 ];
139 }
140
141 return (string)json_encode($options);
142 }
143
144 private function resolve_label(array $field, string $type, string $meta_key): string
145 {
146 $label = trim($field['label'] ?? '');
147
148 if ($label !== '') {
149 return $label;
150 }
151
152 $type_object = acf_get_field_type($type);
153
154 if ($type_object && ! empty($type_object->label)) {
155 return $type_object->label;
156 }
157
158 return $meta_key;
159 }
160
161 private function find_column_factory(TableScreen $table_screen): ?Column\ColumnFactory
162 {
163 foreach ($this->column_factories->create($table_screen) as $factory) {
164 if ($factory->get_column_type() === 'column-meta') {
165 return $factory;
166 }
167 }
168
169 return null;
170 }
171
172 }
173