diff --git a/includes/og.field.inc b/includes/og.field.inc index ebe93ff..1493bb6 100644 --- a/includes/og.field.inc +++ b/includes/og.field.inc @@ -258,12 +258,13 @@ function og_property_info_alter($wrapper, $info) { function og_get_mocked_instance($instance, $field_mode) { $mocked_instance = $instance; $widget_type = $instance['settings']['behaviors']['og_widget'][$field_mode]['widget_type']; + $widget_settings = isset($instance['settings']['behaviors']['og_widget'][$field_mode]['widget_settings']) ? $instance['settings']['behaviors']['og_widget'][$field_mode]['widget_settings'] : array(); $mocked_instance['widget']['type'] = $widget_type; // Set the widget's module. $widget_info = field_info_widget_types($widget_type); $mocked_instance['widget']['module'] = $widget_info['module']; - $mocked_instance['widget']['settings'] = drupal_array_merge_deep($mocked_instance['widget']['settings'], $widget_info['settings']); + $mocked_instance['widget']['settings'] = drupal_array_merge_deep($widget_settings + $mocked_instance['widget']['settings'], $widget_info['settings']); // See OgSelectionHandler::buildEntityFieldQuery(). $mocked_instance['field_mode'] = $field_mode; diff --git a/plugins/entityreference/behavior/OgWidgetHandler.class.php b/plugins/entityreference/behavior/OgWidgetHandler.class.php index 51f137f..b290dfa 100644 --- a/plugins/entityreference/behavior/OgWidgetHandler.class.php +++ b/plugins/entityreference/behavior/OgWidgetHandler.class.php @@ -19,9 +19,11 @@ class OgWidgetHandler extends EntityReference_BehaviorHandler_Abstract { $settings += array( 'default' => array( 'widget_type' => 'options_select', + 'widget_settings' => array(), ), 'admin' => array( 'widget_type' => 'entityreference_autocomplete', + 'widget_settings' => array(), ), ); @@ -39,8 +41,10 @@ class OgWidgetHandler extends EntityReference_BehaviorHandler_Abstract { module_load_include('inc', 'field_ui', 'field_ui.admin'); $widget_types = field_ui_widget_type_options('entityreference'); unset($widget_types['og_complex']); + $field_info_widget_types = field_info_widget_types(); foreach ($field_types as $field_type => $value) { + $settings_id = 'og-' . $field_type . '-settings'; $form[$field_type]['widget_type'] = array( '#type' => 'select', '#title' => $value['title'], @@ -48,7 +52,36 @@ class OgWidgetHandler extends EntityReference_BehaviorHandler_Abstract { '#options' => $widget_types, '#default_value' => $settings[$field_type]['widget_type'], '#description' => $value['description'], + '#ajax' => array( + 'callback' => 'og_' . $field_type . '_settings_form_ajax', + 'wrapper' => $settings_id, + 'method' => 'replace', + 'event' => 'change', + ), ); + $form[$field_type]['widget_settings'] = array( + '#type' => 'fieldset', + '#title' => t('@title Settings', array('@title' => $value['title'])), + '#tree' => TRUE, + '#attributes' => array( + 'id' => $settings_id, + ), + ); + if ($settings[$field_type]['widget_type'] && !empty($field_info_widget_types[$settings[$field_type]['widget_type']])) { + $widget_type = $field_info_widget_types[$settings[$field_type]['widget_type']]; + $current_settings = isset($settings[$field_type]['widget_settings']) ? $settings[$field_type]['widget_settings'] : array(); + $fake_instance = array( + 'widget' => array( + 'type' => $settings[$field_type]['widget_type'], + 'module' => $widget_type['module'], + 'settings' => $current_settings, + ) + $instance['widget'], + ) + $instance; + $additions = module_invoke($widget_type['module'], 'field_widget_settings_form', $field, $fake_instance); + if ($additions) { + $form[$field_type]['widget_settings'] += $additions; + } + } } // Field access settings.