2
votes

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:

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
Your example is confusing, as there is no select list involved anywhere - you might want to edit it to show your select list handling (There should be no need for the weird 'workaround' via the separate '#field_cckField' entry - or I do not understand what it is intended to do).Henrik Opel
@Henrik Opel - You're right, I was trying to simplify it, but I made it more confusing. I restated the problem above.tpow
@Henrik Opel - Is there a way to pass this to some sort of session variable? This problem is killing me. With straight PHP, it is so easy - I guess it is the drawback of having an awesome system like Drupal..tpow
@cinqoTimo: Using a session variable would be a very questionable approach, and I would not do it. I updated my answer below according to your discoveries in the other question.Henrik Opel

1 Answers

1
votes

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.