summaryrefslogtreecommitdiff
path: root/src/Metabox.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Metabox.php')
-rw-r--r--src/Metabox.php137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/Metabox.php b/src/Metabox.php
new file mode 100644
index 0000000..0f4c5d7
--- /dev/null
+++ b/src/Metabox.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace PostTypes;
+
+/**
+ * A Metabox in ACF is called a "Field Group" or just "Group".
+ * So all instances of "Metabox" or "Box" can be understood as an "ACF Field Group"
+ *
+ * @see https://github.com/AdvancedCustomFields/acf
+ */
+class Metabox
+{
+ /**
+ * The Box's key
+ */
+ public string $key;
+
+ /**
+ * The Box's title
+ * they $key is derived from that
+ */
+ public string $title;
+
+ /**
+ * The PostType/s to add the Metabox to
+ */
+ public array $posttypes = [];
+
+ /**
+ * The Box's fields to add
+ *
+ * @var MetaboxField[]
+ */
+ public array $fields = [];
+
+ /**
+ * The "ACF Group Settings"
+ * @see https://www.advancedcustomfields.com/resources/register-fields-via-php/#group-settings
+ */
+ public array $options = [];
+
+ /**
+ * Metabox constructor.
+ *
+ * @param string $title
+ * @param array $options
+ */
+ public function __construct(string $title, array $options = [])
+ {
+ // @see https://github.com/AdvancedCustomFields/acf/blob/5.9.3/includes/local-fields.php#L163
+ $this->key = 'group_' . str_replace(['_', '-', '/', ' '], '_', strtolower($title));
+ $this->title = $title;
+
+ $this->options($options);
+ }
+
+ /**
+ * Assign a PostType to add the Metabox to
+ *
+ * @param string|array $posttypes
+ *
+ * @return $this
+ */
+ public function posttype($posttypes)
+ {
+ $posttypes = (array)$posttypes;
+
+ foreach ($posttypes as $posttype) {
+ $this->posttypes[$posttype] = $posttype;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param MetaboxField|array $fields
+ *
+ * @return $this
+ */
+ public function field($fields)
+ {
+ if ($fields instanceof MetaboxField) {
+ $fields = [$fields];
+ }
+
+ foreach ($fields as $field) {
+ // set the field's parent
+ $field->parent($this->key);
+
+ $this->fields[$field->key] = &$field;
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param array $options
+ *
+ * @return $this
+ */
+ public function options(array $options)
+ {
+ $this->options = $options;
+
+ return $this;
+ }
+
+ /**
+ * Add the acf local field group
+ */
+ public function add()
+ {
+ // build the rule groups for the location
+ $postTypeRuleGroups = array_map(function ($posttype) {
+ return [[
+ 'param' => 'post_type',
+ 'operator' => '==',
+ 'value' => $posttype,
+ ]];
+ }, $this->posttypes);
+
+ // merge with extra options
+ $fieldGroup = array_merge_recursive([
+ 'key' => $this->key,
+ 'title' => $this->title,
+ 'location' => $postTypeRuleGroups,
+ ], $this->options);
+
+ // add field group
+ acf_add_local_field_group($fieldGroup);
+
+ // add fields
+ foreach ($this->fields as $field) {
+ $field->add();
+ }
+ }
+}