? FIELD-TO-COLUMN-PARTIAL.patch ? Makefile ? constants.pl ? d6-50-nodes.sql.gz ? d7-50-nodes-new.sql.gz ? d7-50-nodes.sql.gz ? head.kpf ? patches ? modules/field/field.delete.inc ? modules/field/modules/combo ? scripts/OLD-generate-autoload.pl ? scripts/generate-autoload.pl ? sites/all/modules/cck ? sites/all/modules/devel ? sites/all/modules/pbs ? sites/all/modules/taint ? sites/default/files ? sites/default/settings.php Index: modules/field/field.api.php =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.api.php,v retrieving revision 1.14 diff -u -F^[fc] -r1.14 field.api.php --- modules/field/field.api.php 6 Jun 2009 16:17:30 -0000 1.14 +++ modules/field/field.api.php 9 Jun 2009 15:50:25 -0000 @@ -602,8 +602,8 @@ function hook_field_attach_pre_update($o * hook_field_attach_pre_update() to bypass the regular storage engine, to * handle field queries. * - * @param $field_name - * The name of the field to query. + * @param $field_id + * The id of the field to query. * @param $conditions * See field_attach_query(). * A storage module that doesn't support querying a given column should raise @@ -623,7 +623,7 @@ function hook_field_attach_pre_update($o * The $skip_field parameter should be set to TRUE if the query has been * handled. */ -function hook_field_attach_pre_query($field_name, $conditions, $result_format, $age, &$skip_field) { +function hook_field_attach_pre_query($field_id, $conditions, $result_format, $age, &$skip_field) { } /** @@ -781,7 +781,7 @@ function hook_field_storage_delete_revis * Handle a field query. * * @param $field_name - * The name of the field to query. + * The id of the field to query. * @param $conditions * See field_attach_query(). * A storage module that doesn't support querying a given column should raise @@ -794,7 +794,7 @@ function hook_field_storage_delete_revis * @return * See field_attach_query(). */ -function hook_field_storage_query($field_name, $conditions, $result_format, $age) { +function hook_field_storage_query($field_id, $conditions, $result_format, $age) { } /** @@ -829,21 +829,21 @@ function hook_field_storage_create_field /** * Act on deletion of a field. * - * @param $field_name - * The name of the field being deleted. + * @param $field_id + * The field id being deleted. */ -function hook_field_storage_delete_field($field_name) { +function hook_field_storage_delete_field($field_id) { } /** * Act on deletion of a field instance. * - * @param $field_name - * The name of the field in the new instance. + * @param $field_id + * The field id of the new instance. * @param $bundle * The name of the bundle in the new instance. */ -function hook_field_storage_delete_instance($field_name, $bundle) { +function hook_field_storage_delete_instance($field_id, $bundle) { } /** Index: modules/field/field.attach.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.attach.inc,v retrieving revision 1.22 diff -u -F^[fc] -r1.22 field.attach.inc --- modules/field/field.attach.inc 7 Jun 2009 00:00:57 -0000 1.22 +++ modules/field/field.attach.inc 9 Jun 2009 15:50:25 -0000 @@ -184,7 +184,7 @@ function _field_invoke($op, $obj_type, $ // When in 'single field' mode, only act on the specified field. if (empty($options['field_name']) || $options['field_name'] == $field_name) { - $field = field_info_field($field_name); + $field = field_info_field($instance['field_id']); // Extract the field values into a separate variable, easily accessed by // hook implementations. @@ -236,8 +236,8 @@ function _field_invoke($op, $obj_type, $ * Currently always NULL. * @param $options * An associative array of additional options, with the following keys: - * - 'field_name' - * The name of the field whose operation should be invoked. By default, the + * - 'field_id' + * The id of the field whose operation should be invoked. By default, the * operation is invoked on all the fields in the objects' bundles. * - 'default' * A boolean value, specifying which implementation of the operation should @@ -269,19 +269,20 @@ function _field_invoke_multiple($op, $ob foreach ($objects as $object) { list($id, $vid, $bundle) = field_attach_extract_ids($obj_type, $object); foreach (field_info_instances($bundle) as $instance) { - $field_name = $instance['field_name']; // When in 'single field' mode, only act on the specified field. - if (empty($options['field_name']) || $options['field_name'] == $field_name) { + $field_id = $instance['field_id']; + if (empty($options['field_id']) || $options['field_id'] == $field_id) { // Add the field to the list of fields to invoke the hook on. - if (!isset($fields[$field_name])) { - $fields[$field_name] = field_info_field($field_name); + if (!isset($fields[$field_id])) { + $fields[$field_id] = field_info_field($instance['field_id']); } // Group the corresponding instances and objects. - $grouped_instances[$field_name][$id] = $instance; - $grouped_objects[$field_name][$id] = $objects[$id]; + $grouped_instances[$field_id][$id] = $instance; + $grouped_objects[$field_id][$id] = $objects[$id]; // Extract the field values into a separate variable, easily accessed // by hook implementations. - $grouped_items[$field_name][$id] = isset($object->$field_name) ? $object->$field_name : array(); + $field_name = $instance['field_name']; + $grouped_items[$field_id][$id] = isset($object->$field_name) ? $object->$field_name : array(); } } // Initialize the return value for each object. @@ -289,10 +290,10 @@ function _field_invoke_multiple($op, $ob } // For each field, invoke the field hook and collect results. - foreach ($fields as $field_name => $field) { + foreach ($fields as $field_id => $field) { $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op; if (drupal_function_exists($function)) { - $results = $function($obj_type, $grouped_objects[$field_name], $field, $grouped_instances[$field_name], $grouped_items[$field_name], $a, $b); + $results = $function($obj_type, $grouped_objects[$field['id']], $field, $grouped_instances[$field['id']], $grouped_items[$field['id']], $a, $b); if (isset($results)) { // Collect results by object. // For hooks with array results, we merge results together. @@ -310,9 +311,10 @@ function _field_invoke_multiple($op, $ob // Populate field values back in the objects, but avoid replacing missing // fields with an empty array (those are not equivalent on update). - foreach ($grouped_objects[$field_name] as $id => $object) { - if ($grouped_items[$field_name][$id] !== array() || property_exists($object, $field_name)) { - $object->$field_name = $grouped_items[$field_name][$id]; + $field_name = $field['field_name']; + foreach ($grouped_objects[$field['id']] as $id => $object) { + if ($grouped_items[$field['id']][$id] !== array() || property_exists($object, $field_name)) { + $object->$field_name = $grouped_items[$field['id']][$id]; } } } @@ -735,7 +737,7 @@ function field_attach_delete_revision($o * might therefore differ from what could be expected by looking at a regular, * fully loaded object. * - * @param $field_name + * @param $field_id * The name of the field to query. * @param $conditions * An array of query conditions. Each condition is a numerically indexed @@ -744,7 +746,7 @@ function field_attach_delete_revision($o * with all operators below. A FieldQueryException will be raised if an * unsupported condition is specified. * Supported columns: - * - any of the columns for $field_name's field type: condition on field + * - any of the columns for $field_id's field type: condition on field * value, * - 'type': condition on object type (e.g. 'node', 'user'...), * - 'bundle': condition on object bundle (e.g. node type), @@ -788,7 +790,7 @@ function field_attach_delete_revision($o * values depend on the $result_format parameter: * - FIELD_QUERY_RETURN_IDS: the object id. * - FIELD_QUERY_RETURN_VALUES: a pseudo-object with values for the - * $field_name field. This only includes values matching the conditions, + * $field_id field. This only includes values matching the conditions, * and thus might not contain all actual values and actual delta sequence * (although values oprder is preserved). * The pseudo-objects only include properties that the Field API knows @@ -797,13 +799,13 @@ function field_attach_delete_revision($o * Throws a FieldQueryException if the field's storage doesn't support the * specified conditions. */ -function field_attach_query($field_name, $conditions, $result_format = FIELD_QUERY_RETURN_IDS, $age = FIELD_LOAD_CURRENT) { +function field_attach_query($field_id, $conditions, $result_format = FIELD_QUERY_RETURN_IDS, $age = FIELD_LOAD_CURRENT) { // Give a chance to 3rd party modules that bypass the storage engine to // handle the query. $skip_field = FALSE; foreach (module_implements('field_attach_pre_query') as $module) { $function = $module . '_field_attach_pre_query'; - $results = $function($field_name, $conditions, $result_format, $age, $skip_field); + $results = $function($field_id, $conditions, $result_format, $age, $skip_field); // Stop as soon as a module claims it handled the query. if ($skip_field) { break; @@ -811,15 +813,16 @@ function field_attach_query($field_name, } // If the request hasn't been handled, let the storage engine handle it. if (!$skip_field) { - $results = module_invoke(variable_get('field_storage_module', 'field_sql_storage'), 'field_storage_query', $field_name, $conditions, $result_format, $age); + $results = module_invoke(variable_get('field_storage_module', 'field_sql_storage'), 'field_storage_query', $field_id, $conditions, $result_format, $age); } + $field = field_info_field($field_id); if ($result_format == FIELD_QUERY_RETURN_VALUES) { foreach ($results as $obj_type => $pseudo_objects) { if ($age == FIELD_LOAD_CURRENT) { // Invoke hook_field_load(). $b = NULL; - _field_invoke_multiple('load', $obj_type, $pseudo_objects, $age, $b, array('field_name' => $field_name)); + _field_invoke_multiple('load', $obj_type, $pseudo_objects, $age, $b, array('field_id' => $field_id)); // Invoke hook_field_attach_load(). foreach (module_implements('field_attach_load') as $module) { @@ -838,7 +841,7 @@ function field_attach_query($field_name, // Invoke hook_field_load(). $b = NULL; - _field_invoke_multiple('load', $obj_type, $objects, $age, $b, array('field_name' => $field_name)); + _field_invoke_multiple('load', $obj_type, $objects, $age, $b, array('field_id' => $field_id)); // Invoke hook_field_attach_load(). foreach (module_implements('field_attach_load') as $module) { @@ -858,7 +861,7 @@ function field_attach_query($field_name, * * See field_attach_query() for more informations. * - * @param $field_name + * @param $field_id * The name of the field to query. * @param $conditions * See field_attach_query(). @@ -869,8 +872,8 @@ function field_attach_query($field_name, * @return * See field_attach_query(). */ -function field_attach_query_revisions($field_name, $conditions, $result_format = FIELD_QUERY_RETURN_IDS) { - return field_attach_query($field_name, $conditions, $result_format, FIELD_LOAD_REVISION); +function field_attach_query_revisions($field_id, $conditions, $result_format = FIELD_QUERY_RETURN_IDS) { + return field_attach_query($field_id, $conditions, $result_format, FIELD_LOAD_REVISION); } /** @@ -994,7 +997,7 @@ function field_attach_delete_bundle($bun // Delete the instances themseves $instances = field_info_instances($bundle); foreach ($instances as $instance) { - field_delete_instance($instance['field_name'], $bundle); + field_delete_instance($instance['field_id'], $bundle); } // Let other modules act on deleting the bundle. Index: modules/field/field.crud.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.crud.inc,v retrieving revision 1.14 diff -u -F^[fc] -r1.14 field.crud.inc --- modules/field/field.crud.inc 28 May 2009 10:05:32 -0000 1.14 +++ modules/field/field.crud.inc 9 Jun 2009 15:50:25 -0000 @@ -203,6 +203,10 @@ * FieldException */ function field_create_field($field) { + // Field id is forbidden. + if (isset($field['id'])) { + throw new FieldException('Attempt to create a field with a specified id.'); + } // Field name is required. if (empty($field['field_name'])) { throw new FieldException('Attempt to create an unnamed field.'); @@ -227,7 +231,7 @@ function field_create_field($field) { // Ensure the field name is unique over active and disabled fields. // We do not care about deleted fields. // TODO : do we want specific messages when clashing with a disabled or inactive field ? - $prior_field = field_read_field($field['field_name'], array('include_inactive' => TRUE)); + $prior_field = field_read_fields(array('field_name' => $field['field_name']), array('include_inactive' => TRUE)); if (!empty($prior_field)) { throw new FieldException(t('Attempt to create field name %name which already exists.', array('%name' => $field['field_name']))); } @@ -285,8 +289,8 @@ function field_create_field($field) { * This function will not return deleted fields. Use * field_read_fields() instead for this purpose. * - * @param $field_name - * The field name to read. + * @param $field_id + * The field id to read. * @param array $include_additional * The default behavior of this function is to not return a field that * is inactive. Setting @@ -295,9 +299,9 @@ function field_create_field($field) { * @return * A field structure, or FALSE. */ -function field_read_field($field_name, $include_additional = array()) { - $fields = field_read_fields(array('field_name' => $field_name), $include_additional); - return $fields ? current($fields) : FALSE; +function field_read_field($field_id, $include_additional = array()) { + $fields = field_read_fields(array('id' => $field_id), $include_additional); + return $fields ? reset($fields) : FALSE; } /** @@ -312,9 +316,7 @@ function field_read_field($field_name, $ * $include_additional['include_deleted'] to TRUE will override this * behavior. * @return - * An array of fields matching $params. If - * $include_additional['include_deletd'] is TRUE, the array is keyed - * by field id, otherwise it is keyed by field name. + * An array of fields matching $params, keyed by field id. */ function field_read_fields($params = array(), $include_additional = array()) { $query = db_select('field_config', 'fc', array('fetch' => PDO::FETCH_ASSOC)); @@ -347,11 +349,7 @@ function field_read_fields($params = arr $schema += array('columns' => array(), 'indexes' => array()); $field['columns'] = $schema['columns']; - $field_name = $field['field_name']; - if ($include_deleted) { - $field_name = $field['id']; - } - $fields[$field_name] = $field; + $fields[$field['id']] = $field; } return $fields; } @@ -360,23 +358,23 @@ function field_read_fields($params = arr * Mark a field for deletion, including all its instances and all data * associated with it. * - * @param $field_name - * The field name to delete. + * @param $field_id + * The field to delete. */ -function field_delete_field($field_name) { +function field_delete_field($field_id) { // Mark field storage for deletion. - module_invoke(variable_get('field_storage_module', 'field_sql_storage'), 'field_storage_delete_field', $field_name); + module_invoke(variable_get('field_storage_module', 'field_sql_storage'), 'field_storage_delete_field', $field_id); // Mark any instances of the field for deletion. db_update('field_config_instance') ->fields(array('deleted' => 1)) - ->condition('field_name', $field_name) + ->condition('field_id', $field_id) ->execute(); // Mark the field for deletion. db_update('field_config') ->fields(array('deleted' => 1)) - ->condition('field_name', $field_name) + ->condition('id', $field_id) ->execute(); // Clear the cache. @@ -387,7 +385,7 @@ function field_delete_field($field_name) * Creates an instance of a field, binding it to a bundle. * * @param $instance - * A field instance structure. The field_name and bundle properties are + * A field instance structure. The field_id and bundle properties are * required. * Other properties, if omitted, will be given the following default values: * - label: the field name @@ -411,19 +409,24 @@ function field_delete_field($field_name) * - settings: each omitted setting is given the default value specified in * hook_field_formatter_info(). * @return - * The $instance structure with the id property filled in. + * The $instance structure with the id and field_name properties filled in. * @throw * FieldException */ function field_create_instance($instance) { + // Instance id is forbidden. + if (isset($instance['id'])) { + throw new FieldException('Attempt to create an instance with a specified id.'); + } // Check that the specified field exists. - $field = field_read_field($instance['field_name']); + $field = field_read_field($instance['field_id']); if (empty($field)) { throw new FieldException("Attempt to create an instance of a field that doesn't exist."); } - // Set the field id. + // Set the field id and name. $instance['field_id'] = $field['id']; + $instance['field_name'] = $field['field_name']; // TODO: Check that the specifed bundle exists. @@ -435,7 +438,7 @@ function field_create_instance($instance // Ensure the field instance is unique. // TODO : do we want specific messages when clashing with a disabled or inactive instance ? - $prior_instance = field_read_instance($instance['field_name'], $instance['bundle'], array('include_inactive' => TRUE)); + $prior_instance = field_read_instance($instance['field_id'], $instance['bundle'], array('include_inactive' => TRUE)); if (!empty($prior_instance)) { throw new FieldException('Attempt to create a field instance which already exists.'); } @@ -468,14 +471,14 @@ function field_create_instance($instance */ function field_update_instance($instance) { // Check that the specified field exists. - $field = field_read_field($instance['field_name']); + $field = field_read_field($instance['field_id']); if (empty($field)) { throw new FieldException("Attempt to update an instance of a nonexistent field."); } // Check that the field instance exists (even if it is inactive, since we // want to be able to replace inactive widgets with new ones). - $prior_instance = field_read_instance($instance['field_name'], $instance['bundle'], array('include_inactive' => TRUE)); + $prior_instance = field_read_instance($instance['field_id'], $instance['bundle'], array('include_inactive' => TRUE)); if (empty($prior_instance)) { throw new FieldException("Attempt to update a field instance that doesn't exist."); } @@ -498,7 +501,7 @@ function field_update_instance($instance * Whether this is a new or existing instance. */ function _field_write_instance($instance, $update = FALSE) { - $field = field_read_field($instance['field_name']); + $field = field_read_field($instance['field_id']); $field_type = field_info_field_types($field['type']); // Set defaults. @@ -507,7 +510,7 @@ function _field_write_instance($instance 'display' => array(), 'widget' => array(), 'required' => FALSE, - 'label' => $instance['field_name'], + 'label' => $field['field_name'], 'description' => '', 'weight' => 0, 'deleted' => 0, @@ -557,7 +560,7 @@ function _field_write_instance($instance $record = array( 'field_id' => $instance['field_id'], - 'field_name' => $instance['field_name'], + 'field_name' => $field['field_name'], 'bundle' => $instance['bundle'], 'widget_type' => $instance['widget']['type'], 'widget_module' => $widget_module, @@ -585,8 +588,8 @@ function _field_write_instance($instance * This function will not return deleted instances. Use * field_read_instances() instead for this purpose. * - * @param $field_name - * The field name to read. + * @param $field_id + * The field id to read. * @param $bundle * The bundle to which the field is bound. * @param array $include_additional @@ -597,8 +600,8 @@ function _field_write_instance($instance * @return * An instance structure, or FALSE. */ -function field_read_instance($field_name, $bundle, $include_additional = array()) { - $instances = field_read_instances(array('field_name' => $field_name, 'bundle' => $bundle), $include_additional); +function field_read_instance($field_id, $bundle, $include_additional = array()) { + $instances = field_read_instances(array('field_id' => $field_id, 'bundle' => $bundle), $include_additional); return $instances ? current($instances) : FALSE; } @@ -665,21 +668,21 @@ function field_read_instances($params = * Mark a field instance for deletion, including all data associated with * it. * - * @param $field_name - * The name of the field whose instance will be deleted. + * @param $field_id + * The field id whose instance will be deleted. * @param $bundle * The bundle for the instance which will be deleted. */ -function field_delete_instance($field_name, $bundle) { +function field_delete_instance($field_id, $bundle) { // Mark the field instance for deletion. db_update('field_config_instance') ->fields(array('deleted' => 1)) - ->condition('field_name', $field_name) + ->condition('field_id', $field_id) ->condition('bundle', $bundle) ->execute(); // Mark all data associated with the field for deletion. - module_invoke(variable_get('field_storage_module', 'field_sql_storage'), 'field_storage_delete_instance', $field_name, $bundle); + module_invoke(variable_get('field_storage_module', 'field_sql_storage'), 'field_storage_delete_instance', $field_id, $bundle); // Clear the cache. field_cache_clear(); } Index: modules/field/field.default.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.default.inc,v retrieving revision 1.7 diff -u -F^[fc] -r1.7 field.default.inc --- modules/field/field.default.inc 3 Jun 2009 02:41:07 -0000 1.7 +++ modules/field/field.default.inc 9 Jun 2009 15:50:25 -0000 @@ -73,6 +73,7 @@ function field_default_insert($obj_type, * $object->content['field_foo']['wrapper'] = array( * '#theme' => 'field', * '#title' => 'label' + * '#field_id' => 'field_id', * '#field_name' => 'field_name', * '#object' => $object, * '#object_type' => $obj_type, @@ -83,6 +84,7 @@ function field_default_insert($obj_type, * '#item' => $items[0], * // Only for 'single-value' formatters * '#theme' => $theme, + * '#field_id' => 'field_id', * '#field_name' => 'field_name', * '#bundle' => $bundle, * '#formatter' => $formatter_name, @@ -95,6 +97,7 @@ function field_default_insert($obj_type, * '#item' => $items[1], * // Only for 'single-value' formatters * '#theme' => $theme, + * '#field_id' => 'field_id', * '#field_name' => 'field_name', * '#bundle' => $bundle_name, * '#formatter' => $formatter_name, @@ -105,6 +108,7 @@ function field_default_insert($obj_type, * ), * // Only for 'multiple-value' formatters * '#theme' => $theme, + * '#field_id' => 'field_id', * '#field_name' => 'field_name', * '#bundle' => $bundle_name, * '#formatter' => $formatter_name, @@ -146,6 +150,7 @@ function field_default_view($obj_type, $ } $info = array( + '#field_id' => $field['id'], '#field_name' => $field['field_name'], '#bundle' => $bundle, '#object' => $object, @@ -208,7 +213,7 @@ function field_default_view($obj_type, $ * Hide excluded fields from the $content variable in templates. */ function field_wrapper_post_render($content, $element) { - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); if (theme('field_exclude', $content, $instance, $element['#context'])) { return ''; } Index: modules/field/field.form.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.form.inc,v retrieving revision 1.10 diff -u -F^[fc] -r1.10 field.form.inc --- modules/field/field.form.inc 2 Jun 2009 13:47:25 -0000 1.10 +++ modules/field/field.form.inc 9 Jun 2009 15:50:25 -0000 @@ -72,6 +72,7 @@ function field_default_form($obj_type, $ '#title' => check_plain(t($instance['label'])), '#description' => field_filter_xss($instance['description']), '#delta' => $delta, + '#field_id' => $field['id'], '#field_name' => $field['field_name'], '#bundle' => $instance['bundle'], ); @@ -92,6 +93,7 @@ function field_default_form($obj_type, $ if ($form_element) { $defaults = array( + '#field_id' => $field['id'], '#field_name' => $field['field_name'], '#tree' => TRUE, '#weight' => $instance['weight'], @@ -113,7 +115,7 @@ function field_default_form($obj_type, $ * - drag-n-drop value reordering */ function field_multiple_value_form($field, $instance, $items, &$form, &$form_state) { - $field = field_info_field($instance['field_name']); + $field = field_info_field($instance['field_id']); $field_name = $field['field_name']; switch ($field['cardinality']) { @@ -162,6 +164,7 @@ function field_multiple_value_form($fiel '#weight' => $delta, '#delta' => $delta, '#columns' => array_keys($field['columns']), + '#field_id' => $field['id'], '#field_name' => $field_name, '#bundle' => $instance['bundle'], ); @@ -203,6 +206,7 @@ function field_multiple_value_form($fiel 'method' => 'replace', 'effect' => 'fade', ), + '#field_id' => $field['id'], // When JS is disabled, the field_add_more_submit handler will find // the relevant field using these entries. '#field_name' => $field_name, Index: modules/field/field.info.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.info.inc,v retrieving revision 1.6 diff -u -F^[fc] -r1.6 field.info.inc --- modules/field/field.info.inc 5 Jun 2009 18:25:41 -0000 1.6 +++ modules/field/field.info.inc 9 Jun 2009 15:50:25 -0000 @@ -185,8 +185,8 @@ function _field_info_collate_fields($res // Populate instances. $instances = field_read_instances(); foreach ($instances as $instance) { - $info['instances'][$instance['bundle']][$instance['field_name']] = $instance; - $info['fields'][$instance['field_name']]['bundles'][] = $instance['bundle']; + $info['instances'][$instance['bundle']][$instance['field_id']] = $instance; + $info['fields'][$instance['field_id']]['bundles'][] = $instance['bundle']; } cache_set('field_info_fields', $info, 'cache_field'); @@ -393,17 +393,17 @@ function field_info_fields() { /** * Return data about an individual field. * - * @param $field_name - * The name of the field to retrieve. + * @param $field_id + * The id of the field to retrieve. * @return * The named field object, or NULL. The Field object has an additional * property, bundles, which is an array of all the bundles to which * this field belongs. */ -function field_info_field($field_name) { +function field_info_field($field_id) { $info = _field_info_collate_fields(); - if (isset($info['fields'][$field_name])) { - return $info['fields'][$field_name]; + if (isset($info['fields'][$field_id])) { + return $info['fields'][$field_id]; } } @@ -428,10 +428,10 @@ function field_info_instances($bundle_na /** * Return an array of instance data for a specific field and bundle. */ -function field_info_instance($field_name, $bundle_name) { +function field_info_instance($field_id, $bundle_name) { $info = _field_info_collate_fields(); - if (isset($info['instances'][$bundle_name][$field_name])) { - return $info['instances'][$bundle_name][$field_name]; + if (isset($info['instances'][$bundle_name][$field_id])) { + return $info['instances'][$bundle_name][$field_id]; } } Index: modules/field/field.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.module,v retrieving revision 1.13 diff -u -F^[fc] -r1.13 field.module --- modules/field/field.module 6 Jun 2009 16:17:30 -0000 1.13 +++ modules/field/field.module 9 Jun 2009 15:50:25 -0000 @@ -421,7 +421,7 @@ function field_format($obj_type, $object if (field_access('view', $field)) { // Basically, we need $field, $instance, $obj_type, $object to be able to display a value... list(, , $bundle) = field_attach_extract_ids($obj_type, $object); - $instance = field_info_instance($field['field_name'], $bundle); + $instance = field_info_instance($field['id'], $bundle); $display = array( 'type' => $formatter_name, @@ -433,6 +433,7 @@ function field_format($obj_type, $object $element = array( '#theme' => $theme, + '#field_id' => $field['id'], '#field_name' => $field['field_name'], '#bundle' => $bundle, '#formatter' => $display['type'], @@ -568,8 +569,8 @@ function field_access($op, $field, $acco function template_preprocess_field(&$variables) { $element = $variables['element']; list(, , $bundle) = field_attach_extract_ids($element['#object_type'], $element['#object']); - $instance = field_info_instance($element['#field_name'], $bundle); - $field = field_info_field($element['#field_name']); + $instance = field_info_instance($element['#field_id'], $bundle); + $field = field_info_field($element['#field_id']); $variables['object'] = $element['#object']; $variables['field'] = $field; @@ -611,6 +612,7 @@ function template_preprocess_field(&$var $additions = array( 'field_type' => $field['type'], + 'field_id' => $field['id'], 'field_name' => $field['field_name'], 'field_type_css' => strtr($field['type'], '_', '-'), 'field_name_css' => strtr($field['field_name'], '_', '-'), Index: modules/field/field.test =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.test,v retrieving revision 1.25 diff -u -F^[fc] -r1.25 field.test --- modules/field/field.test 7 Jun 2009 00:00:57 -0000 1.25 +++ modules/field/field.test 9 Jun 2009 15:50:25 -0000 @@ -26,9 +26,10 @@ class FieldAttachTestCase extends Drupal $this->field_name = drupal_strtolower($this->randomName() . '_field_name'); $this->field = array('field_name' => $this->field_name, 'type' => 'test_field', 'cardinality' => 4); - field_create_field($this->field); + $this->field = field_create_field($this->field); + $this->field_id = $this->field['id']; $this->instance = array( - 'field_name' => $this->field_name, + 'field_id' => $this->field_id, 'bundle' => 'test_bundle', 'label' => $this->randomName() . '_label', 'description' => $this->randomName() . '_description', @@ -44,7 +45,7 @@ class FieldAttachTestCase extends Drupal ) ) ); - field_create_instance($this->instance); + $this->instance = field_create_instance($this->instance); } /** @@ -134,10 +135,11 @@ class FieldAttachTestCase extends Drupal for ($i = 1; $i <= 3; $i++) { $field_names[$i] = 'field_' . $i; $field = array('field_name' => $field_names[$i], 'type' => 'test_field'); - field_create_field($field); + $fields[$i] = field_create_field($field); + foreach ($field_bundles_map[$i] as $bundle) { $instance = array( - 'field_name' => $field_names[$i], + 'field_id' => $fields[$i]['id'], 'bundle' => $bundles[$bundle], 'settings' => array( // Configure the instance so that we test hook_field_load() @@ -154,7 +156,8 @@ class FieldAttachTestCase extends Drupal $entities[$index] = field_test_create_stub_entity($index, $index, $bundle); $entity = clone($entities[$index]); $instances = field_info_instances($bundle); - foreach ($instances as $field_name => $instance) { + foreach ($instances as $instance) { + $field_name = $instance['field_name']; $values[$index][$field_name] = mt_rand(1, 127); $entity->$field_name = array(array('value' => $values[$index][$field_name])); } @@ -165,7 +168,8 @@ class FieldAttachTestCase extends Drupal field_attach_load($entity_type, $entities); foreach ($entities as $index => $entity) { $instances = field_info_instances($bundles[$index]); - foreach ($instances as $field_name => $instance) { + foreach ($instances as $instance) { + $field_name = $instance['field_name']; // The field value loaded matches the one inserted. $this->assertEqual($entity->{$field_name}[0]['value'], $values[$index][$field_name], t('Entity %index: expected value was found.', array('%index' => $index))); // The value added in hook_field_load() is found. @@ -296,7 +300,7 @@ class FieldAttachTestCase extends Drupal // Query on the object's values. for ($delta = 0; $delta < $cardinality; $delta++) { $conditions = array(array('value', $values[$delta])); - $result = field_attach_query($this->field_name, $conditions); + $result = field_attach_query($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_types[1]][1]), t('Query on value %delta returns the object', array('%delta' => $delta))); } @@ -305,31 +309,31 @@ class FieldAttachTestCase extends Drupal $different_value = mt_rand(1, 127); } while (in_array($different_value, $values)); $conditions = array(array('value', $different_value)); - $result = field_attach_query($this->field_name, $conditions); + $result = field_attach_query($this->field_id, $conditions); $this->assertFalse(isset($result[$entity_types[1]][1]), t("Query on a value that is not in the object doesn't return the object")); // Query on the value shared by both objects, and discriminate using // additional conditions. $conditions = array(array('value', $common_value)); - $result = field_attach_query($this->field_name, $conditions); + $result = field_attach_query($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_types[1]][1]) && isset($result[$entity_types[2]][2]), t('Query on a value common to both objects returns both objects')); $conditions = array(array('type', $entity_types[1]), array('value', $common_value)); - $result = field_attach_query($this->field_name, $conditions); + $result = field_attach_query($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_types[1]][1]) && !isset($result[$entity_types[2]][2]), t("Query on a value common to both objects and a 'type' condition only returns the relevant object")); $conditions = array(array('bundle', $entities[1]->fttype), array('value', $common_value)); - $result = field_attach_query($this->field_name, $conditions); + $result = field_attach_query($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_types[1]][1]) && !isset($result[$entity_types[2]][2]), t("Query on a value common to both objects and a 'bundle' condition only returns the relevant object")); $conditions = array(array('entity_id', $entities[1]->ftid), array('value', $common_value)); - $result = field_attach_query($this->field_name, $conditions); + $result = field_attach_query($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_types[1]][1]) && !isset($result[$entity_types[2]][2]), t("Query on a value common to both objects and an 'entity_id' condition only returns the relevant object")); // Test FIELD_QUERY_RETURN_IDS result format. $conditions = array(array('value', $values[0])); - $result = field_attach_query($this->field_name, $conditions); + $result = field_attach_query($this->field_id, $conditions); $expected = array( $entity_types[1] => array( $entities[1]->ftid => $entities[1]->ftid, @@ -348,7 +352,7 @@ class FieldAttachTestCase extends Drupal // Query for one of the values in the 1st object and the value shared by // both objects. $conditions = array(array('value', array($values[0], $common_value))); - $result = field_attach_query($this->field_name, $conditions, FIELD_QUERY_RETURN_VALUES); + $result = field_attach_query($this->field_id, $conditions, FIELD_QUERY_RETURN_VALUES); $expected = array( $entity_types[1] => array( $entities[1]->ftid => (object) array( @@ -402,7 +406,7 @@ class FieldAttachTestCase extends Drupal // Query on the object's values. for ($delta = 0; $delta < $cardinality; $delta++) { $conditions = array(array('value', $values[$delta])); - $result = field_attach_query_revisions($this->field_name, $conditions); + $result = field_attach_query_revisions($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_type][1]), t('Query on value %delta returns the object', array('%delta' => $delta))); } @@ -411,23 +415,23 @@ class FieldAttachTestCase extends Drupal $different_value = mt_rand(1, 127); } while (in_array($different_value, $values)); $conditions = array(array('value', $different_value)); - $result = field_attach_query_revisions($this->field_name, $conditions); + $result = field_attach_query_revisions($this->field_id, $conditions); $this->assertFalse(isset($result[$entity_type][1]), t("Query on a value that is not in the object doesn't return the object")); // Query on the value shared by both objects, and discriminate using // additional conditions. $conditions = array(array('value', $common_value)); - $result = field_attach_query_revisions($this->field_name, $conditions); + $result = field_attach_query_revisions($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_type][1]) && isset($result[$entity_type][2]), t('Query on a value common to both objects returns both objects')); $conditions = array(array('revision_id', $entities[1]->ftvid), array('value', $common_value)); - $result = field_attach_query_revisions($this->field_name, $conditions); + $result = field_attach_query_revisions($this->field_id, $conditions); $this->assertTrue(isset($result[$entity_type][1]) && !isset($result[$entity_type][2]), t("Query on a value common to both objects and a 'revision_id' condition only returns the relevant object")); // Test FIELD_QUERY_RETURN_IDS result format. $conditions = array(array('value', $values[0])); - $result = field_attach_query_revisions($this->field_name, $conditions); + $result = field_attach_query_revisions($this->field_id, $conditions); $expected = array( $entity_type => array( $entities[1]->ftvid => $entities[1]->ftid, @@ -444,7 +448,7 @@ class FieldAttachTestCase extends Drupal // Query for one of the values in the 1st object and the value shared by // both objects. $conditions = array(array('value', array($values[0], $common_value))); - $result = field_attach_query_revisions($this->field_name, $conditions, FIELD_QUERY_RETURN_VALUES); + $result = field_attach_query_revisions($this->field_id, $conditions, FIELD_QUERY_RETURN_VALUES); $expected = array( $entity_type => array( $entities[1]->ftvid => (object) array( @@ -492,7 +496,7 @@ class FieldAttachTestCase extends Drupal $entity->content = field_attach_view($entity_type, $entity); $output = drupal_render($entity->content); $variables = field_attach_preprocess($entity_type, $entity); - $variable = $this->instance['field_name'] . '_rendered'; + $variable = $this->field['field_name'] . '_rendered'; $this->assertTrue(isset($variables[$variable]), "Variable $variable is available in templates."); $this->content = $output; $this->assertRaw($this->instance['label'], "Label is displayed."); @@ -642,7 +646,7 @@ class FieldAttachTestCase extends Drupal field_test_rename_bundle($this->instance['bundle'], $new_bundle); // Check that the instance definition has been updated. - $this->instance = field_info_instance($this->field_name, $new_bundle); + $this->instance = field_info_instance($this->field_id, $new_bundle); $this->assertIdentical($this->instance['bundle'], $new_bundle, "Bundle name has been updated in the instance."); // Verify the field data is present on load. @@ -664,9 +668,9 @@ class FieldAttachTestCase extends Drupal // Create a second field for the test bundle $field_name = drupal_strtolower($this->randomName() . '_field_name'); $field = array('field_name' => $field_name, 'type' => 'test_field', 'cardinality' => 1); - field_create_field($field); + $field = field_create_field($field); $instance = array( - 'field_name' => $field_name, + 'field_id' => $field['id'], 'bundle' => $this->instance['bundle'], 'label' => $this->randomName() . '_label', 'description' => $this->randomName() . '_description', @@ -941,22 +945,24 @@ class FieldInfoTestCase extends DrupalWe 'field_name' => drupal_strtolower($this->randomName()), 'type' => 'test_field', ); - field_create_field($field); + $new_field = field_create_field($field); + $field_id = $new_field['id']; $fields = field_info_fields(); $this->assertEqual(count($fields), 1, t('One field exists')); - $this->assertEqual($fields[$field['field_name']]['field_name'], $field['field_name'], t('info fields contains field name')); - $this->assertEqual($fields[$field['field_name']]['type'], $field['type'], t('info fields contains field type')); - $this->assertEqual($fields[$field['field_name']]['module'], 'field_test', t('info fields contains field module')); + $this->assertEqual($fields[$field_id]['id'], $field_id, t('info fields contains field id')); + $this->assertEqual($fields[$field_id]['field_name'], $field['field_name'], t('info fields contains field name')); + $this->assertEqual($fields[$field_id]['type'], $field['type'], t('info fields contains field type')); + $this->assertEqual($fields[$field_id]['module'], 'field_test', t('info fields contains field module')); $settings = array('test_field_setting' => 'dummy test string'); foreach ($settings as $key => $val) { - $this->assertEqual($fields[$field['field_name']]['settings'][$key], $val, t("Field setting $key has correct default value $val")); + $this->assertEqual($fields[$field_id]['settings'][$key], $val, t("Field setting $key has correct default value $val")); } - $this->assertEqual($fields[$field['field_name']]['cardinality'], 1, t('info fields contains cardinality 1')); - $this->assertEqual($fields[$field['field_name']]['active'], 1, t('info fields contains active 1')); + $this->assertEqual($fields[$field_id]['cardinality'], 1, t('info fields contains cardinality 1')); + $this->assertEqual($fields[$field_id]['active'], 1, t('info fields contains active 1')); // Create an instance, verify that it shows up $instance = array( - 'field_name' => $field['field_name'], + 'field_id' => $field_id, 'bundle' => FIELD_TEST_BUNDLE, 'label' => $this->randomName(), 'description' => $this->randomName(), @@ -970,7 +976,7 @@ class FieldInfoTestCase extends DrupalWe $instances = field_info_instances($instance['bundle']); $this->assertEqual(count($instances), 1, t('One instance shows up in info when attached to a bundle.')); - $this->assertTrue($instance < $instances[$instance['field_name']], t('Instance appears in info correctly')); + $this->assertTrue($instance < $instances[$instance['field_id']], t('Instance appears in info correctly')); } // Test that the field_info settings convenience functions work @@ -1033,9 +1039,9 @@ class FieldFormTestCase extends DrupalWe function testFieldFormSingle() { $this->field = $this->field_single; $this->field_name = $this->field['field_name']; - $this->instance['field_name'] = $this->field_name; - field_create_field($this->field); - field_create_instance($this->instance); + $this->field = field_create_field($this->field); + $this->instance['field_id'] = $this->field['id']; + $this->instance = field_create_instance($this->instance); // Display creation form. $this->drupalGet('test-entity/add/test-bundle'); @@ -1085,9 +1091,9 @@ class FieldFormTestCase extends DrupalWe function testFieldFormSingleRequired() { $this->field = $this->field_single; $this->field_name = $this->field['field_name']; - $this->instance['field_name'] = $this->field_name; $this->instance['required'] = TRUE; - field_create_field($this->field); + $this->field = field_create_field($this->field); + $this->instance['field_id'] = $this->field['id']; field_create_instance($this->instance); // Submit with missing required value. @@ -1123,8 +1129,8 @@ class FieldFormTestCase extends DrupalWe function testFieldFormUnlimited() { $this->field = $this->field_unlimited; $this->field_name = $this->field['field_name']; - $this->instance['field_name'] = $this->field_name; - field_create_field($this->field); + $this->field = field_create_field($this->field); + $this->instance['field_id'] = $this->field['id']; field_create_instance($this->instance); // Display creation form -> 1 widget. @@ -1203,9 +1209,9 @@ class FieldFormTestCase extends DrupalWe function testFieldFormJSAddMore() { $this->field = $this->field_unlimited; $this->field_name = $this->field['field_name']; - $this->instance['field_name'] = $this->field_name; - field_create_field($this->field); - field_create_instance($this->instance); + $this->field = field_create_field($this->field); + $this->instance['field_id'] = $this->field['id']; + $this->instance = field_create_instance($this->instance); // Display creation form -> 1 widget. $this->drupalGet('test-entity/add/test-bundle'); @@ -1331,9 +1337,10 @@ class FieldCrudTestCase extends DrupalWe ); $field_definition = field_create_field($field_definition); - $field = field_read_field($field_definition['field_name']); + $field = field_read_field($field_definition['id']); // Ensure that basic properties are preserved. + $this->assertEqual($field['id'], $field_definition['id'], t('The field id is properly retrieved.')); $this->assertEqual($field['field_name'], $field_definition['field_name'], t('The field name is properly saved.')); $this->assertEqual($field['type'], $field_definition['type'], t('The field type is properly saved.')); @@ -1378,8 +1385,8 @@ class FieldCrudTestCase extends DrupalWe 'field_name' => 'field_1', 'type' => 'test_field', ); - field_create_field($field_definition); - $field = field_read_field($field_definition['field_name']); + $field_definition = field_create_field($field_definition); + $field = field_info_field($field_definition['id']); $expected_indexes = array('value' => array('value')); $this->assertEqual($field['indexes'], $expected_indexes, t('Field type indexes saved by default')); @@ -1392,8 +1399,8 @@ class FieldCrudTestCase extends DrupalWe 'value' => array(), ), ); - field_create_field($field_definition); - $field = field_read_field($field_definition['field_name']); + $field_definition = field_create_field($field_definition); + $field = field_info_field($field_definition['id']); $expected_indexes = array('value' => array()); $this->assertEqual($field['indexes'], $expected_indexes, t('Field definition indexes override field type indexes')); @@ -1406,8 +1413,8 @@ class FieldCrudTestCase extends DrupalWe 'value_2' => array('value'), ), ); - field_create_field($field_definition); - $field = field_read_field($field_definition['field_name']); + $field_definition = field_create_field($field_definition); + $field = field_info_field($field_definition['id']); $expected_indexes = array('value' => array('value'), 'value_2' => array('value')); $this->assertEqual($field['indexes'], $expected_indexes, t('Field definition indexes are merged with field type indexes')); } @@ -1424,13 +1431,13 @@ class FieldCrudTestCase extends DrupalWe // Create two fields (so we can test that only one is deleted). $this->field = array('field_name' => 'field_1', 'type' => 'test_field'); - field_create_field($this->field); + $this->field = field_create_field($this->field); $this->another_field = array('field_name' => 'field_2', 'type' => 'test_field'); - field_create_field($this->another_field); + $this->another_field = field_create_field($this->another_field); // Create instances for each. $this->instance_definition = array( - 'field_name' => $this->field['field_name'], + 'field_id' => $this->field['id'], 'bundle' => FIELD_TEST_BUNDLE, 'widget' => array( 'type' => 'test_field_widget', @@ -1438,13 +1445,13 @@ class FieldCrudTestCase extends DrupalWe ); field_create_instance($this->instance_definition); $this->another_instance_definition = $this->instance_definition; - $this->another_instance_definition['field_name'] = $this->another_field['field_name']; + $this->another_instance_definition['field_id'] = $this->another_field['id']; field_create_instance($this->another_instance_definition); // Test that the first field is not deleted, and then delete it. - $field = field_read_field($this->field['field_name'], array('include_deleted' => TRUE)); + $field = field_read_field($this->field['id'], array('include_deleted' => TRUE)); $this->assertTrue(!empty($field) && empty($field['deleted']), t('A new field is not marked for deletion.')); - field_delete_field($this->field['field_name']); + field_delete_field($this->field['id']); // Make sure that the field is marked as deleted when it is specifically // loaded. @@ -1454,30 +1461,32 @@ class FieldCrudTestCase extends DrupalWe // Make sure that this field's instance is marked as deleted when it is // specifically loaded. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE)); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle'], array('include_deleted' => TRUE)); $this->assertTrue(!empty($instance['deleted']), t('An instance for a deleted field is marked for deletion.')); // Try to load the field normally and make sure it does not show up. - $field = field_read_field($this->field['field_name']); + $field = field_read_field($this->field['id']); $this->assertTrue(empty($field), t('A deleted field is not loaded by default.')); // Try to load the instance normally and make sure it does not show up. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $this->assertTrue(empty($instance), t('An instance for a deleted field is not loaded by default.')); // Make sure the other field (and its field instance) are not deleted. - $another_field = field_read_field($this->another_field['field_name']); + $another_field = field_read_field($this->another_field['id']); $this->assertTrue(!empty($another_field) && empty($another_field['deleted']), t('A non-deleted field is not marked for deletion.')); - $another_instance = field_read_instance($this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']); + $another_instance = field_read_instance($this->another_instance_definition['field_id'], $this->another_instance_definition['bundle']); $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), t('An instance of a non-deleted field is not marked for deletion.')); // Try to create a new field the same name as a deleted field and // write data into it. - field_create_field($this->field); + unset($this->field['id']); + $this->field = field_create_field($this->field); + $this->instance_definition['field_id'] = $this->field['id']; field_create_instance($this->instance_definition); - $field = field_read_field($this->field['field_name']); + $field = field_read_field($this->field['id']); $this->assertTrue(!empty($field) && empty($field['deleted']), t('A new field with a previously used name is created.')); - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $this->assertTrue(!empty($instance) && empty($instance['deleted']), t('A new instance for a previously used field name is created.')); // Save an object with data for the field @@ -1514,9 +1523,9 @@ class FieldInstanceTestCase extends Drup 'field_name' => drupal_strtolower($this->randomName()), 'type' => 'test_field', ); - field_create_field($this->field); + $this->field = field_create_field($this->field); $this->instance_definition = array( - 'field_name' => $this->field['field_name'], + 'field_id' => $this->field['id'], 'bundle' => FIELD_TEST_BUNDLE, ); } @@ -1527,8 +1536,8 @@ class FieldInstanceTestCase extends Drup // defer actual $instance comparison to a helper function, used for the two cases above, // and for testUpdateFieldInstance function testCreateFieldInstance() { - field_create_instance($this->instance_definition); - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $this->instance_definition = field_create_instance($this->instance_definition); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $field_type = field_info_field_types($this->field['type']); $widget_type = field_info_widget_types($instance['widget']['type']); $formatter_type = field_info_formatter_types($instance['display']['full']['type']); @@ -1562,7 +1571,7 @@ class FieldInstanceTestCase extends Drup // Check that the specified field exists. try { - $this->instance_definition['field_name'] = $this->randomName(); + $this->instance_definition['field_id'] = 12345; field_create_instance($this->instance_definition); $this->fail(t('Cannot create an instance of a non-existing field.')); } @@ -1582,7 +1591,7 @@ class FieldInstanceTestCase extends Drup $field_type = field_info_field_types($this->field['type']); // Check that basic changes are saved. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $instance['required'] = !$instance['required']; $instance['weight']++; $instance['label'] = $this->randomName(); @@ -1592,7 +1601,7 @@ class FieldInstanceTestCase extends Drup $instance['display']['full']['settings']['test_formatter_setting'] = $this->randomName(); field_update_instance($instance); - $instance_new = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance_new = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $this->assertEqual($instance['required'], $instance_new['required'], t('"required" change is saved')); $this->assertEqual($instance['weight'], $instance_new['weight'], t('"weight" change is saved')); $this->assertEqual($instance['label'], $instance_new['label'], t('"label" change is saved')); @@ -1601,12 +1610,12 @@ class FieldInstanceTestCase extends Drup $this->assertEqual($instance['display']['full']['settings']['test_formatter_setting'], $instance_new['display']['full']['settings']['test_formatter_setting'], t('Formatter setting change is saved')); // Check that changing widget and formatter types updates the default settings. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $instance['widget']['type'] = 'test_field_widget_multiple'; $instance['display']['full']['type'] = 'field_test_multiple'; field_update_instance($instance); - $instance_new = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance_new = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $this->assertEqual($instance['widget']['type'], $instance_new['widget']['type'] , t('Widget type change is saved.')); $settings = field_info_widget_settings($instance_new['widget']['type']); $this->assertIdentical($settings, array_intersect_key($instance_new['widget']['settings'], $settings) , t('Widget type change updates default settings.')); @@ -1616,11 +1625,11 @@ class FieldInstanceTestCase extends Drup $this->assertIdentical($settings, array_intersect_key($instance_new['display']['full']['settings'], $settings) , t('Changing formatter type updates default settings.')); // Check that adding a new build mode is saved and gets default settings. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $instance['display']['teaser'] = array(); field_update_instance($instance); - $instance_new = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance_new = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $this->assertTrue(isset($instance_new['display']['teaser']), t('Display for the new build_mode has been written.')); $this->assertIdentical($instance_new['display']['teaser']['type'], $field_type['default_formatter'], t('Default formatter for the new build_mode has been written.')); $info = field_info_formatter_types($instance_new['display']['teaser']['type']); @@ -1643,21 +1652,21 @@ class FieldInstanceTestCase extends Drup field_create_instance($this->another_instance_definition); // Test that the first instance is not deleted, and then delete it. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE)); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle'], array('include_deleted' => TRUE)); $this->assertTrue(!empty($instance) && empty($instance['deleted']), t('A new field instance is not marked for deletion.')); - field_delete_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + field_delete_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); // Make sure the instance is marked as deleted when the instance is // specifically loaded. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle'], array('include_deleted' => TRUE)); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle'], array('include_deleted' => TRUE)); $this->assertTrue(!empty($instance['deleted']), t('A deleted field instance is marked for deletion.')); // Try to load the instance normally and make sure it does not show up. - $instance = field_read_instance($this->instance_definition['field_name'], $this->instance_definition['bundle']); + $instance = field_read_instance($this->instance_definition['field_id'], $this->instance_definition['bundle']); $this->assertTrue(empty($instance), t('A deleted field instance is not loaded by default.')); // Make sure the other field instance is not deleted. - $another_instance = field_read_instance($this->another_instance_definition['field_name'], $this->another_instance_definition['bundle']); + $another_instance = field_read_instance($this->another_instance_definition['field_id'], $this->another_instance_definition['bundle']); $this->assertTrue(!empty($another_instance) && empty($another_instance['deleted']), t('A non-deleted field instance is not marked for deletion.')); } } Index: modules/field/modules/field_sql_storage/field_sql_storage.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/field_sql_storage/field_sql_storage.module,v retrieving revision 1.13 diff -u -F^[fc] -r1.13 field_sql_storage.module --- modules/field/modules/field_sql_storage/field_sql_storage.module 7 Jun 2009 00:00:57 -0000 1.13 +++ modules/field/modules/field_sql_storage/field_sql_storage.module 9 Jun 2009 15:50:25 -0000 @@ -190,9 +190,9 @@ function field_sql_storage_field_storage /** * Implement hook_field_storage_delete_field(). */ -function field_sql_storage_field_storage_delete_field($field_name) { +function field_sql_storage_field_storage_delete_field($field_id) { // Mark all data associated with the field for deletion. - $field = field_info_field($field_name); + $field = field_info_field($field_id); $table = _field_sql_storage_tablename($field); db_update($table) ->fields(array('deleted' => 1)) @@ -211,17 +211,18 @@ function field_sql_storage_field_storage $delta_count = array(); foreach ($objects as $obj) { list($id, $vid, $bundle) = field_attach_extract_ids($obj_type, $obj); - foreach (field_info_instances($bundle) as $field_name => $instance) { - if (!isset($skip_fields[$field_name])) { - $objects[$id]->{$field_name} = array(); - $field_ids[$field_name][] = $load_current ? $id : $vid; - $delta_count[$id][$field_name] = 0; + foreach (field_info_instances($bundle) as $field_id => $instance) { + if (!isset($skip_fields[$field_id])) { + $objects[$id]->{$instance['field_name']} = array(); + $field_ids[$field_id][] = $load_current ? $id : $vid; + $delta_count[$id][$field_id] = 0; } } } - foreach ($field_ids as $field_name => $ids) { - $field = field_info_field($field_name); + foreach ($field_ids as $field_id => $ids) { + $field = field_info_field($field_id); + $field_name = $field['field_name']; $table = $load_current ? _field_sql_storage_tablename($field) : _field_sql_storage_revision_tablename($field); $results = db_select($table, 't') @@ -233,7 +234,7 @@ function field_sql_storage_field_storage ->execute(); foreach ($results as $row) { - if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta_count[$row->entity_id][$field_name] < $field['cardinality']) { + if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta_count[$row->entity_id][$field_id] < $field['cardinality']) { $item = array(); // For each column declared by the field, populate the item // from the prefixed database column. @@ -244,7 +245,7 @@ function field_sql_storage_field_storage // Add the item to the field values for the entity. $objects[$row->entity_id]->{$field_name}[] = $item; - $delta_count[$row->entity_id][$field_name]++; + $delta_count[$row->entity_id][$field_id]++; } } } @@ -259,12 +260,12 @@ function field_sql_storage_field_storage $instances = field_info_instances($bundle); foreach ($instances as $instance) { - $field_name = $instance['field_name']; - if (isset($skip_fields[$field_name])) { + if (isset($skip_fields[$instance['field_id']])) { continue; } - $field = field_info_field($field_name); + $field_name = $instance['field_name']; + $field = field_info_field($instance['field_id']); $table_name = _field_sql_storage_tablename($field); $revision_name = _field_sql_storage_revision_tablename($field); @@ -337,7 +338,7 @@ function field_sql_storage_field_storage $instances = field_info_instances($bundle); foreach ($instances as $instance) { $field_name = $instance['field_name']; - $field = field_read_field($field_name); + $field = field_read_field($instance['field_id']); $table_name = _field_sql_storage_tablename($field); $revision_name = _field_sql_storage_revision_tablename($field); db_delete($table_name) @@ -355,11 +356,12 @@ function field_sql_storage_field_storage /** * Implement hook_field_storage_query(). */ -function field_sql_storage_field_storage_query($field_name, $conditions, $result_format, $age) { +function field_sql_storage_field_storage_query($field_id, $conditions, $result_format, $age) { $load_values = $result_format == FIELD_QUERY_RETURN_VALUES; $load_current = $age == FIELD_LOAD_CURRENT; - $field = field_info_field($field_name); + $field = field_info_field($field_id); + $field_name = $field['field_name']; $table = $load_current ? _field_sql_storage_tablename($field) : _field_sql_storage_revision_tablename($field); $field_columns = array_keys($field['columns']); @@ -461,8 +463,8 @@ function field_sql_storage_field_storage if (isset($vid)) { $instances = field_info_instances($bundle); foreach ($instances as $instance) { - $field_name = $instance['field_name']; - $field = field_read_field($field_name); + $field_id = $instance['field_id']; + $field = field_read_field($field_id); $revision_name = _field_sql_storage_revision_tablename($field); db_delete($revision_name) ->condition('etid', $etid) @@ -478,8 +480,8 @@ function field_sql_storage_field_storage * * This function simply marks for deletion all data associated with the field. */ -function field_sql_storage_field_storage_delete_instance($field_name, $bundle) { - $field = field_read_field($field_name); +function field_sql_storage_field_storage_delete_instance($field_id, $bundle) { + $field = field_read_field($field_id); $table_name = _field_sql_storage_tablename($field); $revision_name = _field_sql_storage_revision_tablename($field); db_update($table_name) @@ -498,7 +500,7 @@ function field_sql_storage_field_storage function field_sql_storage_field_storage_rename_bundle($bundle_old, $bundle_new) { $instances = field_info_instances($bundle_old); foreach ($instances as $instance) { - $field = field_read_field($instance['field_name']); + $field = field_read_field($instance['field_id']); $table_name = _field_sql_storage_tablename($field); $revision_name = _field_sql_storage_revision_tablename($field); db_update($table_name) Index: modules/field/modules/field_sql_storage/field_sql_storage.test =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/field_sql_storage/field_sql_storage.test,v retrieving revision 1.4 diff -u -F^[fc] -r1.4 field_sql_storage.test --- modules/field/modules/field_sql_storage/field_sql_storage.test 28 May 2009 10:05:32 -0000 1.4 +++ modules/field/modules/field_sql_storage/field_sql_storage.test 9 Jun 2009 15:50:25 -0000 @@ -27,7 +27,7 @@ class FieldSqlStorageTestCase extends Dr $this->field = array('field_name' => $this->field_name, 'type' => 'test_field', 'cardinality' => 4); $this->field = field_create_field($this->field); $this->instance = array( - 'field_name' => $this->field_name, + 'field_id' => $this->field['id'], 'bundle' => 'test_bundle' ); $this->instance = field_create_instance($this->instance); Index: modules/field/modules/list/list.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/list/list.module,v retrieving revision 1.6 diff -u -F^[fc] -r1.6 list.module --- modules/field/modules/list/list.module 27 May 2009 18:33:56 -0000 1.6 +++ modules/field/modules/list/list.module 9 Jun 2009 15:50:25 -0000 @@ -153,7 +153,7 @@ function list_field_formatter_info() { * Theme function for 'default' list field formatter. */ function theme_field_formatter_list_default($element) { - $field = field_info_field($element['#field_name']); + $field = field_info_field($element['#field_id']); if (($allowed_values = list_allowed_values($field)) && isset($allowed_values[$element['#item']['value']])) { return $allowed_values[$element['#item']['value']]; } Index: modules/field/modules/number/number.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/number/number.module,v retrieving revision 1.10 diff -u -F^[fc] -r1.10 number.module --- modules/field/modules/number/number.module 28 May 2009 16:44:06 -0000 1.10 +++ modules/field/modules/number/number.module 9 Jun 2009 15:50:25 -0000 @@ -175,8 +175,8 @@ function theme_field_formatter_number_un * Proxy theme function for number field formatters. */ function theme_field_formatter_number($element) { - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); $value = $element['#item']['value']; $settings = $element['#settings']; $formatter_type = $element['#formatter']; @@ -298,8 +298,8 @@ function number_field_widget_error($elem */ function number_elements_process($element, $form_state, $form) { $field_name = $element['#field_name']; - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); $field_key = $element['#columns'][0]; $value = isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : ''; @@ -320,6 +320,7 @@ function number_elements_process($elemen '#title' => $element['#title'], '#description' => $element['#description'], '#required' => $element['#required'], + '#field_id' => $element['#field_id'], '#field_name' => $element['#field_name'], '#bundle' => $element['#bundle'], '#delta' => $element['#delta'], @@ -358,8 +359,8 @@ function number_elements_process($elemen * FAPI validation of an individual float element. */ function number_float_validate($element, &$form_state) { - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); $field_key = $element['#columns'][0]; $value = $element['#value'][$field_key]; @@ -380,8 +381,8 @@ function number_float_validate($element, * FAPI validation of an individual integer element. */ function number_integer_validate($element, &$form_state) { - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); $field_key = $element['#columns'][0]; $value = $element['#value'][$field_key]; @@ -402,8 +403,8 @@ function number_integer_validate($elemen * FAPI validation of an individual decimal element. */ function number_decimal_validate($element, &$form_state) { - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); $field_key = $element['#columns'][0]; $value = $element['#value'][$field_key]; Index: modules/field/modules/options/options.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/options/options.module,v retrieving revision 1.7 diff -u -F^[fc] -r1.7 options.module --- modules/field/modules/options/options.module 28 May 2009 16:44:06 -0000 1.7 +++ modules/field/modules/options/options.module 9 Jun 2009 15:50:25 -0000 @@ -290,8 +290,8 @@ function options_validate($element, &$fo */ function options_data2form($element, $items, $field) { $field_key = $element['#columns'][0]; - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); $options = options_options($field, $instance); $items_transposed = options_transpose_array_rows_cols($items); @@ -318,8 +318,8 @@ function options_data2form($element, $it */ function options_form2data($element, $field) { $field_key = $element['#columns'][0]; - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); $items = (array) $element[$field_key]['#value']; $options = options_options($field, $instance); Index: modules/field/modules/text/text.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.module,v retrieving revision 1.11 diff -u -F^[fc] -r1.11 text.module --- modules/field/modules/text/text.module 3 Jun 2009 02:38:47 -0000 1.11 +++ modules/field/modules/text/text.module 9 Jun 2009 15:50:25 -0000 @@ -224,8 +224,8 @@ function theme_field_formatter_text_plai * Theme function for 'trimmed' text field formatter. */ function theme_field_formatter_text_trimmed($element) { - $field = field_info_field($element['#field_name']); - $instance = field_info_instance($element['#field_name'], $element['#bundle']); + $field = field_info_field($element['#field_id']); + $instance = field_info_instance($element['#field_id'], $element['#bundle']); return $instance['settings']['text_processing'] ? $element['#item']['format'] : NULL; } @@ -369,6 +369,7 @@ function text_textfield_elements_process '#title' => $element['#title'], '#description' => $element['#description'], '#required' => $element['#required'], + '#field_id' => $element['#field_id'], '#field_name' => $element['#field_name'], '#bundle' => $element['#bundle'], '#delta' => $element['#delta'], @@ -410,6 +411,7 @@ function text_textarea_elements_process( '#title' => $element['#title'], '#description' => $element['#description'], '#required' => $element['#required'], + '#field_id' => $element['#field_id'], '#field_name' => $element['#field_name'], '#bundle' => $element['#bundle'], '#delta' => $element['#delta'], Index: modules/field/modules/text/text.test =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.test,v retrieving revision 1.6 diff -u -F^[fc] -r1.6 text.test --- modules/field/modules/text/text.test 29 Apr 2009 12:08:28 -0000 1.6 +++ modules/field/modules/text/text.test 9 Jun 2009 15:50:26 -0000 @@ -34,9 +34,9 @@ class TextFieldTestCase extends DrupalWe 'max_length' => $max_length, ) ); - field_create_field($this->field); + $this->field = field_create_field($this->field); $this->instance = array( - 'field_name' => $this->field['field_name'], + 'field_id' => $this->field['id'], 'bundle' => FIELD_TEST_BUNDLE, 'widget' => array( 'type' => 'text_textfield', @@ -78,9 +78,9 @@ class TextFieldTestCase extends DrupalWe $entity_type = 'test_entity'; $this->field_name = drupal_strtolower($this->randomName()); $this->field = array('field_name' => $this->field_name, 'type' => $field_type); - field_create_field($this->field); + $this->field = field_create_field($this->field); $this->instance = array( - 'field_name' => $this->field_name, + 'field_id' => $this->field['id'], 'bundle' => FIELD_TEST_BUNDLE, 'label' => $this->randomName() . '_label', 'settings' => array( @@ -130,9 +130,9 @@ class TextFieldTestCase extends DrupalWe $entity_type = 'test_entity'; $this->field_name = drupal_strtolower($this->randomName()); $this->field = array('field_name' => $this->field_name, 'type' => $field_type); - field_create_field($this->field); + $this->field = field_create_field($this->field); $this->instance = array( - 'field_name' => $this->field_name, + 'field_id' => $this->field['id'], 'bundle' => FIELD_TEST_BUNDLE, 'label' => $this->randomName() . '_label', 'settings' => array(