$error)); } function get_form_response($success, $data) { if (!is_array($data)) die('data must be array'); $status = array(); $status[$success ? 'FormResponse' : 'MusePHPFormResponse'] = array_merge(array('success' => $success), $data); return json_serialize($status); } function check_required_fields($form) { $errors = array(); foreach ($form['fields'] as $field => $properties) { if (!$properties['required']) continue; if (!array_key_exists($field, $_REQUEST) || empty($_REQUEST[$field])) array_push($errors, array('field' => $field, 'message' => $properties['errors']['required'])); else if (!check_field_value_format($form, $field, $properties)) array_push($errors, array('field' => $field, 'message' => $properties['errors']['format'])); } if (!empty($errors)) die(get_form_error_response(array('fields' => $errors))); } function check_field_value_format($form, $field, $properties) { $value = get_form_field_value($field, $properties, $form['resources']); switch($properties['type']) { case 'checkbox': case 'string': case 'captcha': // no format to validate for those fields return true; case 'recaptcha': if (!array_key_exists('recaptcha', $form) || !array_key_exists('private_key', $form['recaptcha']) || empty($form['recaptcha']['private_key'])) die(get_form_error_response($form['resources']['invalid_reCAPTCHA_private_key'])); $resp = recaptcha_check_answer($form['recaptcha']['private_key'], $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); return $resp->is_valid; case 'email': return 1 == preg_match('/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i', $value); default: die(get_form_error_response(sprintf($form['resources']['invalid_field_type'], $properties['type']))); } } function email_form_submission($form) { if(!defined('PHP_EOL')) define('PHP_EOL', '\r\n'); $form_email = ((array_key_exists('Email', $_REQUEST) && !empty($_REQUEST['Email'])) ? cleanup_email($_REQUEST['Email']) : ''); $to = $form['email']['to']; $subject = $form['subject']; $message = get_email_body($subject, $form['heading'], $form['fields'], $form['resources']); $headers = get_email_headers($to, $form_email); $sent = @mail($to, $subject, $message, $headers); if(!$sent) die(get_form_error_response($form['resources']['failed_to_send_email'])); $success_data = array( 'redirect' => $form['success_redirect'] ); echo get_form_response(true, $success_data); } function get_email_headers($to_email, $form_email) { $headers = 'From: ' . $to_email . PHP_EOL; $headers .= 'Reply-To: ' . $form_email . PHP_EOL; $headers .= 'X-Mailer: Adobe Muse CC 2014.3.2.295 with PHP' . PHP_EOL; $headers .= 'Content-type: text/html; charset=utf-8' . PHP_EOL; return $headers; } function get_email_body($subject, $heading, $fields, $resources) { $message = ''; $message .= ''; $message .= '' . encode_for_form($subject) . ''; $message .= ''; $message .= '

' . $heading . '

'; $message .= ''; $sorted_fields = array(); foreach ($fields as $field => $properties) { // Skip reCAPTCHA from email submission if ('recaptcha' == $properties['type']) continue; array_push($sorted_fields, array('field' => $field, 'properties' => $properties)); } // sort fields usort($sorted_fields, 'field_comparer'); foreach ($sorted_fields as $field_wrapper) $message .= ''; $message .= '
' . encode_for_form($field_wrapper['properties']['label']) . ':' . get_form_field_value($field_wrapper['field'], $field_wrapper['properties'], $resources) . '
'; $message .= '

'; $message .= '
' . sprintf($resources['submitted_from'], encode_for_form($_SERVER['SERVER_NAME'])) . '
'; $message .= '
' . sprintf($resources['submitted_by'], encode_for_form($_SERVER['REMOTE_ADDR'])) . '
'; $message .= ''; return cleanup_message($message); } function field_comparer($field1, $field2) { if ($field1['properties']['order'] == $field2['properties']['order']) return 0; return (($field1['properties']['order'] < $field2['properties']['order']) ? -1 : 1); } function is_assoc_array($arr) { if (!is_array($arr)) return false; $keys = array_keys($arr); foreach (array_keys($arr) as $key) if (is_string($key)) return true; return false; } function json_serialize($data) { if (is_assoc_array($data)) { $json = array(); foreach ($data as $key => $value) array_push($json, '"' . $key . '": ' . json_serialize($value)); return '{' . implode(', ', $json) . '}'; } if (is_array($data)) { $json = array(); foreach ($data as $value) array_push($json, json_serialize($value)); return '[' . implode(', ', $json) . ']'; } if (is_int($data) || is_float($data)) return $data; if (is_bool($data)) return $data ? 'true' : 'false'; return '"' . encode_for_json($data) . '"'; } function encode_for_json($value) { return preg_replace(array('/([\'"\\t\\\\])/i', '/\\r/i', '/\\n/i'), array('\\\\$1', '\\r', '\\n'), $value); } function encode_for_form($text) { return htmlentities($text, ENT_COMPAT, 'UTF-8'); } function get_form_field_value($field, $properties, $resources) { $value = $_REQUEST[$field]; switch($properties['type']) { case 'checkbox': return (($value == '1' || $value == 'true') ? $resources['checkbox_checked'] : $resources['checkbox_unchecked']); case 'string': case 'captcha': case 'recaptcha': case 'email': return encode_for_form($value); default: die(get_form_error_response(sprintf($resources['invalid_field_type'], $properties['type']))); } } function cleanup_email($email) { $email = encode_for_form($email); $email = preg_replace('=((||0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', null, $email); return $email; } function cleanup_message($message) { $message = wordwrap($message, 70, "\r\n"); return $message; } ?>