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

Checkboxes and workflow...


Go to End


4 Posts   1819 Views

Avatar
Puppy

Community Member, 10 Posts

17 August 2010 at 9:07am

Hi guys,

I am really enjoying using Silverstripe and having fun learning to customise but I have run into a small problem while playing with the tutorial form.

<?php

class RegistrationForm extends Page {
}
 
class RegistrationForm_Controller extends Page_Controller {
 
	// Make sure you set this to the right group.
	// See http://doc.silverstripe.com/doku.php?do=show&amp;id=recipes%3Aforms
 
	/**
	* This function lets you put a form on your page, using $Form.
	*/
	function Form() {
		return new Form($this, "Form", new FieldSet(
 
			// List your fields here
			new TextField("FirstName", "First name"),
			new TextField("Surname"),
			new EmailField("Email", "Email address"),
			new CheckboxField(
			$name = "Private",
			$title = "I would like to remain private")
			
		), new FieldSet(
 
			// List the action buttons here
			new FormAction("SignupAction", "Sign up")
 
		), new RequiredFields(
					"FirstName", "Email", "Surname"
			// List the required fields here: "Email", "FirstName"
 
		));
	}
 
	/**
	* This function is called when the user submits the form.
	*/
	function SignupAction($data, $form) {
	
	if(isset($form->Private)){
		// Create a new Member object and load the form data into it
		$member = new Member();
		$form->saveInto($member);
		$defaultGroupID = 6;
 
		// Write it to the database.  This needs to happen before we add it to a group
		$member->write();
 
		// Add the member to group. (Check if it exists first)
		if($group = DataObject::get_one('Group', "ID = $defaultGroupID")) { 
 
			$member->Groups()->add($group);
			// Redirect to a page thanking people for registering
			Director::redirect('thanks-for-your-support/');
 
		}else{
 
			// Redirect to a failure page
			Director::redirect('registration-failed/');
 
		}
	}
	else{
	// Create a new Member object and load the form data into it
		$member = new Member();
		$form->saveInto($member);
		$defaultGroupID = 5;
 
		// Write it to the database.  This needs to happen before we add it to a group
		$member->write();
 
		// Add the member to group. (Check if it exists first)
		if($group = DataObject::get_one('Group', "ID = $defaultGroupID")) { 
 
			$member->Groups()->add($group);
			// Redirect to a page thanking people for registering
			Director::redirect('thanks-for-registering/');
 
		}else{
 
			// Redirect to a failure page
			Director::redirect('registration-failed/');
 
		}
	}
 
	}
}
?>

I've relentlessly searched the forums/documentation and tried numerous ways to have a checkbox define the behaviour of the form with an if statement.

I have a category for 'supporters' (4) which has two sub-categories for Public (5) and Private (6). (This will be useful when I need to display supporters of our website as they are able to opt out of public listings. Though I would still be able to show all in admin pages using group (4). )

All works reasonably well but it is refusing to check if the checkbox has been selected therefore routing everyone into Public (5) by the else statement.

if(isset($form->Private))

I was playing around with the position of the member class which is created before but I have tried other alternatives such as POST.

I would be really grateful if someone could point me into the right direction.

Avatar
Bambii7

Community Member, 254 Posts

18 August 2010 at 2:49pm

Doesn't isset($form->Private) check if the var is set? So regardless if true or false it'll be set wont it?
Maybe check ($form->Private==1)

Avatar
Puppy

Community Member, 10 Posts

21 August 2010 at 3:36am

Yep you're right ! With problems I had before I had overlooked $member instead of the $form I needed, my bad!

Solved this problem with ($member->Private==1)

<?php
class RegistrationForm extends Page {
}
 
class RegistrationForm_Controller extends Page_Controller {
 
	// Make sure you set this to the right group.
	// See http://doc.silverstripe.com/doku.php?do=show&id=recipes%3Aforms 
	/**
	* This function lets you put a form on your page, using $Form.
	*/
	function Form() {
		return new Form($this, "Form", new FieldSet(
 
			// List your fields here
			new TextField("FirstName", "First name"),
			new TextField("Surname"),
			new EmailField("Email", "Email address"),
			new ConfirmedPasswordField("Password"),
			new CheckboxField("Private", "Please tick to remain private")
 
		), new FieldSet(
 
			// List the action buttons here
			new FormAction("SignupAction", "Sign up")
 
		), new RequiredFields(
			"FirstName", "Email", "Surname"
			// List the required fields here: "Email", "FirstName"
 
		));
	}
	
	/**
	* This function is called when the user submits the form.
	*/
	function SignupAction($data, $form) {
 
		// Create a new Member object and load the form data into it
		$member = new Member();
		$form->saveInto($member);
		
			// Write it to the database.  This needs to happen before we add it to a group
			$member->write();
			
			// Check if private setting is on
			if($member->Private==1){
				$privGroupID = 6;
				// Add the member to group. (Check if it exists first)
				if($group = DataObject::get_one('Group', "ID = $privGroupID")) { 
					$member->Groups()->add($group);
					// Redirect to a page thanking people for registering
					Director::redirect('thanks-for-registering-privately/');
		 
				}else{
					// Redirect to a failure page
					Director::redirect('registration-failed/');
				}
			}else{
				$defaultGroupID = 5;
				// Add the member to group. (Check if it exists first)
				if($group = DataObject::get_one('Group', "ID = $defaultGroupID")) { 
					$member->Groups()->add($group);
					// Redirect to a page thanking people for registering
					Director::redirect('thanks-for-registering/');
		 
				}else{
					// Redirect to a failure page
					Director::redirect('registration-failed/');
				}
			}
		
		
 
	}
}?>

Though, I am having problems building an email check with get_one()

if($member = DataObject::get_one('Member', "Email = '". Convert::raw2sql($data['Email']) ."'")) 

OR
$email = Convert::raw2sql($data['Email']);

if($member = DataObject::get_one('Member', "Email = $email")) 

Would it be sensible to use the $member variable again or does something look wrong to anyone?

Avatar
Puppy

Community Member, 10 Posts

25 August 2010 at 11:58pm

Found a better method for checking the database to see if email exists.

<?php
class RegistrationForm extends Page {
}
 
class RegistrationForm_Controller extends Page_Controller {
 
	// Make sure you set this to the right group.
	// See http://doc.silverstripe.com/doku.php?do=show&id=recipes%3Aforms 
	/**
	* This function lets you put a form on your page, using $Form.
	*/
	function Form() {
		return new Form($this, "Form", new FieldSet(
 
			// List your fields here
			new TextField("FirstName", "First name"),
			new TextField("Surname"),
			new EmailField("Email", "Email address"),
			new ConfirmedPasswordField("Password"),
			new CheckboxField("Private", "Please tick to remain private")
 
		), new FieldSet(
 
			// List the action buttons here
			new FormAction("SignupAction", "Sign up")
 
		), new RequiredFields(
			"FirstName", "Email", "Surname"
			// List the required fields here: "Email", "FirstName"
 
		));
	}
	
	/**
	* This function is called when the user submits the form.
	*/
	function SignupAction($data, $form) {
 
		// Create a new Member object and load the form data into it
		$member = new Member();
		$form->saveInto($member);
		
		
		if(DataObject::get_one('Member', "Email = '".$member->getField('Email')."'")) {
		// Redirect to a failure page
		$form->addErrorMessage("Email", 'Sorry, the email you have entered is already registered.', "bad");
		
			Session::set("FormInfo.Form_Form.data", $data);
			
			return Director::redirectBack();
		
		}else{		
			// Write it to the database.  This needs to happen before we add it to a group
			$member->write();
			
			// Check if private setting is on
			if($member->Private==1){
				$privGroupID = 6;
				// Add the member to group. (Check if it exists first)
				if($group = DataObject::get_one('Group', "ID = $privGroupID")) { 
					$member->Groups()->add($group);
					// Redirect to a page thanking people for registering
					Director::redirect('thanks-for-registering-privately/');
		 
				}else{
					// Redirect to a failure page
					Director::redirect('registration-failed/');
				}
			}else{
				$defaultGroupID = 5;
				// Add the member to group. (Check if it exists first)
				if($group = DataObject::get_one('Group', "ID = $defaultGroupID")) { 
					$member->Groups()->add($group);
					// Redirect to a page thanking people for registering
					Director::redirect('thanks-for-registering/');
		 
				}else{
					// Redirect to a failure page
					Director::redirect('registration-failed/');
				}
			}
		}
		
		
 
	}
}?>