Ich wollte mal ein einfaches und sicheres Kontaktformular vorstellen, dass auf Zend Framework 3 basiert.
Vielleicht hilft es ja mal einem Einsteiger weiter oder motiviert den ein oder anderen, sich mit Zend Framework vertraut zu machen
composer.json
Vielleicht hilft es ja mal einem Einsteiger weiter oder motiviert den ein oder anderen, sich mit Zend Framework vertraut zu machen
composer.json
Code:
{ "require": { "laminas/laminas-form": "^3.0", "laminas/laminas-captcha": "^2.11", "laminas/laminas-session": "^2.12", "laminas/laminas-view": "^2.12", "laminas/laminas-i18n": "^2.11", "laminas/laminas-escaper": "^2.9", "phpmailer/phpmailer": "^6.5" } }
PHP-Code:
<?php
use Laminas\Captcha;
use Laminas\Form\Element;
use Laminas\Form\Form;
use Laminas\InputFilter\InputFilter;
use Laminas\ServiceManager\Config;
use Laminas\View\Renderer\PhpRenderer;
use Laminas\Form\ConfigProvider;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
include __DIR__ . '/vendor/autoload.php';
// Standard Felder erstellen
$name = new Element\Text('name');
$name->setLabel('Name');
$email = new Element\Email('email');
$email->setLabel('E-Mail Adresse')
->getValidator()
->setOptions( ['messages' => ['regexNotMatch' => 'Ungültige E-Mail Adresse'] ]);
$subject = new Element\Text('subject');
$subject->setLabel('Betreff');
$message = new Element\Textarea('message');
$message->setLabel('Nachricht');
// CAPTCHA erstellen
$dumbCaptcha = new Captcha\Dumb();
$dumbCaptcha->setLabel('Bitte rückwarts eingeben:');
$dumbCaptcha->setOption('messages', ['badCaptcha' => 'Captcha falsch']);
$captcha = new Element\Captcha('captcha');
$captcha->setCaptcha($dumbCaptcha)->setLabel('Captcha');
// CSRF Token erstellen
$csrf = new Element\Csrf('security');
$csrf->setOptions( [ 'csrf_options' => ['messages' => ['notSame' => 'Ungültiger Sicherheitstoken!']] ] );
// Submit Button erstellen
$send = new Element('send');
$send->setValue('Submit');
$send->setAttributes([
'type' => 'submit',
'class' => 'btn btn-primary',
'value' => 'Absenden'
]);
// Form erstellen und alle Elemente hinzufügen
$form = new Form('contact');
$form->add($name)->add($email)->add($subject)->add($message)
->add($captcha)->add($csrf)->add($send);
// InputFilter erstellen
$inputFilter = new InputFilter();
$form->setInputFilter($inputFilter);
$requiredValidator[] = [
'name' => 'NotEmpty',
'options' => [
'messages' => ['isEmpty' => 'Angabe benötigt'],
]
];
foreach($form->getElements() as $element) {
if ($element->getLabel() ) {
// Pflichtfeld Validator und HTML Filter hinzufügen
$inputFilter->add([
'name' => $element->getName(),
'validators' => $requiredValidator,
'filters' => [['name' => 'StripTags']]
]);
// CSS Klassen hinzufügen
$element->setAttribute( 'class', 'form-control form-control-sm');
}
}
// View initialisieren, um Form rendern zu können
$view = new PhpRenderer();
$manager = $view->getHelperPluginManager();
$viewConfig = new ConfigProvider();
(new Config($viewConfig->getViewHelperConfig()))->configureServiceManager($manager);
// POST verarbeiten
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$form->setData($_POST);
// Form validieren
if ($form->isValid()) {
$validatedData = $form->getData();
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output
$mail->isSMTP(); //Send using SMTP
$mail->Host = 'smtp.example.com'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = 'user@example.com'; //SMTP username
$mail->Password = 'secret'; //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption
$mail->Port = 465; //TCP port to connect to
//Recipients
$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('joe@example.net', 'Joe User');
//Content
$mail->isHTML(true);
$mail->Subject = $validatedData['subject'];
$mail->Body = $validatedData['message'];
$mail->send();
$out = 'Message has been sent';
} catch (Exception $e) {
$out = "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
label {
display: block;
}
input[type=submit] {
margin-top: 20px;
}
.input-error {
border: 1px solid red;
}
</style>
</head>
<body>
<div class="col-md-2">
<legend>Kontakt</legend>
<?= $view->form()->render($form);?>
<?= $out ?? ''?>
</div>
</body>
</html>
Kommentar