Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/Prefixer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php
namespace MBBParser;

class Prefixer {
public static function add( array &$fields, string $prefix ): void {
if ( ! $prefix ) {
return;
}
foreach ( $fields as &$field ) {
if ( ! empty( $field['id'] ) && ! str_starts_with( $field['id'], $prefix ) ) {
$field['id'] = $prefix . $field['id'];
}
if ( ! empty( $field['fields'] ) && is_array( $field['fields'] ) ) {
self::add( $field['fields'], $prefix );
}
}
}

public static function remove( array &$fields, string $prefix ): void {
if ( ! $prefix ) {
return;
}
foreach ( $fields as &$field ) {
if ( ! empty( $field['id'] ) && str_starts_with( $field['id'], $prefix ) ) {
$field['id'] = substr( $field['id'], strlen( $prefix ) );
}
if ( isset( $field['fields'] ) && is_array( $field['fields'] ) ) {
self::remove( $field['fields'], $prefix );
}
}
}
}
44 changes: 41 additions & 3 deletions src/Unparsers/MetaBox.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<?php
namespace MBBParser\Unparsers;

use MBBParser\Prefixer;

/**
* This class is the inverse of the parser.
* We convert the parsed data back to the format that can be saved to the database.
Expand Down Expand Up @@ -90,6 +92,11 @@ public function to_minimal_format() {
unset( $settings[ $key ] );
}

// Strip prefix from field IDs before exporting to JSON (minimal format)
if ( ! empty( $settings['fields'] ) && is_array( $settings['fields'] ) ) {
Prefixer::remove( $settings['fields'], $settings['prefix'] ?? '' );
}

ksort( $settings );

return $settings;
Expand Down Expand Up @@ -255,22 +262,53 @@ public function unparse_modified() {
return $this;
}

public function unparse_meta_box() {
/**
* Unparse the meta box.
*
* For fields:
* - Always keep it as a numeric array.
* - Remove prefix from field IDs for the settings, that can be used for export, builder, local JSON.
* - Add prefix to field IDs for parsed meta box, that's ready for registering.
*/
public function unparse_meta_box(): static {
// If not meta box, return
if ( $this->detect_post_type() !== 'meta-box' ) {
return $this;
}

$prefix = $this->lookup( [ 'prefix', 'settings.prefix' ], '' );

// If meta box is already parsed, normalize the fields array.
if ( isset( $this->meta_box ) && is_array( $this->meta_box ) ) {
// Fix: error on earlier versions that saved fields as object
$fields = array_values( $this->meta_box['fields'] ?? [] );
$fields = $this->meta_box['fields'] ?? [];
$fields = array_values( $fields );

// Remove prefix from field IDs for the settings, that can be used for export, builder, local JSON.
Prefixer::remove( $fields, $prefix );
$this->fields = $fields;

// Add prefix to field IDs for parsed meta box, that's ready for registering.
Prefixer::add( $fields, $prefix );
$this->settings['meta_box']['fields'] = $fields;

return $this;
}

// If meta box is not parsed, normalize the fields array.
$fields = $this->fields ?: [];
$fields = array_values( $fields );

// Remove prefix from field IDs for the settings, that can be used for export, builder, local JSON.
Prefixer::remove( $fields, $prefix );
$this->fields = $fields;

$meta_box = $this->get_settings();

// Add prefix to field IDs for parsed meta box, that's ready for registering.
Prefixer::add( $fields, $prefix );
$meta_box['fields'] = $fields;

foreach ( $this->get_unneeded_keys() as $key ) {
unset( $meta_box[ $key ] );
}
Expand Down Expand Up @@ -312,7 +350,7 @@ private function unparse_settings_page_tabs(): self {

$tab_items = [];
foreach ( $tabs as $key => $value ) {
$id = uniqid( 'tab_' );
$id = uniqid( 'tab_' );
$tab_items[ $id ] = compact( 'id', 'key', 'value' );
}

Expand Down