CL Contact Form <Ihre Modulbeschreibung> Autor: Version: Content ?><?php /** * Module cl-contact_form input * * @package module/cl_contact_form * @author Ortwin Pinke <info@php-backoffice.de> * * based on w3concepts.form.v1 from Andreas Kummer (2004-08-20) * modified and adapted to Contenido 4.8 under PHP 5.x by Murat Purc (2013-08-24) */ cInclude('frontend', 'includes/class.input.helper.php'); $uiConfigTable = new UI_Config_Table(); $htmlField = new cHTMLSelectElement("CMS_VAR[10]", 200); $htmlField->autoFill([ 'null' => mi18n("Bitte wählen"), 'mail' => mi18n("Mail (PHP)"), 'sendmail' => mi18n("Sendmail"), 'smtp' => mi18n("SMTP"), 'smtp_auth' => mi18n("SMTP mit oAuth") ]); $htmlField->setDefault("CMS_VALUE[10]"); $uiConfigTable->setRowCell(0, mi18n("Versand mit:")); $uiConfigTable->setRowCell(1, $htmlField->render()); $uiConfigTable->nextRow(); $htmlField = new cHTMLTextbox("CMS_VAR[0]", "CMS_VALUE[0]"); $htmlField->setWidth(30); $uiConfigTable->setRowCell(0, mi18n("Zieladresse (alias@mydomain.com):")); $uiConfigTable->setRowCell(1, $htmlField->render()); $uiConfigTable->nextRow(); $htmlField = new cHTMLTextbox("CMS_VAR[1]", "CMS_VALUE[1]"); $htmlField->setWidth(30); $uiConfigTable->setRowCell(0, mi18n("Betreff:")); $uiConfigTable->setRowCell(1, $htmlField->render()); $uiConfigTable->nextRow(); $htmlField = new cHTMLTextbox("CMS_VAR[2]", "CMS_VALUE[2]"); $htmlField->setWidth(30); $uiConfigTable->setRowCell(0, mi18n("Antwortadresse (alias@mydomain.com):")); $uiConfigTable->setRowCell(1, $htmlField->render()); $uiConfigTable->nextRow(); $htmlField = new cHTMLTextbox("CMS_VAR[3]", "CMS_VALUE[3]"); $htmlField->setWidth(30); $uiConfigTable->setRowCell(0, mi18n("Emailname (z.B. Vorname Name):")); $uiConfigTable->setRowCell(1, $htmlField->render()); $uiConfigTable->nextRow(); $htmlField = new cHTMLTextbox("CMS_VAR[4]", "CMS_VALUE[4]"); $htmlField->setWidth(8); $uiConfigTable->setRowCell(0, mi18n("Hintergrundfarbe bei Fehlern (z.B. red):")); $uiConfigTable->setRowCell(1, $htmlField->render()); $uiConfigTable->nextRow(); $uiConfigTable->render(true); ?><?php <?php global $sess; /** * Module cl-contact_form output * * @package module/cl_contact_form * @author Ortwin Pinke <info@php-backoffice.de> * * based on w3concepts.form.v1 from Andreas Kummer (2004-08-20) * modified and adapted to Contenido 4.8 under PHP 5.x by Murat Purc (2013-08-24) */ $sFrontEndPath = cRegistry::getClientConfig(cRegistry::getClientId())['path']['frontend'] . 'securimage' . DIRECTORY_SEPARATOR; $captchaInstalled = false; if (is_readable($sFrontEndPath)) { require_once $sFrontEndPath . 'securimage.php'; require_once $sFrontEndPath . 'CaptchaObject.php'; require_once $sFrontEndPath . 'StorageAdapter/AdapterInterface.php'; $captchaInstalled = true; } class FormGenerator { public $emailAdresses; private array $email = ['adresses' => '', 'from' => ['name' => '', 'email' => ''], 'message' => '', 'subject' => '']; private array $unraveled = []; private array $form = ['form' => '', 'answer' => '', 'colorError' => '']; public function __construct(private bool $captchaInstalled, private cSession $cSession) { } private function sendEmail(): bool { $this->unravel($this->suppress('sent')); $this->generateEmailMessage(); $phpMailer = new \PHPMailer\PHPMailer\PHPMailer(true); $phpMailer->isMail(); $phpMailer->isHTML(false); $phpMailer->CharSet = "UTF-8"; $phpMailer->AddAddress($this->email['adresses']); $phpMailer->setFrom($this->email['from']['email'], $this->email['from']['name']); $phpMailer->Subject = $this->email['subject']; $phpMailer->Body = $this->email['message']; try { if ($phpMailer->send()) { return true; } } catch (\PHPMailer\PHPMailer\Exception $e) { echo $e->errorMessage(); } return false; } private function unravel($toUnravel, $prefix = ''): void { foreach ($toUnravel as $key => $value) { if (is_array($value)) { $this->unravel($value, $key . ' '); } else { $this->unraveled["{$prefix}{$key}"] = $value; } } } private function add2Message($key, $value): void { if (strlen($key) > 25 || strlen($value) > 54) { $this->email['message'] .= "$key\n$value\n"; } else { $this->email['message'] .= $key; $this->email['message'] .= str_repeat(' ', 25 - strlen($key)); $this->email['message'] .= "$value\n"; } } private function generateEmailMessage(): void { foreach ($this->unraveled as $key => $value) { $this->add2Message($key, $value); } } private function suppress(...$suppress): array { $fields = []; foreach ($_POST as $key => $value) { if (!in_array($key, $suppress)) $fields[$key] = $value; } return $fields; } public function addEmailAdress($email): void { if (empty($this->emailAdresses)) { $this->email['adresses'] .= "$email"; } else { $this->email['adresses'] .= ", $email"; } } public function setEmailSubject($subject): void { $this->email['subject'] = $subject; } public function setEmailFrom($email, $name): void { $this->email['from']['email'] = $email; $this->email['from']['name'] = $name; } public function setForm($form): void { $this->form['form'] = $form; } public function setAnswer($answer): void { $this->form['answer'] = $answer; } public function setBackgroundError($color): void { $this->form['colorError'] = $color; } public function formInterpretation(&$form): array { $fields = explode('###', $form); $field = []; $fieldsCount = count($fields); for ($i = 1; $i < $fieldsCount; $i += 2) { $attribute = explode(';', trim($fields[$i])); foreach ($attribute as $attribute) { $nameValue = explode(':', trim($attribute)); if ($nameValue[0] != 'option' && $nameValue[0] != 'optionvalue') { $field["{$fields[$i]}"]["{$nameValue[0]}"] = $nameValue[1]; } else { $field["{$fields[$i]}"]["{$nameValue[0]}"][] = $nameValue[1]; } } } return $field; } public function formOutput($sent = false): void { $form_action = $this->cSession->url('front_content.php?idcat=' . cRegistry::getCategoryId() . '&idart=' . cRegistry::getArticleId()); echo '<form action="' . $form_action . '" method="post" class="form-horizontal">'; echo '<input type="hidden" name="sent" value="true" />'; $form = $this->form['form']; $formData = $this->formInterpretation($form); $form = explode('###', $form); foreach ($form as $item) { if (!empty($formData["{$item}"])) { $this->formField($formData["{$item}"], $sent); } else { echo $item; } } echo '</form>'; } public function formField($attribute, $sent): void { $style = ''; $value = ''; $parameter = empty($attribute['id']) ? 'id="' . $attribute['name'] . '"' : 'id="' . $attribute['id'] . '"'; $parameter .= ' name="' . $attribute['name'] . '"'; if ($sent && !$this->formFieldCorrect($attribute)) { $style = 'style="background-color: ' . $this->form['colorError'] . ';"'; } if (!empty($attribute['class'])) { $parameter .= ' class="' . $attribute['class'] . '"'; } if (!empty($attribute['placeholder'])) { $parameter .= ' placeholder="' . $attribute['placeholder'] . '"'; } switch ($attribute['type']) { case 'textarea': case 'text': if (!empty($attribute['size'])) { $parameter .= ' size="' . $attribute['size'] . '"'; } if (!empty($attribute['value'])) { $value = $attribute['value']; } if (!empty($_POST["{$attribute['name']}"])) { $value = $_POST["{$attribute['name']}"]; } break; case 'select': case 'password': if (!empty($attribute['size'])) { $parameter .= ' size="' . $attribute['size'] . '"'; } break; } if (isset($attribute['required']) || isset($attribute['mandantory'])) { $parameter .= ' required'; } switch ($attribute['type']) { case 'captcha': if ($this->captchaInstalled) { if ($sent) { $captcha = @$_POST['lets_check']; $securimage = new Securimage(); if (!$securimage->check($captcha)) { echo '<style>' . '#captcha_code {background-color: ' . $this->form['colorError'] . '}' . '</style>'; } } // show captcha HTML using Securimage::getCaptchaHtml() $options = []; $options['show_audio_button'] = false; $options['input_name'] = 'lets_check'; // change name of input element for form post input_text $options['input_text'] = mi18n("Zeichen eingeben"); $options['input_required'] = true; if (!empty($_SESSION['ctform']['captcha_error'])) { // error html to show in captcha output $options['error_html'] = $_SESSION['ctform']['captcha_error']; } echo "<div id='captcha_container_1'>\n"; echo Securimage::getCaptchaHtml($options); echo "\n</div>\n"; echo '<script src="securimage/securimage.js"></script>'; } break; case 'text': case 'email': case 'password': echo '<input type="'.$attribute['type'].'" '.$parameter.' value="'.$value.'" '.$style.' />'; break; case 'textarea': echo "<textarea name=\"{$attribute['name']}\" cols=\""; echo (empty($attribute['cols'])) ? ('20') : ($attribute['cols']); echo "\" rows=\""; echo (empty($attribute['rows'])) ? ('2') : ($attribute['rows']); echo "\" wrap=\"virtual\" $style>$value</textarea>"; break; case 'select': echo "<select $parameter $style>"; $itemsCount = is_countable($attribute['option']) ? count($attribute['option']) : 0; for ($i = 0; $i < (is_countable($attribute['option']) ? $itemsCount : 0); $i++) { if (!empty($attribute['optionvalue'][$i])) { if (!empty($_POST["{$attribute['name']}"]) && $_POST["{$attribute['name']}"] == $attribute['optionvalue'][$i]) { echo "<option value=\"{$attribute['optionvalue'][$i]}\" selected=\"selected\">{$attribute['option'][$i]}</option>\n"; } elseif (empty($_POST["{$attribute['name']}"]) && !empty($attribute['optionvalue'][$i]) && $attribute['optionvalue'][$i] == $attribute['value']) { echo "<option value=\"{$attribute['optionvalue'][$i]}\" selected=\"selected\">{$attribute['option'][$i]}</option>\n"; } else { echo "<option value=\"{$attribute['optionvalue'][$i]}\">{$attribute['option'][$i]}</option>\n"; } } elseif (!empty($_POST["{$attribute['name']}"]) && $_POST["{$attribute['name']}"] == $attribute['option'][$i]) { echo "<option selected=\"selected\">{$attribute['option'][$i]}</option>\n"; } elseif (empty($_POST["{$attribute['name']}"]) && $attribute['option'][$i] == $attribute['value']) { echo "<option selected=\"selected\">{$attribute['option'][$i]}</option>\n"; } else { echo "<option>{$attribute['option'][$i]}</option>\n"; } } echo "</select>"; break; case 'checkbox': $formId = preg_split('[\[|\]]', $attribute['name']); if ($sent) { if ($_POST["{$formId[0]}"]["{$formId[1]}"] == $attribute['value']) { echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>"; } else { echo "<label $style><input type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/></label>"; } } elseif (!empty($attribute['selected']) && $attribute['selected'] == 'true') { echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>"; } else { echo "<input type=\"checkbox\" $parameter value=\"{$attribute['value']}\"/>"; } break; case 'radio': if (!empty($_POST["{$attribute['name']}"])) { if ($_POST["{$attribute['name']}"] == $attribute['value']) { echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>"; } else { echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" />"; } } elseif (!empty($attribute['selected']) && $attribute['selected'] == 'true') { echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\" checked=\"checked\"/>"; } else { echo "<input type=\"radio\" $parameter value=\"{$attribute['value']}\"/>"; } break; } } private function formComplete(): bool { $form = $this->form['form']; $fields = $this->formInterpretation($form); foreach ($fields as $field) { switch ($field['type']) { case 'captcha': if ($this->captchaInstalled) { $captcha = @$_POST['lets_check']; $capId = @$_POST['captcha_id']; $securimage = new Securimage(); if (!$securimage->check($captcha, $capId, true)) { echo '<div style="color: red;">' . mi18n("Ihr Captcha Code war nicht korrekt. Bitte versuchen Sie es erneut.") . '</div>'; return false; } } break; default: if (!$this->formFieldCorrect($field)) { return false; } } } return true; } private function success(): void { if ($this->sendEmail()) { $answer = trim($this->form['answer']); if (mb_strlen($answer) > 0) { echo $this->form['answer']; } else { echo '<span style="color:green;">' . mi18n("Form has been successfully send.") . '</span>'; } } else { echo '<span style="color:red;">' . mi18n("Es ist ein Fehler aufgetreten!<br>Bitte versuchen Sie es später noch einmal.") . '</span>'; } } private function formFieldCorrect(&$field): bool { $tmp_name = rtrim($field['name'], '[0]'); preg_match('/\[(\d*)\]/', $field['name'], $matches); $bEmptyPost = false; $sPostFieldValue = $_POST[$tmp_name]; if (is_array($_POST[$tmp_name])) { $sPostFieldValue = $_POST[$tmp_name][$matches[1]]; if (empty($_POST[$tmp_name][$matches[1]])) { $bEmptyPost = true; } } elseif (empty($_POST[$tmp_name])) { $bEmptyPost = true; } if (!empty($field['mandatory']) && $field['mandatory'] == 'true' && $bEmptyPost) { return false; } // wenn das formularfeld kein pflichtfeld und nicht vorhanden ist, true zurückgeben if ($bEmptyPost) { return true; } // regular expression prüfungen if (!empty($field['valid'])) { switch ($field['valid']) { case 'textmitumbruch': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[\n\r,;:\. ÄÖÜäöüß\-\+\*§$%&\/()=?!\"'\w\d]*$/"]])) { return false; } break; case 'simpletext': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[\w]*$/i"]])) { return false; } break; case 'text': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[,;:\. ÄÖÜäöüß\-\+\*§$%&\/()=?!\"'\w\d]*$/"]])) { return false; } break; case 'phone': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^(\(?([\d \-\)\–\+\/\(]+){6,}\)?([ .\-–\/]?)([\d]+))$/"]])) { return false; } break; case 'integer': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^\d*$/"]])) { return false; } break; case 'float': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[+-]?([0-9]*[.])?[0-9]+$/"]])) { return false; } break; case 'date': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[0-9]{1,2}.[0-9]{1,2}.[0-9]{2,4}$/"]])) { return false; } break; case 'email': if (!filter_var($sPostFieldValue, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[öäüéàèâêîç_a-z0-9-]+(\.[öäüéàèâêîç_a-z0-9-]+)*@[öäüéàèâêîça-z0-9-]+(\.[öäüéàèâêîça-z0-9-]+)*$/"]])) { return false; } break; } } // grössenbereich bei integer und float prüfen if (!empty($field['minvalue']) && $sPostFieldValue < $field['minvalue']) return false; if (!empty($field['maxvalue']) && $sPostFieldValue > $field['maxvalue']) return false; // längenbereich bei allen typen prüfen if (!empty($field['minlength']) && strlen($sPostFieldValue) < $field['minlength']) return false; return !(!empty($field['maxlength']) && strlen($sPostFieldValue) > $field['maxlength']); } public function process(): void { if (!isset($_POST['sent'])) { $this->formOutput(); } elseif ($this->formComplete()) { $this->success(); } else { $this->formOutput(true); } } } if (cRegistry::isBackendEditMode()) { echo "<hr>"; echo "<h3>" . mi18n("Formularkonfiguration") . "</h3>"; echo "<h4>" . mi18n("Hier ist das Formular sowie der Text einzugeben, der zusammen mit dem Formular ausgegeben werden soll:") . "</h4>"; echo "CMS_HTML[100]"; echo "<h4>" . mi18n("Hier ist die Ausgabe einzugeben, die erscheint, wenn das Formular erfolgreich verschickt wurde:") . "</h4>"; echo "CMS_HTML[101]"; echo "<hr>"; } else { $form = new FormGenerator($captchaInstalled, $sess); $form->addEmailAdress("CMS_VALUE[0]"); $form->setEmailSubject("CMS_VALUE[1]"); $form->setEmailFrom("CMS_VALUE[2]", "CMS_VALUE[3]"); $form->setBackgroundError("CMS_VALUE[4]"); $form->setForm("CMS_HTML[100]"); $form->setAnswer("CMS_HTML[101]"); $form->process(); } ?>