Project

General

Profile

1
<?php
2
/**
3
 *
4
 * @category        module
5
 * @package         Form
6
 * @author          WebsiteBaker Project
7
 * @copyright       2009-2011, Website Baker Org. e.V.
8
 * @link			http://www.websitebaker2.org/
9
 * @license         http://www.gnu.org/licenses/gpl.html
10
 * @platform        WebsiteBaker 2.8.x
11
 * @requirements    PHP 5.2.2 and higher
12
 * @version         $Id: view.php 1538 2011-12-10 15:06:15Z Luisehahne $
13
 * @filesource		$HeadURL: svn://isteam.dynxs.de/wb-archiv/branches/2.8.x/wb/modules/form/view.php $
14
 * @lastmodified    $Date: 2011-12-10 16:06:15 +0100 (Sat, 10 Dec 2011) $
15
 * @description     
16
 */
17

    
18
// Must include code to stop this file being access directly
19
/* -------------------------------------------------------- */
20
if(defined('WB_PATH') == false)
21
{
22
	// Stop this file being access directly
23
		die('<head><title>Access denied</title></head><body><h2 style="color:red;margin:3em auto;text-align:center;">Cannot access this file directly</h2></body></html>');
24
}
25
/* -------------------------------------------------------- */
26

    
27
// check if frontend.css file needs to be included into the <body></body> of view.php
28
if((!function_exists('register_frontend_modfiles') || !defined('MOD_FRONTEND_CSS_REGISTERED')) &&
29
	file_exists(WB_PATH .'/modules/form/frontend.css')) {
30
	echo '<style type="text/css">';
31
	include(WB_PATH .'/modules/form/frontend.css');
32
	echo "\n</style>\n";
33
} 
34

    
35
require_once(WB_PATH.'/include/captcha/captcha.php');
36

    
37
// obtain the settings of the output filter module
38
if(file_exists(WB_PATH.'/modules/output_filter/filter-routines.php')) {
39
	include_once(WB_PATH.'/modules/output_filter/filter-routines.php');
40
	$filter_settings = getOutputFilterSettings();
41
} else {
42
	// no output filter used, define default settings
43
	$filter_settings['email_filter'] = 0;
44
}
45

    
46
// Function for generating an optionsfor a select field
47
if (!function_exists('make_option')) {
48
function make_option(&$n, $k, $values) {
49
	// start option group if it exists
50
	if (substr($n,0,2) == '[=') {
51
	 	$n = '<optgroup label="'.substr($n,2,strlen($n)).'">';
52
	} elseif ($n == ']') {
53
		$n = '</optgroup>';
54
	} else {
55
		if(in_array($n, $values)) {
56
			$n = '<option selected="selected" value="'.$n.'">'.$n.'</option>';
57
		} else {
58
			$n = '<option value="'.$n.'">'.$n.'</option>';
59
		}
60
	}
61
}
62
}
63
// Function for generating a checkbox
64
if (!function_exists('make_checkbox')) {
65
function make_checkbox(&$n, $idx, $params) {
66
	$field_id = $params[0][0];
67
	$seperator = $params[0][1];
68
	$label_id = 'wb_'.preg_replace('/[^a-z0-1]/i', '_', $n);
69
	if(in_array($n, $params[1])) {
70
		$n = '<input class="field_checkbox" type="checkbox" id="'.$label_id.'" name="field'.$field_id.'['.$idx.']" value="'.$n.'" checked="checked" />'.'<label for="'.$label_id.'" class="checkbox_label">'.$n.'</lable>'.$seperator;
71
	} else {
72
		$n = '<input class="field_checkbox" type="checkbox" id="'.$label_id.'" name="field'.$field_id.'['.$idx.']" value="'.$n.'" />'.'<label for="'.$label_id.'" class="checkbox_label">'.$n.'</label>'.$seperator;
73
	}	
74
}
75
}
76
// Function for generating a radio button
77
if (!function_exists('make_radio')) {
78
function make_radio(&$n, $idx, $params) {
79
	$field_id = $params[0];
80
	$group = $params[1];
81
	$seperator = $params[2];
82
	$label_id = 'wb_'.preg_replace('/[^a-z0-1]/i', '_', $n);
83
	if($n == $params[3]) { 
84
		$n = '<input class="field_radio" type="radio" id="'.$label_id.'" name="field'.$field_id.'" value="'.$n.'" checked="checked" />'.'<label for="'.$label_id.'" class="radio_label">'.$n.'</label>'.$seperator;
85
	} else {
86
		$n = '<input class="field_radio" type="radio" id="'.$label_id.'" name="field'.$field_id.'" value="'.$n.'" />'.'<label for="'.$label_id.'" class="radio_label">'.$n.'</label>'.$seperator;
87
	}
88
}
89
}
90

    
91
if (!function_exists("new_submission_id") ) {
92
	function new_submission_id() {
93
		$submission_id = '';
94
		$salt = "abchefghjkmnpqrstuvwxyz0123456789";
95
		srand((double)microtime()*1000000);
96
		$i = 0;
97
		while ($i <= 7) {
98
			$num = rand() % 33;
99
			$tmp = substr($salt, $num, 1);
100
			$submission_id = $submission_id . $tmp;
101
			$i++;
102
		}
103
		return $submission_id;
104
	}
105
}
106

    
107
// Work-out if the form has been submitted or not
108
if($_POST == array()) {
109

    
110
// Set new submission ID in session
111
$_SESSION['form_submission_id'] = new_submission_id();
112

    
113
// Get settings
114
$query_settings = $database->query("SELECT header,field_loop,footer,use_captcha FROM ".TABLE_PREFIX."mod_form_settings WHERE section_id = '$section_id'");
115
if($query_settings->numRows() > 0) {
116
	$fetch_settings = $query_settings->fetchRow();
117
	$header = str_replace('{WB_URL}',WB_URL,$fetch_settings['header']);
118
	$field_loop = $fetch_settings['field_loop'];
119
	$footer = str_replace('{WB_URL}',WB_URL,$fetch_settings['footer']);
120
	$use_captcha = $fetch_settings['use_captcha'];
121
	$form_name = 'form';
122
	$use_xhtml_strict = false;
123
} else {
124
	$header = '';
125
	$field_loop = '';
126
	$footer = '';
127
	$form_name = 'form';
128
	$use_xhtml_strict = false;
129
}
130

    
131
?>
132
<form <?php echo ( ( (strlen($form_name) > 0) AND (false == $use_xhtml_strict) ) ? "name=\"".$form_name."\"" : ""); ?> action="<?php echo htmlspecialchars(strip_tags($_SERVER['SCRIPT_NAME'])); ?>#wb_<?PHP echo $section_id;?>" method="post">
133
<div>
134
<input type="hidden" name="submission_id" value="<?php echo $_SESSION['form_submission_id']; ?>" />
135
<?php echo $admin->getFTAN(); ?>
136
</div>
137
<?php
138
if(ENABLED_ASP) { // first add some honeypot-fields
139
?>
140
<div>
141
<input type="hidden" name="submitted_when" value="<?php $t=time(); echo $t; $_SESSION['submitted_when']=$t; ?>" />
142
</div>
143
<p class="nixhier">
144
email address:
145
<label for="email">Leave this field email-address blank:</label>
146
<input id="email" name="email" size="56" value="" /><br />
147
Homepage:
148
<label for="homepage">Leave this field homepage blank:</label>
149
<input id="homepage" name="homepage" size="55" value="" /><br />
150
URL:
151
<label for="url">Leave this field url blank:</label>
152
<input id="url" name="url" size="61" value="" /><br />
153
Comment:
154
<label for="comment">Leave this field comment blank:</label>
155
<textarea id="comment" name="comment" cols="50" rows="10"></textarea><br />
156
</p>
157

    
158
<?php }
159

    
160
// Print header
161
echo $header;
162

    
163
// Get list of fields
164
$query_fields = $database->query("SELECT * FROM ".TABLE_PREFIX."mod_form_fields WHERE section_id = '$section_id' ORDER BY position ASC");
165

    
166
if($query_fields->numRows() > 0) {
167
	while($field = $query_fields->fetchRow()) {
168
		// Set field values
169
		$field_id = $field['field_id'];
170
		$value = $field['value'];
171
		// Print field_loop after replacing vars with values
172
		$vars = array('{TITLE}', '{REQUIRED}');
173
		if (($field['type'] == "radio") || ($field['type'] == "checkbox")) {
174
			$field_title = $field['title'];
175
		} else {
176
			$field_title = '<label for="field'.$field_id.'">'.$field['title'].'</label>';
177
		}
178
		$values = array($field_title);
179
		if ($field['required'] == 1) {
180
			$values[] = '<span class="required">*</span>';
181
		} else {
182
			$values[] = '';
183
		}
184
		if($field['type'] == 'textfield') {
185
			$vars[] = '{FIELD}';
186
			$max_lenght_para = (intval($field['extra']) ? ' maxlenght="'.intval($field['extra']).'"' : '');
187
			$values[] = '<input type="text" name="field'.$field_id.'" id="field'.$field_id.'"'.$max_lenght_para.' value="'.(isset($_SESSION['field'.$field_id])?$_SESSION['field'.$field_id]:$value).'" class="textfield" />';
188
		} elseif($field['type'] == 'textarea') {
189
			$vars[] = '{FIELD}';
190
			$values[] = '<textarea name="field'.$field_id.'" id="field'.$field_id.'" class="textarea" cols="25" rows="5">'.(isset($_SESSION['field'.$field_id])?$_SESSION['field'.$field_id]:$value).'</textarea>';
191
		} elseif($field['type'] == 'select') {
192
			$vars[] = '{FIELD}';
193
			$options = explode(',', $value);
194
			array_walk($options, 'make_option', (isset($_SESSION['field'.$field_id])?$_SESSION['field'.$field_id]:array()));
195
			$field['extra'] = explode(',',$field['extra']);
196
			$values[] = '<select name="field'.$field_id.'[]" id="field'.$field_id.'" size="'.$field['extra'][0].'" '.$field['extra'][1].' class="select">'.implode($options).'</select>';		
197
		} elseif($field['type'] == 'heading') {
198
			$vars[] = '{FIELD}';
199
			$str = '<input type="hidden" name="field'.$field_id.'" id="field'.$field_id.'" value="===['.$field['title'].']===" />';
200
			$values[] = ( true == $use_xhtml_strict) ? "<div>".$str."</div>" : $str;
201
			$tmp_field_loop = $field_loop;		// temporarily modify the field loop template
202
			$field_loop = $field['extra'];
203
		} elseif($field['type'] == 'checkbox') {
204
			$vars[] = '{FIELD}';
205
			$options = explode(',', $value);
206
			array_walk($options, 'make_checkbox', array(array($field_id,$field['extra']),(isset($_SESSION['field'.$field_id])?$_SESSION['field'.$field_id]:array())));
207
			$options[count($options)-1]=substr($options[count($options)-1],0,strlen($options[count($options)-1])-strlen($field['extra']));
208
			$values[] = implode($options);
209
		} elseif($field['type'] == 'radio') {
210
			$vars[] = '{FIELD}';
211
			$options = explode(',', $value);
212
			array_walk($options, 'make_radio', array($field_id,$field['title'],$field['extra'], (isset($_SESSION['field'.$field_id])?$_SESSION['field'.$field_id]:'')));
213
			$options[count($options)-1]=substr($options[count($options)-1],0,strlen($options[count($options)-1])-strlen($field['extra']));
214
			$values[] = implode($options);
215
		} elseif($field['type'] == 'email') {
216
			$vars[] = '{FIELD}';
217
			$max_lenght_para = (intval($field['extra']) ? ' maxlenght="'.intval($field['extra']).'"' : '');
218
			$values[] = '<input type="text" name="field'.$field_id.'" id="field'.$field_id.'" value="'.(isset($_SESSION['field'.$field_id])?$_SESSION['field'.$field_id]:'').'"'.$max_lenght_para.' class="email" />';
219
		}
220
		if(isset($_SESSION['field'.$field_id])) unset($_SESSION['field'.$field_id]);
221
		if($field['type'] != '') {
222
			echo str_replace($vars, $values, $field_loop);
223
		}
224
		if (isset($tmp_field_loop)) $field_loop = $tmp_field_loop;
225
	}
226
}
227

    
228
// Captcha
229
if($use_captcha) { ?>
230
	<tr>
231
	<td class="field_title"><?php echo $TEXT['VERIFICATION']; ?>:</td>
232
	<td><?php call_captcha(); ?></td>
233
	</tr>
234
	<?php
235
}
236

    
237
// Print footer
238
echo $footer;
239
// Add form end code
240
?>
241
</form>
242
<?php
243

    
244
} else {
245

    
246
	// Check that submission ID matches
247
	if(isset($_SESSION['form_submission_id']) AND isset($_POST['submission_id']) AND $_SESSION['form_submission_id'] == $_POST['submission_id']) {
248
		
249
		// Set new submission ID in session
250
		$_SESSION['form_submission_id'] = new_submission_id();
251
		
252
		if(ENABLED_ASP && ( // form faked? Check the honeypot-fields.
253
			(!isset($_POST['submitted_when']) OR !isset($_SESSION['submitted_when'])) OR 
254
			($_POST['submitted_when'] != $_SESSION['submitted_when']) OR
255
			(!isset($_POST['email']) OR $_POST['email']) OR
256
			(!isset($_POST['homepage']) OR $_POST['homepage']) OR
257
			(!isset($_POST['comment']) OR $_POST['comment']) OR
258
			(!isset($_POST['url']) OR $_POST['url'])
259
		)) {
260
			exit(header("Location: ".WB_URL.PAGES_DIRECTORY.""));
261
		}
262
/*
263
		if (!$admin->checkFTAN())
264
		{
265
			$admin->print_error($MESSAGE['GENERIC_SECURITY_ACCESS']);
266
			exit();
267
		}
268
*/
269
		// Submit form data
270
		// First start message settings
271
		$query_settings = $database->query("SELECT * FROM ".TABLE_PREFIX."mod_form_settings WHERE section_id = '$section_id'");
272
		if($query_settings->numRows() > 0) {
273
			$fetch_settings = $query_settings->fetchRow();
274
			$email_to = $fetch_settings['email_to'];
275
			$email_from = $fetch_settings['email_from'];
276
			if(substr($email_from, 0, 5) == 'field') {
277
				// Set the email from field to what the user entered in the specified field
278
				$email_from = htmlspecialchars($wb->add_slashes($_POST[$email_from]));
279
			}
280
			$email_fromname = $fetch_settings['email_fromname'];
281
			$email_subject = $fetch_settings['email_subject'];
282
			$success_page = $fetch_settings['success_page'];
283
			$success_email_to = $fetch_settings['success_email_to'];
284
			if(substr($success_email_to, 0, 5) == 'field') {
285
				// Set the success_email to field to what the user entered in the specified field
286
				$success_email_to = htmlspecialchars($wb->add_slashes($_POST[$success_email_to]));
287
			}
288
			$success_email_from = $fetch_settings['success_email_from'];
289
			$success_email_fromname = $fetch_settings['success_email_fromname'];
290
			$success_email_text = $fetch_settings['success_email_text'];
291
			$success_email_subject = $fetch_settings['success_email_subject'];		
292
			$max_submissions = $fetch_settings['max_submissions'];
293
			$stored_submissions = $fetch_settings['stored_submissions'];
294
			$use_captcha = $fetch_settings['use_captcha'];
295
		} else {
296
			exit($TEXT['UNDER_CONSTRUCTION']);
297
		}
298
		$email_body = '';
299
		
300
		// Create blank "required" array
301
		$required = array();
302
		
303
		// Captcha
304
		if($use_captcha) {
305
			if(isset($_POST['captcha']) AND $_POST['captcha'] != ''){
306
				// Check for a mismatch
307
				if(!isset($_POST['captcha']) OR !isset($_SESSION['captcha']) OR $_POST['captcha'] != $_SESSION['captcha']) {
308
					$captcha_error = $MESSAGE['MOD_FORM']['INCORRECT_CAPTCHA'];
309
				}
310
			} else {
311
				$captcha_error = $MESSAGE['MOD_FORM']['INCORRECT_CAPTCHA'];
312
			}
313
		}
314
		if(isset($_SESSION['captcha'])) { unset($_SESSION['captcha']); }
315

    
316
		// Loop through fields and add to message body
317
		// Get list of fields
318
		$query_fields = $database->query("SELECT * FROM ".TABLE_PREFIX."mod_form_fields WHERE section_id = '$section_id' ORDER BY position ASC");
319
		if($query_fields->numRows() > 0) {
320
			while($field = $query_fields->fetchRow()) {
321
				// Add to message body
322
				if($field['type'] != '') {
323
					if(!empty($_POST['field'.$field['field_id']])) {
324
						// do not allow droplets in user input!
325
						if (is_array($_POST['field'.$field['field_id']])) {
326
							$_SESSION['field'.$field['field_id']] = str_replace(array("[[", "]]"), array("&#91;&#91;", "&#93;&#93;"), $_POST['field'.$field['field_id']]);
327
						} else {
328
							$_SESSION['field'.$field['field_id']] = str_replace(array("[[", "]]"), array("&#91;&#91;", "&#93;&#93;"), htmlspecialchars($_POST['field'.$field['field_id']]));
329
						}
330
						// if the output filter is active, we need to revert (dot) to . and (at) to @ (using current filter settings)
331
						// otherwise the entered mail will not be accepted and the recipient would see (dot), (at) etc.
332
						if ($filter_settings['email_filter']) {
333
							$field_value = $_POST['field'.$field['field_id']];
334
							$field_value = str_replace($filter_settings['at_replacement'], '@', $field_value);
335
							$field_value = str_replace($filter_settings['dot_replacement'], '.', $field_value);
336
							$_POST['field'.$field['field_id']] = $field_value;
337
						}
338
						if($field['type'] == 'email' AND $admin->validate_email($_POST['field'.$field['field_id']]) == false) {
339
							$email_error = $MESSAGE['USERS']['INVALID_EMAIL'];
340
						}
341
						if($field['type'] == 'heading') {
342
							$email_body .= $_POST['field'.$field['field_id']]."\n\n";
343
						} elseif (!is_array($_POST['field'.$field['field_id']])) {
344
							$email_body .= $field['title'].': '.$_POST['field'.$field['field_id']]."\n\n";
345
						} else {
346
							$email_body .= $field['title'].": \n";
347
							foreach ($_POST['field'.$field['field_id']] as $k=>$v) {
348
								$email_body .= $v."\n";
349
							}
350
							$email_body .= "\n";
351
						}
352
					} elseif($field['required'] == 1) {
353
						$required[] = $field['title'];
354
					}
355
				}
356
			}
357
		}
358
	
359
		// Check if the user forgot to enter values into all the required fields
360
		if($required != array()) {
361
			if(!isset($MESSAGE['MOD_FORM']['REQUIRED_FIELDS'])) {
362
				echo 'You must enter details for the following fields';
363
			} else {
364
				echo $MESSAGE['MOD_FORM']['REQUIRED_FIELDS'];
365
			}
366
			echo ':<br /><ul>';
367
			foreach($required AS $field_title) {
368
				echo '<li>'.$field_title;
369
			}
370
			if(isset($email_error)) {
371
				echo '<li>'.$email_error.'</li>';
372
			}
373
			if(isset($captcha_error)) {
374
				echo '<li>'.$captcha_error.'</li>';
375
			}
376
			echo '</ul><a href="'.htmlspecialchars(strip_tags($_SERVER['SCRIPT_NAME'])).'">'.$TEXT['BACK'].'</a>';
377
		} else {
378
			if(isset($email_error)) {
379
				echo '<br /><ul>';
380
				echo '<li>'.$email_error.'</li>';
381
				echo '</ul><a href="'.htmlspecialchars(strip_tags($_SERVER['SCRIPT_NAME'])).'">'.$TEXT['BACK'].'</a>';
382
			} elseif(isset($captcha_error)) {
383
				echo '<br /><ul>';
384
				echo '<li>'.$captcha_error.'</li>';
385
				echo '</ul><a href="'.htmlspecialchars(strip_tags($_SERVER['SCRIPT_NAME'])).'">'.$TEXT['BACK'].'</a>';
386
			} else {
387
				// Check how many times form has been submitted in last hour
388
				$last_hour = time()-3600;
389
				$query_submissions = $database->query("SELECT submission_id FROM ".TABLE_PREFIX."mod_form_submissions WHERE submitted_when >= '$last_hour'");
390
				if($query_submissions->numRows() > $max_submissions) {
391
					// Too many submissions so far this hour
392
					echo $MESSAGE['MOD_FORM']['EXCESS_SUBMISSIONS'];
393
					$success = false;
394
				} else {
395
					/**	
396
					 *	Adding the IP to the body and try to send the email
397
					 */
398
					// $email_body .= "\n\nIP: ".$_SERVER['REMOTE_ADDR'];
399

    
400
					if($email_to != '') {
401
						if($email_from != '') {
402
							if($wb->mail($email_from,$email_to,$email_subject,$email_body,$email_fromname)) {
403
								$success = true;
404
							}
405
						} else {
406
							if($wb->mail('',$email_to,$email_subject,$email_body,$email_fromname)) { 
407
								$success = true; 
408
							}
409
						}
410
					}				
411
					if($success_email_to != '') {
412
						if($success_email_from != '') {
413
							if($wb->mail($success_email_from,$success_email_to,$success_email_subject,$success_email_text,$success_email_fromname)) {
414
								$success = true;
415
							}
416
						} else {
417
							if($wb->mail('',$success_email_to,$success_email_subject,$success_email_text,$success_email_fromname)) {
418
								$success = true;
419
							}
420
						}
421
					}				
422
			
423
					// Write submission to database
424
					if(isset($admin) AND $admin->is_authenticated() AND $admin->get_user_id() > 0) {
425
						$submitted_by = $admin->get_user_id();
426
					} else {
427
						$submitted_by = 0;
428
					}
429
					$email_body = htmlspecialchars($wb->add_slashes($email_body));
430
					$database->query("INSERT INTO ".TABLE_PREFIX."mod_form_submissions (page_id,section_id,submitted_when,submitted_by,body) VALUES ('".PAGE_ID."','$section_id','".time()."','$submitted_by','$email_body')");
431
					// Make sure submissions table isn't too full
432
					$query_submissions = $database->query("SELECT submission_id FROM ".TABLE_PREFIX."mod_form_submissions ORDER BY submitted_when");
433
					$num_submissions = $query_submissions->numRows();
434
					if($num_submissions > $stored_submissions) {
435
						// Remove excess submission
436
						$num_to_remove = $num_submissions-$stored_submissions;
437
						while($submission = $query_submissions->fetchRow()) {
438
							if($num_to_remove > 0) {
439
								$submission_id = $submission['submission_id'];
440
								$database->query("DELETE FROM ".TABLE_PREFIX."mod_form_submissions WHERE submission_id = '$submission_id'");
441
								$num_to_remove = $num_to_remove-1;
442
							}
443
						}
444
					}
445
					if(!$database->is_error()) {
446
						$success = true;
447
					}
448
				}
449
			}	
450
		}
451
	}
452
	
453
	// Now check if the email was sent successfully
454
	if(isset($success) AND $success == true) {
455
	   if ($success_page=='none') {
456
			echo str_replace("\n","<br />",$success_email_text);
457
  		} else {
458
			$query_menu = $database->query("SELECT link,target FROM ".TABLE_PREFIX."pages WHERE `page_id` = '$success_page'");
459
			if($query_menu->numRows() > 0) {
460
  	        	$fetch_settings = $query_menu->fetchRow();
461
			   $link = WB_URL.PAGES_DIRECTORY.$fetch_settings['link'].PAGE_EXTENSION;
462
			   echo "<script type='text/javascript'>location.href='".$link."';</script>";
463
			}    
464
		}
465
		// clearing session on success
466
		$query_fields = $database->query("SELECT field_id FROM ".TABLE_PREFIX."mod_form_fields WHERE section_id = '$section_id'");
467
		while($field = $query_fields->fetchRow()) {
468
			$field_id = $field[0];
469
			if(isset($_SESSION['field'.$field_id])) unset($_SESSION['field'.$field_id]);
470
		}
471
	} else {
472
		if(isset($success) AND $success == false) {
473
			echo $TEXT['ERROR'];
474
		}
475
	}
476
}
(21-21/22)