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

Checkboxes and workflow...


Reply

4 Posts   976 Views

Avatar
Puppy

17 August 2010 at 9:07am Community Member, 10 Posts

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

18 August 2010 at 2:49pm Community Member, 254 Posts

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

21 August 2010 at 3:36am Community Member, 10 Posts

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

25 August 2010 at 11:58pm Community Member, 10 Posts

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/');
            }
         }
      }
      
      

   }
}?>