diff --git a/field_default_token.module b/field_default_token.module index 812e408..5ba54a4 100644 --- a/field_default_token.module +++ b/field_default_token.module @@ -85,7 +85,7 @@ function field_default_token_default_value_function($entity_type, $entity, $fiel } $items = $instance['default_value']; - foreach ($items as &$item) { + foreach ($items as $delta => &$item) { if (!is_array($item)) { $item = token_replace($item, $data, array('clear' => TRUE, 'sanitize' => FALSE)); if ($token_is_label) { @@ -103,6 +103,15 @@ function field_default_token_default_value_function($entity_type, $entity, $fiel $item[$column_name] = array_search($item[$column_name], $field['settings']['allowed_values']); } } + //disable auto filling for term widget with non existed taxonomy term + switch ($instance['widget']['type']) { + case 'taxonomy_autocomplete': + $term = taxonomy_term_load($item['tid']); + if (!is_object($term) || $term->vocabulary_machine_name != $item['vocabulary_machine_name']) { + unset($items[$delta]); + } + break; + } } } return $items; @@ -124,18 +133,38 @@ function field_default_token_form_field_ui_field_edit_form_alter(&$form, &$form_ } } - $options_widgets = array('options_select', 'options_buttons', 'options_onoff'); + //adds field for the selected widgets + $options_widgets = array( + 'options_select', + 'options_buttons', + 'options_onoff' + ); - if ((isset($instance['widget']['type'])) && (in_array($instance['widget']['type'], $options_widgets))) { - $default_value = ''; + //@TODO add support for entityreference fields + $reference_widgets = array( + 'taxonomy_autocomplete', + ); + $widgets = array_merge($options_widgets, $reference_widgets); + + if (isset($instance['widget']['type']) && in_array($instance['widget']['type'], $widgets)) { + + $default_value = ''; if (!empty($instance['default_value'])) { foreach ($instance['default_value'] as $values) { - foreach ($values as $value) { - if (strpos($value, '[') !== FALSE) { - $default_value = $value; + if (is_array($values)) { + foreach ($values as $value) { + if (is_string($value) && strpos($value, '[') !== FALSE) { + $default_value = $value; + } } } + else { + if (is_string($values) && strpos($values, '[') !== FALSE) { + $default_value = $values; + } + } + } } @@ -147,6 +176,14 @@ function field_default_token_form_field_ui_field_edit_form_alter(&$form, &$form_ '#default_value' => $default_value, '#weight' => 100, ); + + // Replace submit callback to release proper submission + // in Field UI forms. + foreach ($form['#submit'] as &$submit_callback) { + if ($submit_callback == 'field_ui_field_edit_form_submit') { + $submit_callback = 'field_default_token_field_ui_field_edit_form_submit'; + } + } } if (isset($form['instance']['default_value_widget'])) { @@ -316,6 +353,7 @@ function field_default_token_field_ui_field_edit_form_validate($form, &$form_sta $items = array(); field_default_extract_form_values(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state); + //disable validation for text and textarea widgets foreach ($items as $item) { if (is_array($item)) { foreach ($item as $value) { @@ -329,7 +367,17 @@ function field_default_token_field_ui_field_edit_form_validate($form, &$form_sta } } - // Validate the value and report errors. + /** + * disable validation for remaining widgets which use token + * and stores it in the 'default_value_token' field + * */ + if (!empty($form_state['values']['default_value_token'])) { + if (strpos($form_state['values']['default_value_token'], '[')) { + return; + } + } + + //Validate the value and report errors. $errors = array(); $function = $field['module'] . '_field_validate'; if (function_exists($function)) { @@ -345,6 +393,77 @@ function field_default_token_field_ui_field_edit_form_validate($form, &$form_sta } } +/** + * Form submit handler for field_ui_field_edit_form. + * + * Replacement for field_ui_field_edit_form_submit(). + */ +function field_default_token_field_ui_field_edit_form_submit($form, &$form_state) { + $instance = $form_state['values']['instance']; + $field = $form_state['values']['field']; + + // Update any field settings that have changed. + $field_source = field_info_field($instance['field_name']); + $field = array_merge($field_source, $field); + try { + field_update_field($field); + } + catch (Exception $e) { + drupal_set_message(t('Attempt to update field %label failed: %message.', array('%label' => $instance['label'], '%message' => $e->getMessage())), 'error'); + return; + } + + // Handle the default value. + if (isset($form['instance']['default_value_widget'])) { + $element = $form['instance']['default_value_widget']; + + // Extract field values. + $items = array(); + field_default_extract_form_values(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state); + field_default_submit(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state); + + $instance['default_value'] = $items ? $items : NULL; + if (!empty($form_state['values']['default_value_token'])) { + switch ($instance['widget']['type']) { + case 'options_select': + case 'options_buttons': + case 'options_onoff': + if (!empty($items)) { + foreach ($items as $delta => $values) { + foreach ($values as $key => $value) { + $instance['default_value'][$delta][$key] = $form_state['values']['default_value_token']; + } + } + } + break; + case 'taxonomy_autocomplete': + foreach ($field['settings']['allowed_values'] as $settings) { + // If no parent is specified, check if the term is in the vocabulary. + if (isset($settings['vocabulary'])) { + $vocabulary_machine_name = $settings['vocabulary']; + $vocabulary = taxonomy_vocabulary_machine_name_load($vocabulary_machine_name); + } + } + $instance['default_value'][] = array( + 'tid' => $form_state['values']['default_value_token'], + 'name' => $form_state['values']['default_value_token'], + 'vocabulary_machine_name' => $vocabulary_machine_name, + ); + break; + } + } + } + + // Retrieve the stored instance settings to merge with the incoming values. + $instance_source = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']); + $instance = array_merge($instance_source, $instance); + field_update_instance($instance); + + drupal_set_message(t('Saved %label configuration.', array('%label' => $instance['label']))); + + $form_state['redirect'] = field_ui_next_destination($instance['entity_type'], $instance['bundle']); +} + /** * Individual number element validation handler for field_ui_field_edit_form. *