Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

Form Questions

Form Dropdown only sending ID and not the value


Reply

4 Posts   1826 Views

Avatar
socks

1 May 2011 at 3:53pm Community Member, 190 Posts

The dropdown in my form is only submitting the ID (ie 4) instead of the value (ie Atlanta, Georgia 323 S. 2nd St.). In the $source, I tried switching out "ID" with "LocationDropDown" but that resulted in no data in the dropdown on the site.

Do I need something else to process the form instead of $data['StoreLocale']?

StoreLocation.php

class StoreLocation extends DataObject {
   
public static $db = array(
      'Address' => 'Varchar(80)',
      'City' => 'Varchar',
      'State' => 'Enum("-- Select a state --,Alabama,...,Wyoming")',
   );
   
   // Populate Dropdown on Contact Form
   function LocationDropDown() {
       return $this->City . ', '. $this->State . ' - '. $this->Address;
   }

}

ContactPage.php

class ContactPage_Controller extends Page_Controller {

   // CONTACT FORM

   function ContactForm() {
      // Create fields
      $fields = new FieldSet(
         ...
         new DropdownField(
          $name = 'StoreLocale',
          $title = 'If your comments pertain to a specific store, please pick a location',
          $source = Dataobject::get("StoreLocation")->map("ID", "LocationDropDown", $emptyString = "-- Select Location --", $sortByTitle = false),
          $value = 0
         ),
...
      );
   
      // Create actions
      $actions = new FieldSet(
       new FormAction('doContactForm', 'Submit Form')
      );

      $validator = new RequiredFields("Email","Comments");
      return new Form($this, 'ContactForm', $fields, $actions, $validator);
   
   }
   
   // PROCESS THE FORM
   function doContactForm($data, $form) {
      
      //Set data
...
      $body = '<h1>Feedback / Comments</h1><p><b>From:</b> '.$data['Email'].'</p>'.'<p><b>Location:</b> '.$data['StoreLocale'].'</p>'.$data['Comments'];
      $email = new Email($from, $to, $subject, $body);
      $email->send();
   }
}

Thanks

Avatar
Willr

1 May 2011 at 4:49pm Forum Moderator, 5511 Posts

This is how DropdownFields work. If you want the returned data to be your 'LocationDropDown' field then simply map it to that instead of ID.

Dataobject::get("StoreLocation")->map("LocationDropDown", "LocationDropDown");

Usually an ID is much more useful as you can do a DataObject::get_by_id() in the process function and get the entire object rather than just a string but in your case it would work either way since all you want is the 1 address.

Avatar
simon_w

1 May 2011 at 4:59pm Forum Moderator, 474 Posts

Will's code won't work due to the way the map() function makes it indexes.

$values = Dataobject::get("StoreLocation")->column('LocationDropDown');
...
new DropdownField(
'StoreLocale',
'If your comments pertain to a specific store, please pick a location'
array_combine($values, $values),
null,
null,
'-- Select Location --'
)
...

Avatar
socks

2 May 2011 at 7:42am Community Member, 190 Posts

@Willr
If I was just grabbing the City or State or Address (ie "Address", "Address") that would have worked. But since I had the LocationDropDown() to concatenate the city, state - address, replacing the "ID" broke the form.

@simon_w
That solution worked for me :-)

Thank you both!