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.

Customising the CMS /

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

Send welcome e-mail to new users


Go to End


7 Posts   1885 Views

Avatar
nekranox

Community Member, 31 Posts

11 March 2011 at 5:09am

Edited: 11/03/2011 5:10am

Hey guys,

There has been a few previous threads on this which have helped me work out what I need to do but I'm stuck at the last hurdle.

I'm decorating the Member class, adding a bit of code to e-mail a welcome message to users added into the CMS. The e-mail has dynamic data in for the users name, login details and e-mail address. Here's my decorator class (MemberDecorator.php):

<?php

class MemberDecorator extends DataObjectDecorator {

	function onAfterWrite() {
	
	parent::onAfterWrite();
	
	   if (isset($this->Created)) {
		  
	
			// send e-mail
			$From = 'noreply@some.domain';
			$To = $this->Email;
			$Subject="Your account details";
			$Body = '<h3>Your account details</h3>
	<p>Hello '.$this->FirstName.' '.$this->LastName.',</p>
	<p>This is an automated message from the website to let you know that we\'ve set up an account for you to access the Members Extranet. Here are your details:</p>
	<p>Login: <strong>'.$this->Email.'</strong><br />Password: <strong>'.$this->Password.'</strong></p>
	<p>If you have any problems with these details, please contact us. Details can be found on the website.</p>';
			
			$email = new Email($From, $To, $Subject, $Body);
			$email->send();
	
	
	
		  
	   }
	}
}

?> 

I think the code is sound in theory but I'm not accessing the Member properties properly, the e-mail isn't showing up unless I hard-code the "To" variable and then all of the dynamic content in the e-mail is missing. Do I have to query or pass the member record somehow? I could just query the latest entry in the table but that's not elegant. Please help!

Thanks

Avatar
swaiba

Forum Moderator, 1899 Posts

11 March 2011 at 6:04am

Might some crazy, but try doing a $doMember = DataObject::get_by_id('Member',$this->ID); then use $doMember instead of $this. I think I may have done something like this before. But whenever I have members added it is usually funnelled through a form and I do the email send there (the same placed I'd add them to a newsletter group for example)

Avatar
nekranox

Community Member, 31 Posts

12 March 2011 at 3:52am

Even $this->ID is blank! If I paste the code directly into the onBeforeWrite in Member.php then it works fine. I want to do it properly though :(

Avatar
swaiba

Forum Moderator, 1899 Posts

12 March 2011 at 4:37am

hmmmmm
strange that Created is there but ID is not, why not try is_numeric($this->ID) instead?

Avatar
(deleted)

Community Member, 473 Posts

12 March 2011 at 8:01am

To access values on the object you're decorating, you need to use $this->owner->Value, so $this->owner->Email.

Avatar
nekranox

Community Member, 31 Posts

18 March 2011 at 2:16am

Thanks Simon!

It's working now but I'm getting an e-mail every time I log in rather than just when the account is created. Is my e-mail code assigned to the wrong event?

<?php

class MemberDecorator extends DataObjectDecorator {

	function onAfterWrite() {
	
	parent::onAfterWrite();
	
	   if (isset($this->owner->Created)) {
		  
	
			// send e-mail
			$From = 'noreply@some.domain';
			$To = $this->owner->Email;
			$Subject="Your account details";
			$Body = '<h3>Your account details</h3>
	<p>Hello '.$this->owner->FirstName.' '.$this->owner->LastName.',</p>
	<p>This is an automated message from the website to let you know that we\'ve set up an account for you to access the Members Extranet. Here are your details:</p>
	<p>Login: <strong>'.$this->owner->Email.'</strong><br />Password: <strong>'.$this->owner->Password.'</strong></p>
	<p>If you have any problems with these details, please contact us. Details can be found on the website.</p>';
			
			$email = new Email($From, $To, $Subject, $Body);
			$email->send();
	
	
	
		  
	   }
	}
}

?> 

Avatar
(deleted)

Community Member, 473 Posts

18 March 2011 at 7:20am

Yup. You'll want it in onBeforeWrite() and have a check for !$this->owner->ID as it gets set on the first write, so will only be false-equivalant once.