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.

General Questions

General questions about getting started with SilverStripe that don't fit in any of the categories above.

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

[solved] Newsletter subscription error on existing user email


Reply

4 Posts   650 Views

Avatar
Pipifix

10 February 2012 at 4:31am Community Member, 54 Posts

Hi everybody.

On bugfixin our latest project we discovered a strange newsletter subscription error. On the homepage there is a form saving all subscribers as a new member in the db. if a mailadress is already saved – no matter whether teh user is an admin or in another usergroup – a exception is thrwon.

throw new ValidationException(new ValidationResult(false, sprintf(
629                _t(
630                   'Member.ValidationIdentifierFailed',
631                   'Can\'t overwrite existing member #%d with identical identifier (%s = %s))',
632                   PR_MEDIUM,
633                   'The values in brackets show a fieldname mapped to a value, usually denoting an existing email address'
634                ),

The code on Homepage.php

// Make sure you set this to the right group.
   // See http://doc.silverstripe.com/doku.php?do=show&id=recipes%3Aforms
   private $defaultGroupID = 3;

   /**
   * This function lets you put a form on your page, using $Form.
   */
    function NewsletterForm() {
      return new Form($this, "NewsletterForm", new FieldSet(

         // List your fields here
         new TextField("Surname", "Name"),
         new EmailField("Email", "E-Mail")

      ), new FieldSet(

         // List the action buttons here
         new FormAction("SignupAction", "Eintragen")

      ), new RequiredFields(
         'Email',
         'Surname'   
      ));
   }

   /**
   * 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();

      // Add the member to group. (Check if it exists first)
      if($group = DataObject::get_one('Group', "ID = $this->defaultGroupID")) {

         $member->Groups()->add($group);
         // Redirect to a page thanking people for registering
         Director::redirect('newsletter-erfolgreich-eingetragen/');

      }else{
         // Redirect to a failure page
         Director::redirect('newsletter-registristrierungs-fehler/');

      }

   }

$defaultGroupID = 3 is the newsletter user group created in the security section of the cms.
Why does the Director::redirect('newsletter-registristrierungs-fehler/'); not work?
What to edit on this code to catch this error?

Thanks. Pipifix

Silverstripe 2.46

Avatar
Devlin

10 February 2012 at 5:09am Community Member, 215 Posts

What to edit on this code to catch this error?

You will need to validate the mailadress yourself. Silverstripe will just throw the error, because double user identifier is a bad thing.

Why does the Director::redirect('newsletter-registristrierungs-fehler/'); not work?

Because you check in your if clause if a group with the ID 3 exists. Which of course is always the case since you created it.

Avatar
Pipifix

10 February 2012 at 6:38am Community Member, 54 Posts

Thanks Devlin.

The double user issue was clear. See the thread headline ;) The second things was too obviously. ^^
You're right. This condition is always true. My problem is i'm a php-noob. I need a lot more programming exercise to write creative and useful code. The most of the code provided here, im able to read and understand. Thats why i ask for a little coding help.

I found this snippet of code http://www.silverstripe.org/all-other-modules/show/15228?start=8#post311707 and tried to adapt it. This checkt the user and sanitize the mailadress. But this piece dont write in the usergroup and the redirection is something weird. (404) I like the idea to set the NewsletterSubscriber as a 'quiet' user and redirect them to a sucess-page or a failure-page. No login should be seen.

Thanks again. Pipifix.

Avatar
Pipifix

14 February 2012 at 7:05am Community Member, 54 Posts

[solved]

Hello verybody , hello Devlin.

I found a snippet/tutorial that do exactly what i want so i wana share this with you.
http://www.clickheredigital.co.uk/blog/how-to-include-a-silverstripe-form-on-any-every-page/

happy coding. Pipifix