views:

239

answers:

1

I have a select list I've created in a form alter, however, when I select an option and submit the value, only the first digit gets stored in the database. I know this has something to do with how the array is formatted, but I can't seem to get it to submit properly.

function addSR_form_service_request_node_form_alter(&$form, $form_state) {
 $form['field_sr_account'] = array( '#weight' => '-50',
                                    '#type' => 'select', 
                                    '#title' => 'Select which account',
                                    '#options' => addSR_getMultiple());

 //Custom submit handler    
 $form['#submit'][] = 'addSR_submit_function';
 }

 function addSR_submit_function{
  $form_state['values']['field_sr_account'] = array('0' => array('value' => $form['#field_sr_account']));

Below is the function that returns the associative array. It is returning the proper options, as I can view the correct value/option in the HTML source when the page loads

//The values returned are not the problem, however, the format of the array could be..
    function addSR_getMultiple(){
           $return = array();
           $return['one'] = 'Choice1'
           $return['two'] = 'Choice2'

           return $return;
         }

Update:

http://stackoverflow.com/questions/2035097/drupal-6-only-inserting-first-character-of-value-to-mysql

I had a similar issue with the same field. However, in that case, I knew the value I wanted to submit, and I was able to assign the value to the field in the form alter, before the form was submitted. The difference with this issue, is that I don't know the value of the field until it is submitted, so I can't "assign" it in the form alter. How can I assign it the same way in the submit handler.

+1  A: 

Edit after question update (and discovery of root problem within the linked separate question):

As you are trying to manipulate CCK fields, and those have pretty special handling mechanisms compared to 'standard' Drupal FAPI form elements, you should probably read up on CCK form handling in general, and hook_form_alter() and CCK fields and CCK hooks in particular. Glancing at those documentations (and the other CCK articles linked in the left sidebar), it looks like there should be a straight forward solution to your problem, but it might require some digging.

As a potential 'quick fix', you could try keeping your current approach, and adjust the submitted value on validation, somewhat like so:

function addSR_form_service_request_node_form_alter(&$form, $form_state) {
  $form['field_sr_account'] = array(
    '#weight' => '-50',
    '#type' => 'select', 
    '#title' => 'Select which account',
    '#options' => addSR_getMultiple()
  );

  // Add custom validation handler    
  $form['#validate'][] = 'addSR_validate_function';
}

function addSR_validate_function (&$form, &$form_state) {
  // Assemble result array as expected by CCK submit handler
  $result = array();
  $result[0] = array();
  $result[0]['value'] = $form_state['values']['field_sr_account'];
  // Set this value in the form results
  form_set_value($form['field_sr_account'], $result, $form_state);
}

NOTE: This is untested code, and I have no idea if it will work, given that CCK will do some stuff within the validation phase as well. The clean way would surely be to understand the CCK form processing workflow first, and manipulating it accordingly afterward.

Henrik Opel
@Henrik Opel - Thanks for the reply. The 'one' and 'two' are actually results from a SQL query. I try not to post SQL if I know its not the problem because it generally raises more questions than solutions. As far as the submit handler, I removed it all together, and the value submitted is '1' when the value shown in the HTML is '10515'. I know it's the first digit because when I select another value that starts with another number, it submits only the first digit of that number.
cinqoTimo
@cinqoTimo - That sounds really weird, and I've not encountered a behavior like this so far. I would now try to ensure that the correct values get posted by the browser, by inspecting the `$_POST` array immediately after form submission (that is, on the first rebuilding of the form, before your submit handler gets called). If, as I'd expect, the correct values get posted, I'd then try stepping through the further processing logic with a debugger, hoping to find the place where some other logic truncates the field. Looks like a really weird bug :/
Henrik Opel
@cinqoTimo: Is the 'field_sr_account' a CCK field? If so, which type is it, and is it configured for multiple values?
Henrik Opel
The field is an Integer. I tried casting the Key stored in the database, but it still returns only the first character. This hasn't been a problem when pulling a single result and assigning it in the form alter. What about inspecting the $_POST variables. Can I do this in Firebug?
cinqoTimo