? Makefile ? d6-50-nodes.sql.gz ? d7-50-nodes-new.sql.gz ? d7-50-nodes.sql.gz ? head.kpf ? patches ? modules/field_ui ? modules/field/modules/combo ? scripts/OLD-generate-autoload.pl ? scripts/generate-autoload.pl ? sites/all/cck ? sites/all/modules/devel ? sites/all/modules/pbs ? sites/all/modules/taint ? sites/default/files ? sites/default/settings.php Index: modules/field/field.attach.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.attach.inc,v retrieving revision 1.35 diff -u -F^[fc] -r1.35 field.attach.inc --- modules/field/field.attach.inc 11 Aug 2009 14:59:40 -0000 1.35 +++ modules/field/field.attach.inc 12 Aug 2009 23:21:56 -0000 @@ -457,6 +457,11 @@ function _field_invoke_multiple_default( function field_attach_form($obj_type, $object, &$form, &$form_state) { $form += (array) _field_invoke_default('form', $obj_type, $object, $form, $form_state); + // Add custom weight handling. + list($id, $vid, $bundle) = field_attach_extract_ids($obj_type, $object); + $form['#pre_render'][] = 'field_attach_extra_weights'; + $form['#extra_fields'] = field_attach_extra_fields($bundle); + // Let other modules make changes to the form. foreach (module_implements('field_attach_form') as $module) { $function = $module . '_field_attach_form'; @@ -1043,6 +1048,11 @@ function field_attach_view($obj_type, $o $output = _field_invoke_default('view', $obj_type, $object, $build_mode); + // Add custom weight handling. + list($id, $vid, $bundle) = field_attach_extract_ids($obj_type, $object); + $output['#pre_render'][] = 'field_attach_extra_weights'; + $output['#extra_fields'] = field_attach_extra_fields($bundle); + // Let other modules make changes after rendering the view. drupal_alter('field_attach_view', $output, $obj_type, $object, $build_mode); @@ -1051,6 +1061,81 @@ function field_attach_view($obj_type, $o } /** + * Pre-render callback to adjust weights of non-field elements on objects. + */ +function field_attach_extra_weights($elements) { + if (isset($elements['#extra_fields'])) { + foreach ($elements['#extra_fields'] as $key => $value) { + // Some core 'fields' use a different key in node forms and in 'view' + // render arrays. Check we're not on a form first. + if (!isset($elements['#build_id']) && isset($value['view']) && isset($elements[$value['view']])) { + $elements[$value['view']]['#weight'] = $value['weight']; + } + elseif (isset($elements[$key])) { + $elements[$key]['#weight'] = $value['weight']; + } + } + } + return $elements; +} + +/** + * Retrieve the user-defined weight for pseudo-field components. + * + * @param $bundle_name + * The bundle name. + * @param $pseudo_field_name + * The name of the 'field'. + * @return + * The weight for the 'field', respecting the user settings stored + * by field.module. + */ +function field_attach_extra_weight($bundle_name, $pseudo_field_name) { + $extra = field_attach_extra_fields($bundle_name); + if (isset($extra[$pseudo_field_name])) { + return $extra[$pseudo_field_name]['weight']; + } +} + +/** + * Collect the list of pseudo-field components in a given bundle. + * + * @param $bundle_name + * The bundle name. + * @return + * The array of pseudo-field elements in the bundle. + */ +function field_attach_extra_fields($bundle_name) { + $info = &drupal_static(__FUNCTION__, array()); + + if (empty($info)) { + $info = array(); + $bundles = field_info_bundles(); + foreach ($bundles as $bundle => $bundle_label) { + // Gather information about non-field object additions. + $extra = module_invoke_all('field_ui_extra_fields', $bundle); + drupal_alter('field_ui_extra_fields', $extra, $bundle); + + // Add saved weights. + foreach (variable_get("field_extra_weights_$bundle", array()) as $key => $value) { + // Some stored entries might not exist anymore, for instance if uploads + // have been disabled, or vocabularies removed... + if (isset($extra[$key])) { + $extra[$key]['weight'] = $value; + } + } + $info[$bundle] = $extra; + } + } + if (array_key_exists($bundle_name, $info)) { + return $info[$bundle_name]; + } + else { + return array(); + } +} + +/** * Implement hook_node_prepare_translation. * * TODO D7: We do not yet know if this really belongs in Field API. Index: modules/field/field.crud.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.crud.inc,v retrieving revision 1.24 diff -u -F^[fc] -r1.24 field.crud.inc --- modules/field/field.crud.inc 11 Aug 2009 14:59:40 -0000 1.24 +++ modules/field/field.crud.inc 12 Aug 2009 23:21:56 -0000 @@ -635,8 +635,8 @@ function field_read_instances($params = foreach ($params as $key => $value) { $query->condition('fci.' . $key, $value); } - $query->condition('fc.active', 1); if (!isset($include_additional['include_inactive']) || !$include_additional['include_inactive']) { + $query->condition('fc.active', 1); $query->condition('fci.widget_active', 1); } if (!isset($include_additional['include_deleted']) || !$include_additional['include_deleted']) { Index: modules/field/field.default.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.default.inc,v retrieving revision 1.13 diff -u -F^[fc] -r1.13 field.default.inc --- modules/field/field.default.inc 11 Aug 2009 04:46:29 -0000 1.13 +++ modules/field/field.default.inc 12 Aug 2009 23:21:56 -0000 @@ -43,10 +43,15 @@ function field_default_submit($obj_type, function field_default_insert($obj_type, $object, $field, $instance, &$items) { // _field_invoke() populates $items with an empty array if the $object has no // entry for the field, so we check on the $object itself. - if (!property_exists($object, $field['field_name']) && !empty($instance['default_value_function'])) { - $function = $instance['default_value_function']; - if (drupal_function_exists($function)) { - $items = $function($obj_type, $object, $field, $instance); + if (empty($object) || !property_exists($object, $field['field_name'])) { + if (!empty($instance['default_value_function'])) { + $function = $instance['default_value_function']; + if (drupal_function_exists($function)) { + $items = $function($obj_type, $object, $field, $instance); + } + } + elseif (!empty($instance['default_value'])) { + $items = $instance['default_value']; } } } Index: modules/field/field.form.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.form.inc,v retrieving revision 1.12 diff -u -F^[fc] -r1.12 field.form.inc --- modules/field/field.form.inc 27 Jul 2009 20:19:20 -0000 1.12 +++ modules/field/field.form.inc 12 Aug 2009 23:21:56 -0000 @@ -38,12 +38,9 @@ function field_default_form($obj_type, $ ); // Populate widgets with default values if we're creating a new object. - if (empty($items) && empty($id) && !empty($instance['default_value_function'])) { - $items = array(); - $function = $instance['default_value_function']; - if (drupal_function_exists($function)) { - $items = $function($obj_type, $object, $field, $instance); - } + if (empty($items) && empty($id)) { + drupal_function_exists('field_default_insert'); + field_default_insert($obj_type, $object, $field, $instance, $items); } $form_element = array(); Index: modules/field/field.info =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.info,v retrieving revision 1.4 diff -u -F^[fc] -r1.4 field.info --- modules/field/field.info 8 Jun 2009 09:23:51 -0000 1.4 +++ modules/field/field.info 12 Aug 2009 23:21:56 -0000 @@ -1,7 +1,7 @@ ; $Id: field.info,v 1.4 2009/06/08 09:23:51 dries Exp $ name = Field description = Field API to add fields to objects like nodes and users. -package = Core - fields +package = Core version = VERSION core = 7.x files[] = field.module Index: modules/field/field.info.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.info.inc,v retrieving revision 1.12 diff -u -F^[fc] -r1.12 field.info.inc --- modules/field/field.info.inc 11 Aug 2009 14:59:40 -0000 1.12 +++ modules/field/field.info.inc 12 Aug 2009 23:21:56 -0000 @@ -25,6 +25,7 @@ */ function _field_info_cache_clear() { _field_info_collate_types(TRUE); + drupal_static_reset('field_build_modes'); _field_info_collate_fields(TRUE); } @@ -263,6 +264,11 @@ function _field_info_prepare_instance($i // Make sure all expected instance settings are present. $instance['settings'] += field_info_instance_settings($field['type']); + // Set a default value for the instance. + if (field_behaviors_widget('default value', $instance) == FIELD_BEHAVIOR_DEFAULT && !isset($instance['default_value'])) { + $instance['default_value'] = NULL; + } + // Fallback to default widget if widget type is not available. if (!field_info_widget_types($instance['widget']['type'])) { $instance['widget']['type'] = $field_type['default_widget']; Index: modules/field/field.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/field.module,v retrieving revision 1.22 diff -u -F^[fc] -r1.22 field.module --- modules/field/field.module 11 Aug 2009 14:59:40 -0000 1.22 +++ modules/field/field.module 12 Aug 2009 23:21:56 -0000 @@ -280,14 +280,15 @@ function field_associate_fields($module) */ function field_set_empty($field, $items) { // Filter out empty values. - $filtered = array(); $function = $field['module'] . '_field_is_empty'; - foreach ((array) $items as $delta => $item) { - if (!$function($item, $field)) { - $filtered[] = $item; + if (drupal_function_exists($function)) { + foreach ((array) $items as $delta => $item) { + if ($function($item, $field)) { + unset($items[$delta]); + } } } - return $filtered; + return $items; } /** @@ -335,7 +336,7 @@ function _field_sort_items_value_helper( * Registry of available build modes. */ function field_build_modes($obj_type) { - static $info; + $info = &drupal_static(__FUNCTION__, array()); if (!isset($info[$obj_type])) { $info[$obj_type] = module_invoke_all('field_build_modes', $obj_type); Index: modules/field/modules/field_sql_storage/field_sql_storage.info =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/field_sql_storage/field_sql_storage.info,v retrieving revision 1.3 diff -u -F^[fc] -r1.3 field_sql_storage.info --- modules/field/modules/field_sql_storage/field_sql_storage.info 8 Jun 2009 09:23:51 -0000 1.3 +++ modules/field/modules/field_sql_storage/field_sql_storage.info 12 Aug 2009 23:21:56 -0000 @@ -1,7 +1,7 @@ ; $Id: field_sql_storage.info,v 1.3 2009/06/08 09:23:51 dries Exp $ name = Field SQL storage description = Stores field data in an SQL database. -package = Core - fields +package = Core version = VERSION core = 7.x files[] = field_sql_storage.module Index: modules/field/modules/list/list.info =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/list/list.info,v retrieving revision 1.4 diff -u -F^[fc] -r1.4 list.info --- modules/field/modules/list/list.info 12 Jun 2009 08:39:36 -0000 1.4 +++ modules/field/modules/list/list.info 12 Aug 2009 23:21:56 -0000 @@ -1,7 +1,7 @@ ; $Id: list.info,v 1.4 2009/06/12 08:39:36 dries Exp $ name = List description = Defines list field types. Use with Options to create selection lists. -package = Core - fields +package = Core version = VERSION core = 7.x files[]=list.module Index: modules/field/modules/list/list.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/list/list.module,v retrieving revision 1.7 diff -u -F^[fc] -r1.7 list.module --- modules/field/modules/list/list.module 1 Aug 2009 06:03:12 -0000 1.7 +++ modules/field/modules/list/list.module 12 Aug 2009 23:21:56 -0000 @@ -28,28 +28,28 @@ function list_field_info() { 'list' => array( 'label' => t('List'), 'description' => t('This field stores numeric keys from key/value lists of allowed values where the key is a simple alias for the position of the value, i.e. 0|First option, 1|Second option, 2|Third option.'), - 'settings' => array('allowed_values_function' => ''), + 'settings' => array('allowed_values' => '', 'allowed_values_function' => ''), 'default_widget' => 'options_select', 'default_formatter' => 'list_default', ), 'list_boolean' => array( 'label' => t('Boolean'), 'description' => t('This field stores simple on/off or yes/no options.'), - 'settings' => array('allowed_values_function' => ''), + 'settings' => array('allowed_values' => '', 'allowed_values_function' => ''), 'default_widget' => 'options_select', 'default_formatter' => 'list_default', ), 'list_number' => array( 'label' => t('List (numeric)'), 'description' => t('This field stores keys from key/value lists of allowed numbers where the stored numeric key has significance and must be preserved, i.e. \'Lifetime in days\': 1|1 day, 7|1 week, 31|1 month.'), - 'settings' => array('allowed_values_function' => ''), + 'settings' => array('allowed_values' => '', 'allowed_values_function' => ''), 'default_widget' => 'options_select', 'default_formatter' => 'list_default', ), 'list_text' => array( 'label' => t('List (text)'), 'description' => t('This field stores keys from key/value lists of allowed values where the stored key has significance and must be a varchar, i.e. \'US States\': IL|Illinois, IA|Iowa, IN|Indiana'), - 'settings' => array('allowed_values_function' => ''), + 'settings' => array('allowed_values' => '', 'allowed_values_function' => ''), 'default_widget' => 'options_select', 'default_formatter' => 'list_default', ), @@ -98,6 +98,136 @@ function list_field_schema($field) { } /** + * Implement hook_field_settings_form(). + */ +function list_field_settings_form($field, $instance) { + $field_type = $field['type']; + + $settings = $field['settings']; + $form['allowed_values'] = array( + '#type' => 'textarea', + '#title' => t('Allowed values list'), + '#default_value' => $settings['allowed_values'], + '#required' => FALSE, + '#rows' => 10, + '#description' => '

' . t('The possible values this field can contain. Enter one value per line, in the format key|label. The key is the value that will be stored in the database, and must be a %type value. The label is optional, and the key will be used as the label if no label is specified.') . '

', + '#element_validate' => array('list_allowed_values_validate'), + '#list_field_type' => $field_type, + '#access' => empty($settings['allowed_values_function']), + ); + + // Alter the description for allowed values slightly depending + // on the type of widget. + if ($instance['widget']['type'] == 'options_onoff') { + $form['allowed_values']['#description'] .= '

' . t("For a 'single on/off checkbox' widget, define the 'off' value first, then the 'on' value in the Allowed values section. Note that the checkbox will be labeled with the label of the 'on' value.") . '

'; + } + elseif ($instance['widget']['type'] == 'options_buttons') { + $form['allowed_values']['#description'] .= '

' . t("The 'checkboxes/radio buttons' widget will display checkboxes if the Number of values option is greater than 1 for this field, otherwise radios will be displayed.") . '

'; + } + + $form['allowed_values']['#description'] .= t('Allowed HTML tags in labels: @tags', array('%type' => $field['type'] == 'list_text' ? 'text' : 'numeric', '@tags' => _field_filter_xss_display_allowed_tags())); + + $form['allowed_values_function'] = array( + '#type' => 'value', + '#value' => $settings['allowed_values_function'], + ); + $form['allowed_values_function_display'] = array( + '#type' => 'item', + '#title' => t('Allowed values list'), + '#markup' => t('The value of this field is being determined by the %function function and may not be changed.', array('%function' => $settings['allowed_values_function'])), + '#access' => !empty($settings['allowed_values_function']), + ); + + return $form; +} + +/** + * Create an array of the allowed values for this field. + * + * @todo Rework to create a method of selecting pluggable allowed values lists. + */ +function list_allowed_values($field) { + $allowed_values = drupal_static(__FUNCTION__, array()); + + if (isset($allowed_values[$field['field_name']])) { + return $allowed_values[$field['field_name']]; + } + + $allowed_values[$field['field_name']] = array(); + + $function = $field['settings']['allowed_values_function']; + if (!empty($function) && drupal_function_exists($function)) { + $allowed_values[$field['field_name']] = $function($field); + } + elseif (!empty($field['settings']['allowed_values'])) { + $allowed_values[$field['field_name']] = list_allowed_values_list($field['settings']['allowed_values'], $field['type'] == 'list'); + } + + return $allowed_values[$field['field_name']]; +} + +/** + * Create an array of the allowed values for this field. + * + * Explode a string with keys and labels separated with '|' and with each new + * value on its own line. + * + * @param $string_values + * The list of choices as a string. + * @param $position_keys + * Boolean value indicating whether to generate keys based on the position of + * the value if a key is not manually specified, effectively generating + * integer-based keys. This should only be TRUE for fields that have a type of + * "list". Otherwise the value will be used as the key if not specified. + */ +function list_allowed_values_list($string_values, $position_keys = FALSE) { + $allowed_values = array(); + + $list = explode("\n", $string_values); + $list = array_map('trim', $list); + $list = array_filter($list, 'strlen'); + foreach ($list as $key => $value) { + // Sanitize the user input with a permissive filter. + $value = field_filter_xss($value); + + // Check for a manually specified key. + if (strpos($value, '|') !== FALSE) { + list($key, $value) = explode('|', $value); + } + // Otherwise see if we need to use the value as the key. The "list" type + // automatically will convert non-keyed lines to integers. + elseif (!$position_keys) { + $key = $value; + } + $allowed_values[$key] = (isset($value) && $value !== '') ? $value : $key; + } + + return $allowed_values; +} + +/** + * Element validate callback; check that the entered values are valid. + */ +function list_allowed_values_validate($element, &$form_state) { + $values = list_allowed_values_list($element['#value'], $element['#list_field_type'] == 'list'); + $field_type = $element['#list_field_type']; + foreach ($values as $key => $value) { + if ($field_type == 'list_number' && !is_numeric($key)) { + form_error($element, t('The entered available values are not valid. Each key must be a valid integer or decimal.')); + break; + } + elseif ($field_type == 'list_text' && strlen($key) > 255) { + form_error($element, t('The entered available values are not valid. Each key must be a string less than 255 characters.')); + break; + } + elseif ($field_type == 'list' && (!preg_match('/^-?\d+$/', $key))) { + form_error($element, t('The entered available values are not valid. All specified keys must be integers.')); + break; + } + } +} + +/** * Implement hook_field_validate(). * * Possible error codes: @@ -161,29 +291,3 @@ function theme_field_formatter_list_defa function theme_field_formatter_list_key($element) { return $element['#item']['safe']; } - -/** - * Create an array of the allowed values for this field. - * - * Call the allowed_values_function to retrieve the allowed - * values array. - * - * TODO Rework this to create a method of selecting plugable allowed values lists. - */ -function list_allowed_values($field) { - static $allowed_values; - - if (isset($allowed_values[$field['field_name']])) { - return $allowed_values[$field['field_name']]; - } - - $allowed_values[$field['field_name']] = array(); - - if (isset($field['settings']['allowed_values_function'])) { - $function = $field['settings']['allowed_values_function']; - if (drupal_function_exists($function)) { - $allowed_values[$field['field_name']] = $function($field); - } - } - return $allowed_values[$field['field_name']]; -} Index: modules/field/modules/number/number.info =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/number/number.info,v retrieving revision 1.4 diff -u -F^[fc] -r1.4 number.info --- modules/field/modules/number/number.info 12 Jun 2009 08:39:36 -0000 1.4 +++ modules/field/modules/number/number.info 12 Aug 2009 23:21:56 -0000 @@ -1,7 +1,7 @@ ; $Id: number.info,v 1.4 2009/06/12 08:39:36 dries Exp $ name = Number description = Defines numeric field types. -package = Core - fields +package = Core version = VERSION core = 7.x files[]=number.module Index: modules/field/modules/number/number.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/number/number.module,v retrieving revision 1.11 diff -u -F^[fc] -r1.11 number.module --- modules/field/modules/number/number.module 1 Aug 2009 06:03:12 -0000 1.11 +++ modules/field/modules/number/number.module 12 Aug 2009 23:21:56 -0000 @@ -88,6 +88,76 @@ function number_field_schema($field) { } /** + * Implement hook_field_settings_form(). + */ +function number_field_settings_form($field, $instance) { + $form = array(); + $settings = $field['settings']; + + if ($field['type'] == 'number_decimal') { + $form['precision'] = array( + '#type' => 'select', + '#title' => t('Precision'), + '#options' => drupal_map_assoc(range(10, 32)), + '#default_value' => $settings['precision'], + '#description' => t('The total number of digits to store in the database, including those to the right of the decimal.'), + ); + $form['scale'] = array( + '#type' => 'select', + '#title' => t('Scale'), + '#options' => drupal_map_assoc(range(0, 10)), + '#default_value' => $settings['scale'], + '#description' => t('The number of digits to the right of the decimal.'), + ); + $form['decimal'] = array( + '#type' => 'select', + '#title' => t('Decimal marker'), + '#options' => array('.' => 'decimal point', ',' => 'comma', ' ' => 'space'), + '#default_value' => $settings['decimal'], + '#description' => t('The character users will input to mark the decimal point in forms.'), + ); + } + return $form; +} + +/** + * Implement hook_field_instance_settings_form(). + */ +function number_field_instance_settings_form($field, $instance) { + $settings = $instance['settings']; + + $form['min'] = array( + '#type' => 'textfield', + '#title' => t('Minimum'), + '#default_value' => $settings['min'], + '#description' => t('The minimum value that should be allowed in this field. Leave blank for no minimum.'), + '#element_validate' => array('_element_validate_number'), + ); + $form['max'] = array( + '#type' => 'textfield', + '#title' => t('Maximum'), + '#default_value' => $settings['max'], + '#description' => t('The maximum value that should be allowed in this field. Leave blank for no maximum.'), + '#element_validate' => array('_element_validate_number'), + ); + $form['prefix'] = array( + '#type' => 'textfield', + '#title' => t('Prefix'), + '#default_value' => $settings['prefix'], + '#size' => 60, + '#description' => t("Define a string that should be prefixed to the value, like '$ ' or '€ '. Leave blank for none. Separate singular and plural values with a pipe ('pound|pounds')."), + ); + $form['suffix'] = array( + '#type' => 'textfield', + '#title' => t('Suffix'), + '#default_value' => $settings['suffix'], + '#size' => 60, + '#description' => t("Define a string that should suffixed to the value, like ' m', ' kb/s'. Leave blank for none. Separate singular and plural values with a pipe ('pound|pounds')."), + ); + return $form; +} + +/** * Implement hook_field_validate(). * * Possible error codes: Index: modules/field/modules/options/options.info =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/options/options.info,v retrieving revision 1.3 diff -u -F^[fc] -r1.3 options.info --- modules/field/modules/options/options.info 12 Jun 2009 08:39:36 -0000 1.3 +++ modules/field/modules/options/options.info 12 Aug 2009 23:21:56 -0000 @@ -1,7 +1,7 @@ ; $Id: options.info,v 1.3 2009/06/12 08:39:36 dries Exp $ name = Options description = Defines selection, check box and radio button widgets for text and numeric fields. -package = Core - fields +package = Core version = VERSION core = 7.x files[]=options.module Index: modules/field/modules/text/text.info =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.info,v retrieving revision 1.5 diff -u -F^[fc] -r1.5 text.info --- modules/field/modules/text/text.info 12 Jun 2009 08:39:37 -0000 1.5 +++ modules/field/modules/text/text.info 12 Aug 2009 23:21:56 -0000 @@ -1,7 +1,7 @@ ; $Id: text.info,v 1.5 2009/06/12 08:39:37 dries Exp $ name = Text description = Defines simple text field types. -package = Core - fields +package = Core version = VERSION core = 7.x files[] = text.module Index: modules/field/modules/text/text.module =================================================================== RCS file: /cvs/drupal/drupal/modules/field/modules/text/text.module,v retrieving revision 1.17 diff -u -F^[fc] -r1.17 text.module --- modules/field/modules/text/text.module 4 Aug 2009 06:38:56 -0000 1.17 +++ modules/field/modules/text/text.module 12 Aug 2009 23:21:56 -0000 @@ -129,6 +129,46 @@ function text_field_schema($field) { } /** + * Implement hook_field_settings_form(). + */ +function text_field_settings_form($field, $instance) { + $settings = $field['settings']; + $form['max_length'] = array( + '#type' => 'textfield', + '#title' => t('Maximum length'), + '#default_value' => $settings['max_length'], + '#required' => FALSE, + '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'), + '#element_validate' => array('_element_validate_integer_positive'), + ); + return $form; +} + +/** + * Implement hook_field_instance_settings_form(). + */ +function text_field_instance_settings_form($field, $instance) { + $settings = $instance['settings']; + $options = array(0 => t('Plain text'), 1 => t('Filtered text (user selects input format)')); + $form['text_processing'] = array( + '#type' => 'radios', + '#title' => t('Text processing'), + '#default_value' => $settings['text_processing'], + '#options' => $options, + ); + if ($field['type'] == 'text_with_summary') { + $form['display_summary'] = array( + '#type' => 'select', + '#title' => t('Display summary'), + '#options' => array(0 => t('No'), 1 => t('Yes')), + '#default_value' => $settings['display_summary'], + '#description' => t('Display the summary to allow the user to input a summary value. Hide the summary to automatically fill it with a trimmed portion from the main post. '), + ); + } + return $form; +} + +/** * Implement hook_field_validate(). * * Possible error codes: @@ -467,6 +507,33 @@ function text_field_widget_info() { } /** + * Implement hook_field_widget_settings_form(). + */ +function text_field_widget_settings_form($field, $instance) { + $widget = $instance['widget']; + $settings = $widget['settings']; + if ($widget['type'] == 'text_textfield') { + $form['size'] = array( + '#type' => 'textfield', + '#title' => t('Size of textfield'), + '#default_value' => $settings['size'], + '#required' => TRUE, + '#element_validate' => array('_element_validate_integer_positive'), + ); + } + else { + $form['rows'] = array( + '#type' => 'textfield', + '#title' => t('Rows'), + '#default_value' => $settings['rows'], + '#required' => TRUE, + '#element_validate' => array('_element_validate_integer_positive'), + ); + } + return $form; +} + +/** * Implement FAPI hook_elements(). * * Any FAPI callbacks needed for individual widgets can be declared here, Index: modules/node/node.module =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.module,v retrieving revision 1.1097 diff -u -F^[fc] -r1.1097 node.module --- modules/node/node.module 12 Aug 2009 12:39:18 -0000 1.1097 +++ modules/node/node.module 12 Aug 2009 23:21:56 -0000 @@ -149,7 +149,6 @@ function node_fieldable_info() { return $return; } - /** * Implement hook_field_build_modes(). */ @@ -174,6 +173,99 @@ function node_field_build_modes($obj_typ } /** + * Implement hook_field_ui_extra_fields(). + */ +function node_field_ui_extra_fields($bundle) { + $extra = array(); + if ($type = node_type_get_type($bundle)) { + if ($type->has_title) { + $extra['title'] = array( + 'label' => $type->title_label, + 'description' => t('Node module element.'), + 'weight' => -5 + ); + } + $extra['revision_information'] = array( + 'label' => t('Revision information'), + 'description' => t('Node module form.'), + 'weight' => 20 + ); + $extra['author'] = array( + 'label' => t('Authoring information'), + 'description' => t('Node module form.'), + 'weight' => 20 + ); + $extra['options'] = array( + 'label' => t('Publishing options'), + 'description' => t('Node module form.'), + 'weight' => 25 + ); + if (module_exists('comment') && variable_get("comment_$bundle", 2) != 0) { + $extra['comment_settings'] = array( + 'label' => t('Comment settings'), + 'description' => t('Comment module form.'), + 'weight' => 30 + ); + } + if (module_exists('locale') && variable_get("language_content_type_$bundle", 0)) { + $extra['language'] = array( + 'label' => t('Language'), + 'description' => t('Locale module element.'), + 'weight' => 0 + ); + } + if (module_exists('menu')) { + $extra['menu'] = array( + 'label' => t('Menu settings'), + 'description' => t('Menu module element.'), + 'weight' => -2 + ); + } + if (module_exists('taxonomy') && taxonomy_get_vocabularies($bundle)) { + $extra['taxonomy'] = array( + 'label' => t('Taxonomy'), + 'description' => t('Taxonomy module element.'), + 'weight' => -3 + ); + } + if (module_exists('book')) { + $extra['book'] = array( + 'label' => t('Book'), + 'description' => t('Book module element.'), + 'weight' => 10 + ); + } + if ($bundle == 'poll' && module_exists('poll')) { + $extra['title'] = array( + 'label' => t('Poll title'), + 'description' => t('Poll module title.'), + 'weight' => -5 + ); + $extra['choice_wrapper'] = array( + 'label' => t('Poll choices'), + 'description' => t('Poll module choices.'), + 'weight' => -4 + ); + $extra['settings'] = array( + 'label' => t('Poll settings'), + 'description' => t('Poll module settings.'), + 'weight' => -3 + ); + } + if (module_exists('upload') && variable_get("upload_$bundle", TRUE)) { + $extra['attachments'] = array( + 'label' => t('File attachments'), + 'description' => t('Upload module element.'), + 'weight' => 30, + 'view' => 'files' + ); + } + } + + return $extra; +} + +/** * Gather a listing of links to nodes. * * @param $result Index: modules/taxonomy/taxonomy.module =================================================================== RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v retrieving revision 1.495 diff -u -F^[fc] -r1.495 taxonomy.module --- modules/taxonomy/taxonomy.module 11 Aug 2009 15:50:56 -0000 1.495 +++ modules/taxonomy/taxonomy.module 12 Aug 2009 23:21:56 -0000 @@ -2052,3 +2052,34 @@ function _taxonomy_clean_field_cache($te function taxonomy_term_title($term) { return check_plain($term->name); } + +/** + * Implement hook_field_settings_form(). + */ +function taxonomy_field_settings_form($field, $instance) { + // Get the right values for allowed_values_function, which is a core setting. + $options = array(); + $vocabularies = taxonomy_get_vocabularies(); + foreach ($vocabularies as $vocabulary) { + $options[$vocabulary->vid] = $vocabulary->name; + } + $form['allowed_values'] = array( + '#tree' => TRUE, + ); + foreach ($field['settings']['allowed_values'] as $delta => $tree) { + $form['allowed_values'][$delta]['vid'] = array( + '#type' => 'select', + '#title' => t('Vocabulary'), + '#default_value' => $tree['vid'], + '#options' => $options, + '#required' => TRUE, + '#description' => t('The vocabulary which supplies the options for this field.'), + ); + $form['allowed_values'][$delta]['parent'] = array( + '#type' => 'value', + '#value' => $tree['parent'], + ); + } + + return $form; +} Index: modules/user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.1021 diff -u -F^[fc] -r1.1021 user.module --- modules/user/user.module 12 Aug 2009 12:36:05 -0000 1.1021 +++ modules/user/user.module 12 Aug 2009 23:21:56 -0000 @@ -120,6 +120,33 @@ function user_field_build_modes($obj_typ return $modes; } +/** + * Implement hook_field_ui_extra_fields(). + */ +function user_field_ui_extra_fields($bundle) { + $extra = array(); + + if ($bundle == 'user') { + $extra['account'] = array( + 'label' => 'User name and password', + 'description' => t('User module form element'), + 'weight' => -10 + ); + $extra['timezone'] = array( + 'label' => 'Timezone', + 'description' => t('User module form element.'), + 'weight' => 6 + ); + $extra['summary'] = array( + 'label' => 'History', + 'description' => t('User module view element.'), + 'weight' => 5 + ); + } + + return $extra; +} + function user_external_load($authname) { $uid = db_query("SELECT uid FROM {authmap} WHERE authname = :authname", array(':authname' => $authname))->fetchField(); Index: profiles/default/default.info =================================================================== RCS file: /cvs/drupal/drupal/profiles/default/default.info,v retrieving revision 1.1 diff -u -F^[fc] -r1.1 default.info --- profiles/default/default.info 15 Jul 2009 02:08:41 -0000 1.1 +++ profiles/default/default.info 12 Aug 2009 23:21:56 -0000 @@ -14,3 +14,4 @@ core = 7.x dependencies[] = dblog dependencies[] = search dependencies[] = toolbar +dependencies[] = field_ui