From 839f1d68bc771e579a9f48324624973e0c996ebc Mon Sep 17 00:00:00 2001 From: Daryn Warriner Date: Wed, 25 Aug 2010 14:50:24 -0500 Subject: [PATCH] Fix #6626 - Add text area custom field type. Add column to handle long text input. If the custom field type is TEXTAREA values are inserted into the text field. Otherwise they are inserted into the existing value field. Filters for TEXTAREA custom fields are not populated with existing data. A text box is provided and a LIKE query is performed. --- admin/schema.php | 2 ++ config_defaults_inc.php | 2 +- core/cfdefs/cfdef_standard.php | 24 ++++++++++++++++++++++++ core/constant_inc.php | 1 + core/custom_field_api.php | 15 ++++++++++----- core/filter_api.php | 11 +++++++++-- lang/strings_english.txt | 2 +- 7 files changed, 48 insertions(+), 9 deletions(-) diff --git a/admin/schema.php b/admin/schema.php index efd1b1f302..c613974ea8 100644 --- a/admin/schema.php +++ b/admin/schema.php @@ -609,3 +609,5 @@ function installer_db_now() { $upgrade[] = Array( 'CreateIndexSQL', Array( 'idx_email_id', db_get_table( 'email' ), 'email_id', array( 'DROP' ) ), Array( 'db_index_exists', Array( db_get_table( 'email' ), 'idx_email_id') ) ); $upgrade[] = Array( 'UpdateFunction', 'correct_multiselect_custom_fields_db_format' ); $upgrade[] = Array( 'UpdateFunction', "stored_filter_migrate" ); +$upgrade[] = Array( 'AddColumnSQL', Array( db_get_table( 'custom_field_string' ), " + text XL NULL DEFAULT NULL " ) ); diff --git a/config_defaults_inc.php b/config_defaults_inc.php index 2fd16a51c5..cce161ffaf 100644 --- a/config_defaults_inc.php +++ b/config_defaults_inc.php @@ -3041,7 +3041,7 @@ * * @global string $g_custom_field_type_enum_string */ -$g_custom_field_type_enum_string = '0:string,1:numeric,2:float,3:enum,4:email,5:checkbox,6:list,7:multiselection list,8:date,9:radio'; +$g_custom_field_type_enum_string = '0:string,1:numeric,2:float,3:enum,4:email,5:checkbox,6:list,7:multiselection list,8:date,9:radio,10:textarea'; /********************************* * MantisBT Javascript Variables * diff --git a/core/cfdefs/cfdef_standard.php b/core/cfdefs/cfdef_standard.php index 5f278b3cc5..3e181871b6 100644 --- a/core/cfdefs/cfdef_standard.php +++ b/core/cfdefs/cfdef_standard.php @@ -31,6 +31,20 @@ '#function_string_value_for_email' => null, ); +$g_custom_field_type_definition[ CUSTOM_FIELD_TYPE_TEXTAREA] = array ( + '#display_possible_values' => TRUE, + '#display_valid_regexp' => TRUE, + '#display_length_min' => TRUE, + '#display_length_max' => TRUE, + '#display_default_value' => TRUE, + '#function_return_distinct_values' => null, + '#function_value_to_database' => null, + '#function_database_to_value' => null, + '#function_print_input' => 'cfdef_input_textarea', + '#function_string_value' => null, + '#function_string_value_for_email' => null, +); + $g_custom_field_type_definition[ CUSTOM_FIELD_TYPE_NUMERIC ] = array ( '#display_possible_values' => TRUE, '#display_valid_regexp' => TRUE, @@ -300,6 +314,16 @@ function cfdef_input_textbox($p_field_def, $t_custom_field_value) { echo ' value="' . string_attribute( $t_custom_field_value ) .'">'; } +function cfdef_input_textarea($p_field_def, $t_custom_field_value) { + echo ''; +} + /** * Prints the controls for the date selector. * diff --git a/core/constant_inc.php b/core/constant_inc.php index 57e16bfa94..f5cdf08050 100644 --- a/core/constant_inc.php +++ b/core/constant_inc.php @@ -419,6 +419,7 @@ define( 'CUSTOM_FIELD_TYPE_MULTILIST', 7 ); define( 'CUSTOM_FIELD_TYPE_DATE', 8 ); define( 'CUSTOM_FIELD_TYPE_RADIO', 9 ); +define( 'CUSTOM_FIELD_TYPE_TEXTAREA', 10 ); # Meta filter values define( 'META_FILTER_MYSELF', -1 ); diff --git a/core/custom_field_api.php b/core/custom_field_api.php index 4307d12d35..570b677498 100644 --- a/core/custom_field_api.php +++ b/core/custom_field_api.php @@ -62,6 +62,7 @@ # ******************************************* $g_custom_field_types[CUSTOM_FIELD_TYPE_STRING] = 'standard'; +$g_custom_field_types[CUSTOM_FIELD_TYPE_TEXTAREA] = 'standard'; $g_custom_field_types[CUSTOM_FIELD_TYPE_NUMERIC] = 'standard'; $g_custom_field_types[CUSTOM_FIELD_TYPE_FLOAT] = 'standard'; $g_custom_field_types[CUSTOM_FIELD_TYPE_ENUM] = 'standard'; @@ -1008,8 +1009,10 @@ function custom_field_get_value( $p_field_id, $p_bug_id ) { return false; } + $t_value_field = ( $row['type'] == CUSTOM_FIELD_TYPE_TEXTAREA ? 'text' : 'value' ); + $t_custom_field_string_table = db_get_table( 'custom_field_string' ); - $query = "SELECT value + $query = "SELECT $t_value_field FROM $t_custom_field_string_table WHERE bug_id=" . db_param() . " AND field_id=" . db_param(); @@ -1351,8 +1354,10 @@ function custom_field_set_value( $p_field_id, $p_bug_id, $p_value, $p_log_insert $t_type = custom_field_get_field( $p_field_id, 'type' ); $t_custom_field_string_table = db_get_table( 'custom_field_string' ); + $t_value_field = ( $t_type == CUSTOM_FIELD_TYPE_TEXTAREA ) ? 'text' : 'value'; + # Determine whether an existing value needs to be updated or a new value inserted - $query = "SELECT value + $query = "SELECT $t_value_field FROM $t_custom_field_string_table WHERE field_id=" . db_param() . " AND bug_id=" . db_param(); @@ -1360,16 +1365,16 @@ function custom_field_set_value( $p_field_id, $p_bug_id, $p_value, $p_log_insert if( db_num_rows( $result ) > 0 ) { $query = "UPDATE $t_custom_field_string_table - SET value=" . db_param() . " + SET $t_value_field=" . db_param() . " WHERE field_id=" . db_param() . " AND bug_id=" . db_param(); db_query_bound( $query, Array( custom_field_value_to_database( $p_value, $t_type ), $c_field_id, $c_bug_id ) ); $row = db_fetch_array( $result ); - history_log_event_direct( $c_bug_id, $t_name, custom_field_database_to_value( $row['value'], $t_type ), $p_value ); + history_log_event_direct( $c_bug_id, $t_name, custom_field_database_to_value( $row[$t_value_field], $t_type ), $p_value ); } else { $query = "INSERT INTO $t_custom_field_string_table - ( field_id, bug_id, value ) + ( field_id, bug_id, $t_value_field ) VALUES ( " . db_param() . ', ' . db_param() . ', ' . db_param() . ')'; db_query_bound( $query, Array( $c_field_id, $c_bug_id, custom_field_value_to_database( $p_value, $t_type ) ) ); diff --git a/core/filter_api.php b/core/filter_api.php index 857fb957a2..bc581db0ae 100644 --- a/core/filter_api.php +++ b/core/filter_api.php @@ -938,10 +938,11 @@ function filter_get_query_sort_data( &$p_filter, $p_show_sticky, $p_query_clause if( strpos( $c_sort, 'custom_' ) === 0 ) { $t_custom_field = utf8_substr( $c_sort, utf8_strlen( 'custom_' ) ); $t_custom_field_id = custom_field_get_id_from_name( $t_custom_field ); - + $t_def = custom_field_get_definition( $t_custom_field_id ); + $t_value_field = ( $t_def['type'] == CUSTOM_FIELD_TYPE_TEXTAREA ? 'text' : 'value' ); $c_cf_alias = str_replace( ' ', '_', $t_custom_field ); $t_cf_table_alias = $t_custom_field_string_table . '_' . $t_custom_field_id; - $t_cf_select = "$t_cf_table_alias.value $c_cf_alias"; + $t_cf_select = "$t_cf_table_alias.$t_value_field $c_cf_alias"; # check to be sure this field wasn't already added to the query. if( !in_array( $t_cf_select, $p_query_clauses['select'] ) ) { @@ -1924,6 +1925,10 @@ function filter_get_bug_rows( &$p_page_number, &$p_per_page, &$p_page_count, &$p $t_where_params[] = '%|' . $t_filter_member . '|%'; array_push( $t_filter_array, db_helper_like( "$t_table_name.value" ) ); break; + case CUSTOM_FIELD_TYPE_TEXTAREA: + $t_where_params[] = '%' . $t_filter_member . '%'; + array_push( $t_filter_array, db_helper_like( "$t_table_name.text" ) ); + break; default: array_push( $t_filter_array, "$t_table_name.value = '" . db_prepare_string( $t_filter_member ) . "'" ); } @@ -4029,6 +4034,8 @@ function print_filter_custom_field( $p_field_id ) { } else if( isset( $t_accessible_custom_fields_names[$j] ) ) { if( $t_accessible_custom_fields_types[$j] == CUSTOM_FIELD_TYPE_DATE ) { print_filter_custom_field_date( $j, $p_field_id ); + } else if( $t_accessible_custom_fields_types[$j] == CUSTOM_FIELD_TYPE_TEXTAREA ) { + echo ''; } else { echo '