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.

Template Questions /

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

problem getting CheckboxSetField data to display in email template


Go to End


3 Posts   2515 Views

Avatar
Optic Blaze

Community Member, 190 Posts

4 December 2012 at 9:46pm

Hi there,

I have a custom email form that i am building and i am having some hassles. I make use of CheckboxSetField for the visitor to select a couple of options. My problem is that when the email template form tries to process the data i get an error message:
Uncaught Exception: Object->__call(): the method 'fortemplate' does not exist on 'ArrayData'

I am guessing that because the $DiveHolidays object is an array and not a string, the template does not like it.

See code below

-------------------------------------------------------------------------------------------
Email form (mysite/code/EnquireForm.php)
--------------------------------------------------------------------------------------------

<?php
class EnquireForm extends Page {
}

class EnquireForm_Controller extends Page_Controller {

public static $allowed_actions = array (
'ContactForm'
);

public function init() {
parent::init();
}

function ContactForm() {

// Dive Holidays //
$holidays = array(
'Red Sea North' => 'Red Sea North',
'Red Sea South' => 'Red Sea South'
);

// Create fields
$fields = new FieldList(
new TextField('Name', 'Your name and surname*'),
new TextField('Tel', 'Your contact phone number*'),
new EmailField('Email', 'Your email address*'),
new TextareaField('Comments','Your query/comments*'),
new CheckboxSetField( 'DiveHolidays', 'Dive Holidays', $holidays)
);

// Create action
$actions = new FieldList(
new FormAction('SendContactForm', 'Submit')
);

// Create Validators
$validator = new RequiredFields('Name', 'Email', 'Comments');
return new Form($this, 'ContactForm', $fields, $actions, $validator);
}

function SendContactForm($data, $form) {

$From = 'test@test.com';
$To = 'client@client.com';
$Subject = 'Website Feedback';
$email = new Email($From, $To, $Subject);
//set template
$email->setTemplate('ContactEmail');
//populate template
$email->populateTemplate($data);
//send mail
$email->send();
//return to submitted message
$form->sessionMessage('We will be in touch','good');
Controller::curr()->redirectBack();
}

}

---------------------------------------------------------------
Email template (ContactEmail.ss)
---------------------------------------------------------------

<h1> Your website has generated the following feedback: </h1>

<p>Name: $Name </p>
<p>Contact number: $Tel </p>
<p>Email:$Email </p>
<p>Holidays:$DiveHolidays </p>
<p>Comments:$Comments </p>

Avatar
kewalaka

Community Member, 1 Post

3 January 2013 at 5:58pm

Edited: 03/01/2013 5:59pm

Hello,

Firstly in your .php I'd suggest removing the spaces from the array IDs, I couldn't get that working:

...
function ContactForm() { 
       
         // Dive Holidays // 
         $holidays = array(    
         'RedSeaNorth' => 'Red Sea North', 
         'RedSeaSouth' => 'Red Sea South' 
         );    
...

In your template, ContactEmail.ss, you can display the list of selected items in a CheckboxSetField like this (e.g. using an <ul>):

<ul>
<% control DiveHolidays %>  <!-- title of CheckboxSetField -->
	<% if RedSeaNorth %><li>Red Sea North</li><% end_if %>
	<% if RedSeaSouth %><li>Red Sea South</li><% end_if %>
<% end_control %> 
</ul>

It is a bit of a cludge but it works for me, does anyone else know a better way?

Stu

Avatar
Optic Blaze

Community Member, 190 Posts

4 January 2013 at 1:08am

Hi,

I managed to find a better way. By adding the following, you implode the array and make it a string that you can use in your template:

// Implode checkbox values
if(isset($data['DiveHolidays'])) {$DiveHolidays= implode(',', $data['DiveHolidays']);} else {$DiveHolidays=' ';}

//populate template
$email->populateTemplate($data);
$email->populateTemplate(array('DiveHolidays'=> $DiveHolidays));

Then all you have to do in the .ss template is call
$DiveHolidays