name = 'group'; $this->label = 'Group'; $this->category = 'layout'; } public function render( $field, $value = array(), $name = null ) { $is_subfield = ( $name !== null && substr_count( $name, '[' ) > 1 ); $name = $name ?: "metaforge[{$field['name']}]"; $sub_fields = $field['sub_fields'] ?? array(); $sub_layout = $field['sub_layout'] ?? 'block'; $depth = $name !== null ? substr_count( $name, '[' ) : 1; $label = ! empty( $field['label'] ) ? $field['label'] : ucwords( str_replace( '_', ' ', $field['name'] ?? 'Group' ) ); $instructions = ! empty( $field['instructions'] ) ? $field['instructions'] : ''; echo '
'; echo '
'; // Differentiate the Group via heading tags echo '
'; if ( $depth <= 1 ) { echo '

' . esc_html( $label ) . '

'; } else { echo '

' . esc_html( $label ) . '

'; } if ( ! empty( $instructions ) ) { echo '

' . esc_html( $instructions ) . '

'; } echo '
'; echo '
'; if ( $sub_layout === 'table' ) { if ( ! empty( $sub_fields ) ) { echo '
'; foreach ( $sub_fields as $sub_field ) { echo '
' . esc_html( $sub_field['label'] ?? $sub_field['name'] ) . '
'; } echo '
'; } echo '
'; echo '
'; foreach ( $sub_fields as $sub_field ) { $sub_name = $sub_field['name']; $sub_value = isset( $value[ $sub_name ] ) ? $value[ $sub_name ] : ''; echo '
'; MetaForge_FieldManager::render_field( $sub_field, $sub_value, "{$name}[{$sub_name}]" ); echo '
'; } echo '
'; echo '
'; } elseif ( $sub_layout === 'row' ) { echo '
'; foreach ( $sub_fields as $sub_field ) { $sub_name = $sub_field['name']; $sub_value = isset( $value[ $sub_name ] ) ? $value[ $sub_name ] : ''; echo '
'; MetaForge_FieldManager::render_field( $sub_field, $sub_value, "{$name}[{$sub_name}]" ); echo '
'; } echo '
'; } else { // Block layout echo '
'; foreach ( $sub_fields as $sub_field ) { $sub_name = $sub_field['name']; $sub_value = isset( $value[ $sub_name ] ) ? $value[ $sub_name ] : ''; MetaForge_FieldManager::render_field( $sub_field, $sub_value, "{$name}[{$sub_name}]" ); } echo '
'; } echo '
'; // .mfe-group-body echo '
'; // .mfe-group-card echo '
'; // .mfe-field-group } public function format_value( $value, $post_id, $field ) { return metaforge_format_group_value( $value, $field['sub_fields'] ?? array() ); } public function sanitize( $value, $field ) { if ( ! is_array( $value ) ) { return array(); } $sanitized = array(); $sub_fields = $field['sub_fields'] ?? array(); foreach ( $sub_fields as $sub ) { $sub_key = $sub['name']; if ( isset( $value[ $sub_key ] ) ) { $sub_type = $sub['type'] ?? 'text'; $registry_instance = MetaForge_Field_Registry::get_field_type( $sub_type ); if ( ! $registry_instance ) { $pro_class = 'MetaForge_' . str_replace( ' ', '', ucwords( str_replace( '_', ' ', $sub_type ) ) ) . 'Field'; if ( class_exists( $pro_class ) ) { $registry_instance = new $pro_class(); } } if ( $registry_instance ) { $sanitized[ $sub_key ] = $registry_instance->sanitize( $value[ $sub_key ], $sub ); } else { $sanitized[ $sub_key ] = is_array( $value[ $sub_key ] ) ? map_deep( $value[ $sub_key ], 'sanitize_text_field' ) : sanitize_text_field( $value[ $sub_key ] ); } } elseif ( ( $sub['type'] ?? '' ) === 'checkbox' ) { $sanitized[ $sub_key ] = array(); } elseif ( ( $sub['type'] ?? '' ) === 'true_false' ) { $sanitized[ $sub_key ] = '0'; } } return $sanitized; } }