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 |