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.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Form Questions /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Form Dropdown only sending ID and not the value


Go to End


4 Posts   3144 Views

Avatar
socks

Community Member, 191 Posts

1 May 2011 at 3:53pm

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

Forum Moderator, 5523 Posts

1 May 2011 at 4:49pm

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
(deleted)

Community Member, 473 Posts

1 May 2011 at 4:59pm

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

Community Member, 191 Posts

2 May 2011 at 7:42am

@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!