diff options
author | Angie Byron <webchick@24967.no-reply.drupal.org> | 2009-11-20 04:51:27 +0000 |
---|---|---|
committer | Angie Byron <webchick@24967.no-reply.drupal.org> | 2009-11-20 04:51:27 +0000 |
commit | 9b71489a48a266df8efc1e462ec4dbd200e60ddf (patch) | |
tree | 2a10711c6351e0144977424949a43038dd3d067c /modules/field/field.form.inc | |
parent | 457a109406d80c2af636ec22bb2d858429c4a871 (diff) | |
download | brdo-9b71489a48a266df8efc1e462ec4dbd200e60ddf.tar.gz brdo-9b71489a48a266df8efc1e462ec4dbd200e60ddf.tar.bz2 |
#636834 by yched: Fixed field revision data when user has no 'edit' access on the field (with tests).
Diffstat (limited to 'modules/field/field.form.inc')
-rw-r--r-- | modules/field/field.form.inc | 193 |
1 files changed, 103 insertions, 90 deletions
diff --git a/modules/field/field.form.inc b/modules/field/field.form.inc index 372b712b8..8b893ed32 100644 --- a/modules/field/field.form.inc +++ b/modules/field/field.form.inc @@ -15,21 +15,13 @@ function field_default_form($obj_type, $object, $field, $instance, $langcode, $i if ($object) { list($id, , ) = entity_extract_ids($obj_type, $object); } - $addition = array(); $field_name = $field['field_name']; - // If the field is not accessible, don't add anything. The field value will - // be left unchanged on update, or considered empty on insert (default value - // will be inserted if applicable). - if (!field_access('edit', $field, $obj_type, $object)) { - return $addition; - } - // Put field information at the top of the form, so that it can be easily // retrieved. - // Note : widgets and other form handling code should *always* fetch - // field and instance information from $form['#fields'] rather than from + // Note : widgets and other form handling code should *always* fetch field + // and instance information from $form['#fields'] rather than from // field_info_field(). This lets us build forms for 'variants' of a field, // for instance on admin screens. $form['#fields'][$field_name] = array( @@ -42,54 +34,58 @@ function field_default_form($obj_type, $object, $field, $instance, $langcode, $i $items = field_get_default_value($obj_type, $object, $field, $instance, $langcode); } - $form_element = array(); + $field_elements = array(); - // If field module handles multiple values for this form element, - // and we are displaying an individual element, process the multiple value - // form. - if (!isset($get_delta) && field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) { - $form_element = field_multiple_value_form($field, $instance, $langcode, $items, $form, $form_state); - } - // If the widget is handling multiple values (e.g Options), - // or if we are displaying an individual element, just get a single form - // element and make it the $delta value. - else { - $delta = isset($get_delta) ? $get_delta : 0; - $function = $instance['widget']['module'] . '_field_widget'; - if (function_exists($function)) { - $element = array( - '#object_type' => $instance['object_type'], - '#bundle' => $instance['bundle'], - '#field_name' => $field_name, - '#columns' => array_keys($field['columns']), - '#title' => check_plain(t($instance['label'])), - '#description' => field_filter_xss($instance['description']), - // Only the first widget should be required. - '#required' => $delta == 0 && $instance['required'], - '#delta' => $delta, - ); - if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) { - // If we're processing a specific delta value for a field where the - // field module handles multiples, set the delta in the result. - // For fields that handle their own processing, we can't make assumptions - // about how the field is structured, just merge in the returned value. - if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) { - $form_element[$delta] = $element; - } - else { - $form_element = $element; + if (field_access('edit', $field, $obj_type, $object)) { + // If field module handles multiple values for this form element, and we + // are displaying an individual element, process the multiple value form. + if (!isset($get_delta) && field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) { + $field_elements = field_multiple_value_form($field, $instance, $langcode, $items, $form, $form_state); + } + // If the widget is handling multiple values (e.g Options), or if we are + // displaying an individual element, just get a single form element and + // make it the $delta value. + else { + $delta = isset($get_delta) ? $get_delta : 0; + $function = $instance['widget']['module'] . '_field_widget'; + if (function_exists($function)) { + $element = array( + '#object_type' => $instance['object_type'], + '#bundle' => $instance['bundle'], + '#field_name' => $field_name, + '#columns' => array_keys($field['columns']), + '#title' => check_plain(t($instance['label'])), + '#description' => field_filter_xss($instance['description']), + // Only the first widget should be required. + '#required' => $delta == 0 && $instance['required'], + '#delta' => $delta, + ); + if ($element = $function($form, $form_state, $field, $instance, $langcode, $items, $delta, $element)) { + // If we're processing a specific delta value for a field where the + // field module handles multiples, set the delta in the result. + // For fields that handle their own processing, we can't make + // assumptions about how the field is structured, just merge in the + // returned element. + if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) { + $field_elements[$delta] = $element; + } + else { + $field_elements = $element; + } } } } } - if ($form_element) { - // Add the field form element as a child keyed by language code to match the - // field data structure: $object->{$field_name}[$langcode][$delta][$column]. - // The '#language' key can be used to access the field's form element when - // $langcode is unknown. The #weight property is inherited from the field's - // form element. - // Also aid in theming of field widgets by rendering a classified container. + if ($field_elements) { + // Add the field form element as a child keyed by language code to match + // the field data structure: + // $object->{$field_name}[$langcode][$delta][$column]. + // The '#language' key can be used to access the field's form element + // when $langcode is unknown. The #weight property is inherited from the + // field's form element. + // Also aid in theming of field widgets by rendering a classified + // container. $addition[$field_name] = array( '#type' => 'container', '#attributes' => array( @@ -102,12 +98,27 @@ function field_default_form($obj_type, $object, $field, $instance, $langcode, $i '#tree' => TRUE, '#weight' => $instance['widget']['weight'], '#language' => $langcode, - $langcode => $form_element, + $langcode => $field_elements, + ); + } + else { + // The field is not accessible, or the widget did not return anything. Make + // sure the items are available in the submitted form values. + foreach ($items as $delta => $item) { + $field_elements[$delta] = array( + '#type' => 'value', + '#value' => $item, + ); + } + $addition[$field_name] = array( + '#tree' => TRUE, + '#language' => $langcode, + $langcode => $field_elements, ); - - $form['#fields'][$field_name]['form_path'] = array($field_name); } + $form['#fields'][$field_name]['form_path'] = array($field_name); + return $addition; } @@ -122,6 +133,7 @@ function field_default_form($obj_type, $object, $field, $instance, $langcode, $i function field_multiple_value_form($field, $instance, $langcode, $items, &$form, &$form_state) { $field_name = $field['field_name']; + // Determine the number of widgets to display. switch ($field['cardinality']) { case FIELD_CARDINALITY_UNLIMITED: $filled_items = field_set_empty($field, $items); @@ -141,20 +153,8 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form, $title = check_plain(t($instance['label'])); $description = field_filter_xss(t($instance['description'])); - - $wrapper_id = str_replace('_', '-', $field_name) . '-wrapper'; - - $form_element = array( - '#theme' => 'field_multiple_value_form', - '#field_name' => $field['field_name'], - '#cardinality' => $field['cardinality'], - '#title' => $title, - '#required' => $instance['required'], - '#description' => $description, - '#prefix' => '<div id="' . $wrapper_id . '">', - '#suffix' => '</div>', - '#max_delta' => $max, - ); + $wrapper_id = drupal_html_class($field_name) . '-wrapper'; + $field_elements = array(); $function = $instance['widget']['module'] . '_field_widget'; if (function_exists($function)) { @@ -186,34 +186,47 @@ function field_multiple_value_form($field, $instance, $langcode, $items, &$form, '#weight' => 100, ); } - $form_element[$delta] = $element; + $field_elements[$delta] = $element; } } - // Add 'add more' button, if not working with a programmed form. - if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) { - $form_element['add_more'] = array( - '#type' => 'submit', - '#name' => $field_name . '_add_more', - '#value' => t('Add another item'), - '#attributes' => array('class' => array('field-add-more-submit')), - // Submit callback for disabled JavaScript. - '#submit' => array('field_add_more_submit'), - '#ajax' => array( - 'callback' => 'field_add_more_js', - 'wrapper' => $wrapper_id, - 'method' => 'replace', - 'effect' => 'fade', - ), - // The field_add_more_submit() and field_add_more_js() handlers will - // find the relevant field using those entries. - '#field_name' => $field_name, - '#language' => $langcode, + if ($field_elements) { + $field_elements += array( + '#theme' => 'field_multiple_value_form', + '#field_name' => $field['field_name'], + '#cardinality' => $field['cardinality'], + '#title' => $title, + '#required' => $instance['required'], + '#description' => $description, + '#prefix' => '<div id="' . $wrapper_id . '">', + '#suffix' => '</div>', + '#max_delta' => $max, ); + // Add 'add more' button, if not working with a programmed form. + if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) { + $field_elements['add_more'] = array( + '#type' => 'submit', + '#name' => $field_name . '_add_more', + '#value' => t('Add another item'), + '#attributes' => array('class' => array('field-add-more-submit')), + // Submit callback for disabled JavaScript. + '#submit' => array('field_add_more_submit'), + '#ajax' => array( + 'callback' => 'field_add_more_js', + 'wrapper' => $wrapper_id, + 'method' => 'replace', + 'effect' => 'fade', + ), + // The field_add_more_submit() and field_add_more_js() handlers will + // find the relevant field using those entries. + '#field_name' => $field_name, + '#language' => $langcode, + ); + } } } - return $form_element; + return $field_elements; } /** |