class-gallery-api.php
4 months ago
class-gallery-base.php
4 months ago
class-gallery-config.php
4 months ago
class-gallery-design.php
4 months ago
class-gallery-field-provider.php
4 months ago
class-gallery-images.php
4 months ago
class-gallery-lightbox.php
4 months ago
class-gallery-misc.php
4 months ago
class-gallery-paging.php
4 months ago
trait-gallery-ajax.php
4 months ago
trait-gallery-duplicate.php
4 months ago
trait-gallery-image-methods.php
2 weeks ago
trait-gallery-preview.php
4 months ago
trait-gallery-sanitize.php
4 months ago
class-gallery-config.php
253 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Responsive Lightbox Gallery Config Settings |
| 4 | * |
| 5 | * Handles gallery configuration settings (gallery type selection). |
| 6 | * Adapts existing Settings API galleries tab for post meta context. |
| 7 | * |
| 8 | * @package Responsive_Lightbox |
| 9 | */ |
| 10 | |
| 11 | // exit if accessed directly |
| 12 | if ( ! defined( 'ABSPATH' ) ) |
| 13 | exit; |
| 14 | |
| 15 | /** |
| 16 | * Responsive_Lightbox_Gallery_Config class. |
| 17 | * |
| 18 | * Gallery configuration tab - adapts settings API galleries fields. |
| 19 | * |
| 20 | * @class Responsive_Lightbox_Gallery_Config |
| 21 | */ |
| 22 | class Responsive_Lightbox_Gallery_Config extends Responsive_Lightbox_Gallery_Base { |
| 23 | |
| 24 | /** |
| 25 | * Tab key identifier. |
| 26 | * |
| 27 | * @var string |
| 28 | */ |
| 29 | const TAB_KEY = 'config'; |
| 30 | |
| 31 | /** |
| 32 | * Get tab data for rendering. |
| 33 | * |
| 34 | * Returns configuration fields adapted from Settings API. |
| 35 | * |
| 36 | * @param string $menu_item Optional menu item to get fields for. |
| 37 | * @return array Tab data. |
| 38 | */ |
| 39 | public function get_tab_data( $menu_item = '' ) { |
| 40 | $rl = Responsive_Lightbox(); |
| 41 | $gallery_types = apply_filters( 'rl_gallery_types', $rl->get_data( 'gallery_types' ) ); |
| 42 | if ( ! is_array( $gallery_types ) ) { |
| 43 | $gallery_types = []; |
| 44 | } |
| 45 | |
| 46 | $config_data = [ |
| 47 | 'tab_key' => self::TAB_KEY, |
| 48 | 'menu_items' => [] |
| 49 | ]; |
| 50 | |
| 51 | // Build menu items: Global first, then other gallery types |
| 52 | $config_data['menu_items']['default'] = __( 'Global', 'responsive-lightbox' ); |
| 53 | foreach ( $gallery_types as $type => $type_data ) { |
| 54 | if ( $type === 'default' ) { |
| 55 | continue; // Skip default as we handle it as Global |
| 56 | } |
| 57 | if ( is_array( $type_data ) ) { |
| 58 | $label = $type_data['label'] ?? ( $type_data['name'] ?? $type ); |
| 59 | } else { |
| 60 | $label = (string) $type_data; |
| 61 | } |
| 62 | $config_data['menu_items'][$type] = $label; |
| 63 | } |
| 64 | |
| 65 | // If menu_item is specified, return fields for that gallery type |
| 66 | // Otherwise, use the first available gallery type as default |
| 67 | $selected_type = ! empty( $menu_item ) && array_key_exists( $menu_item, $config_data['menu_items'] ) ? $menu_item : 'default'; |
| 68 | $config_data['options'] = $this->get_gallery_type_fields( $selected_type ); |
| 69 | |
| 70 | return $config_data; |
| 71 | } |
| 72 | |
| 73 | /** |
| 74 | * Get fields for a specific gallery type. |
| 75 | * |
| 76 | * Adapts Settings API galleries fields for post meta, emulating legacy logic. |
| 77 | * |
| 78 | * @param string $gallery_type Gallery type. |
| 79 | * @return array Fields configuration. |
| 80 | */ |
| 81 | public function get_gallery_type_fields( $gallery_type ) { |
| 82 | $rl = Responsive_Lightbox(); |
| 83 | |
| 84 | // Get gallery types for label resolution |
| 85 | $gallery_types = apply_filters( 'rl_gallery_types', $rl->get_data( 'gallery_types' ) ); |
| 86 | |
| 87 | // Get default gallery fields (universal base) |
| 88 | $default_gallery_fields = $rl->frontend->get_default_gallery_fields(); |
| 89 | |
| 90 | // Build settings data using shared provider |
| 91 | $provider = new Responsive_Lightbox_Gallery_Field_Provider(); |
| 92 | $settings = $provider->get_gallery_settings_data(); |
| 93 | $defaults = $rl->defaults; |
| 94 | $default_gallery_type = isset( $rl->options['settings']['builder_gallery'] ) ? $rl->options['settings']['builder_gallery'] : 'basicgrid'; |
| 95 | $default_gallery_key = $default_gallery_type . '_gallery'; |
| 96 | $builder_gallery_fields = []; |
| 97 | $global_settings = []; |
| 98 | |
| 99 | // Ensure default_gallery exists in settings |
| 100 | if ( ! array_key_exists( 'default_gallery', $settings ) ) { |
| 101 | $settings['default_gallery'] = []; |
| 102 | } |
| 103 | |
| 104 | // Get builder gallery fields |
| 105 | if ( ! empty( $settings[$default_gallery_key]['fields'] ) ) { |
| 106 | $builder_gallery_fields = $settings[$default_gallery_key]['fields']; |
| 107 | } elseif ( $rl->settings && method_exists( $rl->settings, 'get_setting_fields' ) ) { |
| 108 | $legacy_fields = $rl->settings->get_setting_fields( $default_gallery_key ); |
| 109 | if ( ! empty( $legacy_fields ) && is_array( $legacy_fields ) ) { |
| 110 | $builder_gallery_fields = $legacy_fields; |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | if ( ! empty( $rl->options[$default_gallery_key] ) && is_array( $rl->options[$default_gallery_key] ) ) { |
| 115 | $global_settings = $rl->options[$default_gallery_key]; |
| 116 | } |
| 117 | |
| 118 | // Assign default values for default_gallery |
| 119 | foreach ( $default_gallery_fields as $field => $field_args ) { |
| 120 | $defaults['default_gallery'][$field] = $field_args['default']; |
| 121 | } |
| 122 | |
| 123 | $fields = []; |
| 124 | $disabled_fields = []; |
| 125 | |
| 126 | if ( $gallery_type === 'default' ) { |
| 127 | // For Global: merge base + builder gallery fields, disable non-base fields |
| 128 | $fields = $default_gallery_fields; |
| 129 | if ( ! empty( $builder_gallery_fields ) ) { |
| 130 | $fields = $rl->frontend->get_unique_fields( $default_gallery_fields, $builder_gallery_fields ); |
| 131 | foreach ( $defaults[$default_gallery_key] as $field => $default_value ) { |
| 132 | if ( ! array_key_exists( $field, $defaults['default_gallery'] ) ) { |
| 133 | $defaults['default_gallery'][$field] = $default_value; |
| 134 | } |
| 135 | } |
| 136 | } |
| 137 | $disabled_fields = array_diff_key( $fields, $default_gallery_fields ); |
| 138 | } else { |
| 139 | // For specific types: merge base + type fields |
| 140 | if ( array_key_exists( $gallery_type . '_gallery', $settings ) ) { |
| 141 | $type_fields = $settings[$gallery_type . '_gallery']['fields'] ?? []; |
| 142 | if ( empty( $type_fields ) && $rl->settings && method_exists( $rl->settings, 'get_setting_fields' ) ) { |
| 143 | $type_fields = $rl->settings->get_setting_fields( $gallery_type . '_gallery' ); |
| 144 | } |
| 145 | if ( ! empty( $type_fields ) ) { |
| 146 | $fields = $rl->frontend->get_unique_fields( $default_gallery_fields, $type_fields ); |
| 147 | } |
| 148 | // Add default gallery default values |
| 149 | foreach ( $default_gallery_fields as $field => $field_args ) { |
| 150 | $defaults[$gallery_type . '_gallery'][$field] = $field_args['default']; |
| 151 | } |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | // Adapt fields for gallery context |
| 156 | $adapted_fields = []; |
| 157 | foreach ( $fields as $field_key => $field ) { |
| 158 | // Skip fields that don't make sense in per-gallery context |
| 159 | if ( in_array( $field_key, [ 'active' ], true ) ) { |
| 160 | continue; |
| 161 | } |
| 162 | |
| 163 | $adapted_field = $field; |
| 164 | |
| 165 | // Mark disabled fields for Global |
| 166 | if ( $gallery_type === 'default' && isset( $disabled_fields[$field_key] ) ) { |
| 167 | $adapted_field['disabled'] = true; |
| 168 | $adapted_field['is_global_locked'] = true; |
| 169 | |
| 170 | // Propagate disabled to subfields for multiple fields |
| 171 | if ( isset( $field['type'] ) && $field['type'] === 'multiple' && ! empty( $field['fields'] ) ) { |
| 172 | foreach ( $field['fields'] as $subfield_key => $subfield ) { |
| 173 | $adapted_field['fields'][$subfield_key] = $subfield; |
| 174 | $adapted_field['fields'][$subfield_key]['disabled'] = true; |
| 175 | $adapted_field['fields'][$subfield_key]['is_global_locked'] = true; |
| 176 | } |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | // Adapt field names and defaults for gallery context |
| 181 | if ( isset( $field['default'] ) ) { |
| 182 | // Keep defaults as-is for now |
| 183 | } |
| 184 | |
| 185 | $adapted_fields[$field_key] = $adapted_field; |
| 186 | } |
| 187 | |
| 188 | // Add disabled notice for Global if there are disabled fields |
| 189 | if ( $gallery_type === 'default' && ! empty( $disabled_fields ) ) { |
| 190 | $settings_menu = ''; |
| 191 | $settings_tab_label = ''; |
| 192 | $settings_section = ''; |
| 193 | |
| 194 | if ( ! empty( $rl->settings_api ) && method_exists( $rl->settings_api, 'get_pages' ) ) { |
| 195 | $settings_pages = $rl->settings_api->get_pages(); |
| 196 | if ( ! empty( $settings_pages['settings'] ) ) { |
| 197 | $settings_menu = ! empty( $settings_pages['settings']['menu_title'] ) ? $settings_pages['settings']['menu_title'] : ''; |
| 198 | if ( ! empty( $settings_pages['settings']['tabs']['gallery']['label'] ) ) { |
| 199 | $settings_tab_label = $settings_pages['settings']['tabs']['gallery']['label']; |
| 200 | } |
| 201 | } |
| 202 | } |
| 203 | if ( ! empty( $settings[$default_gallery_key]['sections'] ) && is_array( $settings[$default_gallery_key]['sections'] ) ) { |
| 204 | $first_section = reset( $settings[$default_gallery_key]['sections'] ); |
| 205 | if ( ! empty( $first_section['title'] ) ) { |
| 206 | $settings_section = $first_section['title']; |
| 207 | } |
| 208 | } |
| 209 | |
| 210 | if ( $settings_section === '' && ! empty( $gallery_types[$default_gallery_type] ) ) { |
| 211 | if ( is_array( $gallery_types[$default_gallery_type] ) ) { |
| 212 | $settings_section = $gallery_types[$default_gallery_type]['label'] ?? $gallery_types[$default_gallery_type]['name'] ?? $default_gallery_type; |
| 213 | } else { |
| 214 | $settings_section = (string) $gallery_types[$default_gallery_type]; |
| 215 | } |
| 216 | } |
| 217 | |
| 218 | if ( $settings_section === '' ) { |
| 219 | $settings_section = ucwords( str_replace( '_', ' ', $default_gallery_key ) ); |
| 220 | } |
| 221 | |
| 222 | $settings_url = admin_url( 'admin.php?page=responsive-lightbox-settings&tab=gallery' ); |
| 223 | if ( $settings_menu === '' ) { |
| 224 | $settings_menu = __( 'Lightbox', 'responsive-lightbox' ); |
| 225 | } |
| 226 | if ( $settings_tab_label === '' ) { |
| 227 | $settings_tab_label = __( 'Galleries', 'responsive-lightbox' ); |
| 228 | } |
| 229 | |
| 230 | $disabled_notice = [ |
| 231 | 'type' => 'notice', |
| 232 | 'content' => '<div class="rl-gallery-disabled-notice"><p>' . wp_kses_post( sprintf( __( 'Settings below are controlled globally in %1$s → %2$s → %3$s.', 'responsive-lightbox' ), esc_html( $settings_menu ), esc_html( $settings_tab_label ), esc_html( $settings_section ) ) ) . '</p><a class="rl-gallery-disabled-notice-link" href="' . esc_url( $settings_url ) . '">' . esc_html( sprintf( __( 'Edit Global %s Settings ->', 'responsive-lightbox' ), $settings_section ) ) . '</a></div>', |
| 233 | 'class' => 'rl-gallery-field-disabled-notice' |
| 234 | ]; |
| 235 | |
| 236 | // Insert notice before the first disabled field using key-preserving method |
| 237 | $new_fields = []; |
| 238 | $notice_inserted = false; |
| 239 | foreach ( $adapted_fields as $key => $field ) { |
| 240 | if ( !$notice_inserted && isset( $field['is_global_locked'] ) && $field['is_global_locked'] ) { |
| 241 | $new_fields['disabled_notice'] = $disabled_notice; |
| 242 | $notice_inserted = true; |
| 243 | } |
| 244 | $new_fields[$key] = $field; |
| 245 | } |
| 246 | $adapted_fields = $new_fields; |
| 247 | } |
| 248 | |
| 249 | return $adapted_fields; |
| 250 | } |
| 251 | |
| 252 | } |
| 253 |