diff --git a/entityreference.install b/entityreference.install index cc7bce5..c06fcbc 100644 --- a/entityreference.install +++ b/entityreference.install @@ -163,3 +163,38 @@ function entityreference_update_7002() { )); } } + +/** + * Move selection handler config to field instance settings. + */ +function entityreference_update_7003() { + // Enable ctools. + if (!module_enable(array('ctools'))) { + throw new DrupalUpdateException('This version of Entity Reference requires ctools, but it could not be enabled.'); + } + + // Get the list of fields of type 'entityreference'. + foreach (field_info_fields() as $field_name => $field) { + if ($field['type'] == 'entityreference') { + // Update the instances configuration. + foreach ($field['bundles'] as $entity_type => $bundles) { + foreach ($bundles as $bundle) { + $instance = field_info_instance($entity_type, $field_name, $bundle); + $updated = FALSE; + if (isset($field['settings']['handler']) && empty($instance['settings']['handler'])) { + $instance['settings']['handler'] = $field['settings']['handler']; + $updated = TRUE; + } + $instance['settings']['handler_settings'] = $field['settings']['handler_settings']; + if (isset($field['settings']['handler_settings']) && empty($instance['settings']['handler_settings'])) { + $instance['settings']['handler_settings'] = $field['settings']['handler_settings']; + $updated = TRUE; + } + if ($updated) { + field_update_instance($instance); + } + } + } + } + } +} diff --git a/entityreference.module b/entityreference.module index 80191d7..4f1e9f7 100644 --- a/entityreference.module +++ b/entityreference.module @@ -55,12 +55,13 @@ function entityreference_field_info() { 'settings' => array( // Default to the core target entity type node. 'target_type' => 'node', + ), + 'instance_settings' => array( // The handler for this field. 'handler' => 'base', // The handler settings. 'handler_settings' => array(), ), - 'instance_settings' => array(), 'default_widget' => 'entityreference_autocomplete', 'default_formatter' => 'entityreference_label', 'property_callbacks' => array('entityreference_field_property_callback'), @@ -143,6 +144,7 @@ function entityreference_get_behavior_handlers($field, $instance = NULL) { $field['settings'] += array('behaviors' => array()); $object_cache[$field['field_name']] = array(); + // @todo Is this check is correct? Should it be $field['settings']['behaviors'] ? $behaviors = !empty($field['settings']['handler_settings']['behaviors']) ? $field['settings']['handler_settings']['behaviors'] : array(); if (!empty($instance['settings']['behaviors'])) { $behaviors = array_merge($behaviors, $instance['settings']['behaviors']); @@ -185,7 +187,7 @@ function _entityreference_get_behavior_handler($behavior) { */ function entityreference_get_selection_handler($field, $instance = NULL, $entity_type = NULL, $entity = NULL) { ctools_include('plugins'); - $handler = $field['settings']['handler']; + $handler = $instance['settings']['handler']; $class = ctools_plugin_load_class('entityreference', 'selection', $handler, 'class'); if (class_exists($class)) { @@ -427,48 +429,6 @@ function _entityreference_field_settings_process($form, $form_state) { '#limit_validation_errors' => array(), ); - ctools_include('plugins'); - $handlers = ctools_get_plugins('entityreference', 'selection'); - uasort($handlers, 'ctools_plugin_sort'); - $handlers_options = array(); - foreach ($handlers as $handler => $handler_info) { - $handlers_options[$handler] = check_plain($handler_info['title']); - } - - $form['handler'] = array( - '#type' => 'fieldset', - '#title' => t('Entity selection'), - '#tree' => TRUE, - '#process' => array('_entityreference_form_process_merge_parent'), - ); - - $form['handler']['handler'] = array( - '#type' => 'select', - '#title' => t('Mode'), - '#options' => $handlers_options, - '#default_value' => $settings['handler'], - '#required' => TRUE, - '#ajax' => TRUE, - '#limit_validation_errors' => array(), - ); - $form['handler_submit'] = array( - '#type' => 'submit', - '#value' => t('Change handler'), - '#limit_validation_errors' => array(), - '#attributes' => array( - 'class' => array('js-hide'), - ), - '#submit' => array('entityreference_settings_ajax_submit'), - ); - - $form['handler']['handler_settings'] = array( - '#type' => 'container', - '#attributes' => array('class' => array('entityreference-settings')), - ); - - $handler = entityreference_get_selection_handler($field, $instance); - $form['handler']['handler_settings'] += $handler->settingsForm($field, $instance); - _entityreference_get_behavior_elements($form, $field, $instance, 'field'); if (!empty($form['behaviors'])) { $form['behaviors'] += array( @@ -550,6 +510,49 @@ function entityreference_field_instance_settings_form($field, $instance) { function _entityreference_field_instance_settings_form($form, $form_state) { $field = isset($form_state['entityreference']['field']) ? $form_state['entityreference']['field'] : $form['#field']; $instance = isset($form_state['entityreference']['instance']) ? $form_state['entityreference']['instance'] : $form['#instance']; + $settings = $instance['settings']; + + ctools_include('plugins'); + $handlers = ctools_get_plugins('entityreference', 'selection'); + uasort($handlers, 'ctools_plugin_sort'); + $handlers_options = array(); + foreach ($handlers as $handler => $handler_info) { + $handlers_options[$handler] = check_plain($handler_info['title']); + } + + $form['handler'] = array( + '#type' => 'fieldset', + '#title' => t('Entity selection'), + '#tree' => TRUE, + '#process' => array('_entityreference_form_process_merge_parent'), + ); + + $form['handler']['handler'] = array( + '#type' => 'select', + '#title' => t('Mode'), + '#options' => $handlers_options, + '#default_value' => $settings['handler'], + '#required' => TRUE, + '#ajax' => TRUE, + '#limit_validation_errors' => array(), + ); + $form['handler_submit'] = array( + '#type' => 'submit', + '#value' => t('Change handler'), + '#limit_validation_errors' => array(), + '#attributes' => array( + 'class' => array('js-hide'), + ), + '#submit' => array('entityreference_settings_ajax_submit'), + ); + + $form['handler']['handler_settings'] = array( + '#type' => 'container', + '#attributes' => array('class' => array('entityreference-settings')), + ); + + $handler = entityreference_get_selection_handler($field, $instance); + $form['handler']['handler_settings'] += $handler->settingsForm($field, $instance); _entityreference_get_behavior_elements($form, $field, $instance, 'instance'); if (!empty($form['behaviors'])) { diff --git a/plugins/selection/EntityReference_SelectionHandler_Generic.class.php b/plugins/selection/EntityReference_SelectionHandler_Generic.class.php index 902c55c..bb835b3 100644 --- a/plugins/selection/EntityReference_SelectionHandler_Generic.class.php +++ b/plugins/selection/EntityReference_SelectionHandler_Generic.class.php @@ -40,9 +40,10 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select */ public static function settingsForm($field, $instance) { $entity_info = entity_get_info($field['settings']['target_type']); + $settings = $instance['settings']; // Merge-in default values. - $field['settings']['handler_settings'] += array( + $settings['handler_settings'] += array( 'target_bundles' => array(), 'sort' => array( 'type' => 'none', @@ -59,7 +60,7 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select '#type' => 'checkboxes', '#title' => t('Target bundles'), '#options' => $bundles, - '#default_value' => $field['settings']['handler_settings']['target_bundles'], + '#default_value' => $settings['handler_settings']['target_bundles'], '#size' => 6, '#multiple' => TRUE, '#description' => t('The bundles of the entity type that can be referenced. Optional, leave empty for all bundles.'), @@ -83,7 +84,7 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select ), '#ajax' => TRUE, '#limit_validation_errors' => array(), - '#default_value' => $field['settings']['handler_settings']['sort']['type'], + '#default_value' => $settings['handler_settings']['sort']['type'], ); $form['sort']['settings'] = array( @@ -92,9 +93,9 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select '#process' => array('_entityreference_form_process_merge_parent'), ); - if ($field['settings']['handler_settings']['sort']['type'] == 'property') { + if ($settings['handler_settings']['sort']['type'] == 'property') { // Merge-in default values. - $field['settings']['handler_settings']['sort'] += array( + $settings['handler_settings']['sort'] += array( 'property' => NULL, ); @@ -103,17 +104,17 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select '#title' => t('Sort property'), '#required' => TRUE, '#options' => drupal_map_assoc($entity_info['schema_fields_sql']['base table']), - '#default_value' => $field['settings']['handler_settings']['sort']['property'], + '#default_value' => $settings['handler_settings']['sort']['property'], ); } - elseif ($field['settings']['handler_settings']['sort']['type'] == 'field') { + elseif ($settings['handler_settings']['sort']['type'] == 'field') { // Merge-in default values. - $field['settings']['handler_settings']['sort'] += array( + $settings['handler_settings']['sort'] += array( 'field' => NULL, ); $fields = array(); - foreach (field_info_instances($field['settings']['target_type']) as $bundle_name => $bundle_instances) { + foreach (field_info_instances($settings['target_type']) as $bundle_name => $bundle_instances) { foreach ($bundle_instances as $instance_name => $instance_info) { $field_info = field_info_field($instance_name); foreach ($field_info['columns'] as $column_name => $column_info) { @@ -127,13 +128,13 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select '#title' => t('Sort field'), '#required' => TRUE, '#options' => $fields, - '#default_value' => $field['settings']['handler_settings']['sort']['field'], + '#default_value' => $settings['handler_settings']['sort']['field'], ); } - if ($field['settings']['handler_settings']['sort']['type'] != 'none') { + if ($settings['handler_settings']['sort']['type'] != 'none') { // Merge-in default values. - $field['settings']['handler_settings']['sort'] += array( + $settings['handler_settings']['sort'] += array( 'direction' => 'ASC', ); @@ -145,7 +146,7 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select 'ASC' => t('Ascending'), 'DESC' => t('Descending'), ), - '#default_value' => $field['settings']['handler_settings']['sort']['direction'], + '#default_value' => $settings['handler_settings']['sort']['direction'], ); } @@ -241,8 +242,8 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select protected function buildEntityFieldQuery($match = NULL, $match_operator = 'CONTAINS') { $query = new EntityFieldQuery(); $query->entityCondition('entity_type', $this->field['settings']['target_type']); - if (!empty($this->field['settings']['handler_settings']['target_bundles'])) { - $query->entityCondition('bundle', $this->field['settings']['handler_settings']['target_bundles'], 'IN'); + if (!empty($this->instance['settings']['handler_settings']['target_bundles'])) { + $query->entityCondition('bundle', $this->instance['settings']['handler_settings']['target_bundles'], 'IN'); } if (isset($match)) { $entity_info = entity_get_info($this->field['settings']['target_type']); @@ -258,8 +259,8 @@ class EntityReference_SelectionHandler_Generic implements EntityReference_Select $query->addMetaData('entityreference_selection_handler', $this); // Add the sort option. - if (!empty($this->field['settings']['handler_settings']['sort'])) { - $sort_settings = $this->field['settings']['handler_settings']['sort']; + if (!empty($this->instance['settings']['handler_settings']['sort'])) { + $sort_settings = $this->instance['settings']['handler_settings']['sort']; if ($sort_settings['type'] == 'property') { $query->propertyOrderBy($sort_settings['property'], $sort_settings['direction']); } @@ -539,7 +540,7 @@ class EntityReference_SelectionHandler_Generic_taxonomy_term extends EntityRefer // We imitate core by calling taxonomy_get_tree(). $entity_info = entity_get_info('taxonomy_term'); - $bundles = !empty($this->field['settings']['handler_settings']['target_bundles']) ? $this->field['settings']['handler_settings']['target_bundles'] : array_keys($entity_info['bundles']); + $bundles = !empty($this->instance['settings']['handler_settings']['target_bundles']) ? $this->instance['settings']['handler_settings']['target_bundles'] : array_keys($entity_info['bundles']); foreach ($bundles as $bundle) { if ($vocabulary = taxonomy_vocabulary_machine_name_load($bundle)) { diff --git a/plugins/selection/EntityReference_SelectionHandler_Views.class.php b/plugins/selection/EntityReference_SelectionHandler_Views.class.php index 859e1e1..19f8de2 100644 --- a/plugins/selection/EntityReference_SelectionHandler_Views.class.php +++ b/plugins/selection/EntityReference_SelectionHandler_Views.class.php @@ -21,7 +21,7 @@ class EntityReference_SelectionHandler_Views implements EntityReference_Selectio * Implements EntityReferenceHandler::settingsForm(). */ public static function settingsForm($field, $instance) { - $view_settings = empty($field['settings']['handler_settings']['view']) ? '' : $field['settings']['handler_settings']['view']; + $view_settings = empty($instance['settings']['handler_settings']['view']) ? '' : $instance['settings']['handler_settings']['view']; $displays = views_get_applicable_views('entityreference display'); // Filter views that list the entity type we want, and group the separate // displays by view. @@ -72,10 +72,8 @@ class EntityReference_SelectionHandler_Views implements EntityReference_Selectio } protected function initializeView($match = NULL, $match_operator = 'CONTAINS', $limit = 0, $ids = NULL) { - $view_name = $this->field['settings']['handler_settings']['view']['view_name']; - $display_name = $this->field['settings']['handler_settings']['view']['display_name']; - $args = $this->field['settings']['handler_settings']['view']['args']; - $entity_type = $this->field['settings']['target_type']; + $view_name = $this->instance['settings']['handler_settings']['view']['view_name']; + $display_name = $this->instance['settings']['handler_settings']['view']['display_name']; // Check that the view is valid and the display still exists. $this->view = views_get_view($view_name); @@ -103,8 +101,8 @@ class EntityReference_SelectionHandler_Views implements EntityReference_Selectio * Implements EntityReferenceHandler::getReferencableEntities(). */ public function getReferencableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) { - $display_name = $this->field['settings']['handler_settings']['view']['display_name']; - $args = $this->field['settings']['handler_settings']['view']['args']; + $display_name = $this->instance['settings']['handler_settings']['view']['display_name']; + $args = $this->instance['settings']['handler_settings']['view']['args']; $result = array(); if ($this->initializeView($match, $match_operator, $limit)) { // Get the results. @@ -132,8 +130,8 @@ class EntityReference_SelectionHandler_Views implements EntityReference_Selectio } function validateReferencableEntities(array $ids) { - $display_name = $this->field['settings']['handler_settings']['view']['display_name']; - $args = $this->field['settings']['handler_settings']['view']['args']; + $display_name = $this->instance['settings']['handler_settings']['view']['display_name']; + $args = $this->instance['settings']['handler_settings']['view']['args']; $result = array(); if ($this->initializeView(NULL, 'CONTAINS', 0, $ids)) { // Get the results.