First commit
This commit is contained in:
commit
fc3784f861
8
composer.json
Normal file
8
composer.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"require": {
|
||||||
|
"phpmailer/phpmailer": "^6.4",
|
||||||
|
"sendgrid/sendgrid": "^7.9",
|
||||||
|
"fzaninotto/faker": "^1.9",
|
||||||
|
"twig/twig": "^3.0"
|
||||||
|
}
|
||||||
|
}
|
90
contacto.php
Normal file
90
contacto.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
require_once('contactoModel.php');
|
||||||
|
?>
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport"
|
||||||
|
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
|
<title>Contacto</title>
|
||||||
|
<style>
|
||||||
|
.contacto__error {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contacto__enviado {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<h1>Formulario de contacto</h1>
|
||||||
|
<section class="contacto">
|
||||||
|
<form method="post" novalidate>
|
||||||
|
<p>
|
||||||
|
<label>
|
||||||
|
Nombre
|
||||||
|
<input type="text" name="nombre" value="<?= $nombre ?>">
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
<?php if (isPost() && !validarObligatorio($nombre)): ?>
|
||||||
|
<p class="contacto__error">
|
||||||
|
Campo obligatorio
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<p>
|
||||||
|
<label>
|
||||||
|
E-mail
|
||||||
|
<input type="email" name="email" value="<?= $email ?>">
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
<?php if (isPost() && !validarObligatorio($email)): ?>
|
||||||
|
<p class="contacto__error">
|
||||||
|
Campo obligatorio
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (isPost() && !validarFormatoEmail($email)): ?>
|
||||||
|
<p class="contacto__error">
|
||||||
|
Formato no valido
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<p>
|
||||||
|
<label>
|
||||||
|
Mensaje
|
||||||
|
<textarea name="mensaje"><?= $mensaje ?></textarea>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
<?php if (isPost() && !validarObligatorio($mensaje)): ?>
|
||||||
|
<p class="contacto__error">
|
||||||
|
Campo obligatorio
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if (isPost() && !validarLetrasMaximas($mensaje, 20)): ?>
|
||||||
|
<p class="contacto__error">
|
||||||
|
Debe tener mas de 20 caracteres
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<p>
|
||||||
|
<input type="checkbox" name="acepto"<?= $acepto ? ' checked': '' ?>> Acepto que rastres y vendas mis datos
|
||||||
|
</p>
|
||||||
|
<?php if (isPost() && !$acepto): ?>
|
||||||
|
<p class="contacto__error">
|
||||||
|
Debes aceptar nuestras condiciones
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($validado): ?>
|
||||||
|
<p class="contacto__enviado">
|
||||||
|
Enviado con exito
|
||||||
|
</p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<p>
|
||||||
|
<button type="submit">Enviar</button>
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
120
contactoModel.php
Normal file
120
contactoModel.php
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// LIBRERIAS
|
||||||
|
//======================================================================
|
||||||
|
require_once('vendor/autoload.php');
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// VARIABLES
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// Campos
|
||||||
|
$nombre = isset($_REQUEST['nombre']) ? $_REQUEST['nombre'] : '';
|
||||||
|
$email = isset($_REQUEST['email']) ? $_REQUEST['email'] : '';
|
||||||
|
$acepto = isset($_REQUEST['acepto']);
|
||||||
|
$mensaje = isset($_REQUEST['mensaje']) ? $_REQUEST['mensaje'] : '';
|
||||||
|
$validado = isPost() &&
|
||||||
|
validarObligatorio($nombre) &&
|
||||||
|
validarObligatorio($email) &&
|
||||||
|
validarFormatoEmail($email) &&
|
||||||
|
validarObligatorio($mensaje) &&
|
||||||
|
validarLetrasMaximas($mensaje, 20) &&
|
||||||
|
$acepto;
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// FUNCIONES
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comprueba si estamos recibiendo el verbo POST
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function isPost(): bool
|
||||||
|
{
|
||||||
|
return isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] === 'POST' : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Genera un string aleatorio
|
||||||
|
* @param int $length
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function generateRandomString(int $length = 20): string
|
||||||
|
{
|
||||||
|
return substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valida que exista el valor
|
||||||
|
* @param string $campo
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function validarObligatorio(string $campo): bool
|
||||||
|
{
|
||||||
|
return $campo !== '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valida que tenga un formato de email
|
||||||
|
* @param string $campo
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function validarFormatoEmail(string $campo): bool
|
||||||
|
{
|
||||||
|
// Extension one letter> boo@foo.a
|
||||||
|
if (filter_var($campo, FILTER_VALIDATE_EMAIL)) {
|
||||||
|
$emailSeparadoExtension = explode('.', $campo);
|
||||||
|
if (count($emailSeparadoExtension) === 2
|
||||||
|
&& strlen($emailSeparadoExtension[1]) < 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Otros
|
||||||
|
return filter_var($campo, FILTER_VALIDATE_EMAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valida que $texto no supere $limite
|
||||||
|
* @param string $texto
|
||||||
|
* @param int $limite
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function validarLetrasMaximas(string $texto, int $limite): bool
|
||||||
|
{
|
||||||
|
return strlen(trim($texto)) <= $limite;
|
||||||
|
}
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// INICIO
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// Envia el correo si al informacion es correcta
|
||||||
|
if ($validado) {
|
||||||
|
|
||||||
|
// Generamos las plantillas
|
||||||
|
$loader = new \Twig\Loader\FilesystemLoader('templates');
|
||||||
|
$twig = new \Twig\Environment($loader);
|
||||||
|
$variablesEmail = [
|
||||||
|
'nombre' => $nombre,
|
||||||
|
'email' => $email,
|
||||||
|
'mensaje' => $mensaje
|
||||||
|
];
|
||||||
|
$plantillaPlana = $twig->render('contacto.txt', $variablesEmail);
|
||||||
|
$plantillaHTML = $twig->render('contacto.html', $variablesEmail);
|
||||||
|
|
||||||
|
// Enviamos email
|
||||||
|
$emailSendGrid = new \SendGrid\Mail\Mail();
|
||||||
|
$emailSendGrid->setFrom("andros@fenollosa.email", "Web");
|
||||||
|
$emailSendGrid->setSubject("Contacto desde mi web");
|
||||||
|
$emailSendGrid->addTo("andros@fenollosa.email", "Yo");
|
||||||
|
$emailSendGrid->addContent("text/plain", $plantillaPlana);
|
||||||
|
$emailSendGrid->addContent( "text/html", $plantillaHTML);
|
||||||
|
$sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
|
||||||
|
try {
|
||||||
|
$response = $sendgrid->send($emailSendGrid);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo 'Caught exception: ' . $e->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
49
contactoTest.php
Normal file
49
contactoTest.php
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
require_once('vendor/autoload.php');
|
||||||
|
require_once('contactoModel.php');
|
||||||
|
|
||||||
|
class ContactoTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testObligatorio(): void
|
||||||
|
{
|
||||||
|
$this->assertSame(true, validarObligatorio('texto'), "Validador obligatorio no reconoce 'texto'");
|
||||||
|
$this->assertSame(false, validarObligatorio(''), "Validador obligatorio no reconoce ''");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testFormatoEmail(): void
|
||||||
|
{
|
||||||
|
// Buenos
|
||||||
|
$miFaker = Faker\Factory::create();
|
||||||
|
foreach (range(0, 50) as $pos) {
|
||||||
|
$tempEmail = $miFaker->email;
|
||||||
|
$this->assertSame(true, validarFormatoEmail($tempEmail), "Validador email $tempEmail valido");
|
||||||
|
}
|
||||||
|
// Malos
|
||||||
|
$this->assertSame(false, validarFormatoEmail('@correo'), "Validador falso email");
|
||||||
|
$this->assertSame(false, validarFormatoEmail('@correo.com'), "Validador falso email");
|
||||||
|
$this->assertSame(false, validarFormatoEmail('mi@correo'), "Validador falso email");
|
||||||
|
$this->assertSame(false, validarFormatoEmail('micorreo'), "Validador falso email");
|
||||||
|
$this->assertSame(false, validarFormatoEmail('micorreo@ff.e'), "Validador falso email");
|
||||||
|
$this->assertSame(false, validarFormatoEmail('micorreo@f-f.e'), "Validador falso email");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function testLetrasMaximas(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
// Funciona - Limite 20 con caracteres de 0 a 20
|
||||||
|
foreach (range(0, 20) as $pos) {
|
||||||
|
$tempText = generateRandomString($pos);
|
||||||
|
$this->assertSame(true, validarLetrasMaximas($tempText, 20), "Validador limite $pos maximo '$tempText'");
|
||||||
|
}
|
||||||
|
|
||||||
|
// No funciona - Limite 20 con caracteres de 21 a 40
|
||||||
|
foreach (range(21, 40) as $pos) {
|
||||||
|
$tempText = generateRandomString($pos);
|
||||||
|
$this->assertSame(false, validarLetrasMaximas($tempText, 20), "Validador limite $pos maximo '$tempText'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
20
index.php
Normal file
20
index.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
require 'vendor/autoload.php';
|
||||||
|
|
||||||
|
$email = new \SendGrid\Mail\Mail();
|
||||||
|
$email->setFrom("andros@fenollosa.email", "Example User");
|
||||||
|
$email->setSubject("Sending with SendGrid is Fun");
|
||||||
|
$email->addTo("andros@fenollosa.email", "Example User");
|
||||||
|
$email->addContent("text/plain", "and easy to do anywhere, even with PHP");
|
||||||
|
$email->addContent(
|
||||||
|
"text/html", "<strong>and easy to do anywhere, even with PHP</strong>"
|
||||||
|
);
|
||||||
|
$sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
|
||||||
|
try {
|
||||||
|
$response = $sendgrid->send($email);
|
||||||
|
print $response->statusCode() . "\n";
|
||||||
|
print_r($response->headers());
|
||||||
|
print $response->body() . "\n";
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo 'Caught exception: ' . $e->getMessage() . "\n";
|
||||||
|
}
|
16
templates/contacto.html
Normal file
16
templates/contacto.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Contacto</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Nuevo mensaje</h1>
|
||||||
|
<p><strong>Nombre</strong>: {{ nombre }}</p>
|
||||||
|
<p><strong>Email</strong>: {{ email }}</p>
|
||||||
|
<p><strong>Mensaje</strong>: {{ mensaje }}</p>
|
||||||
|
<hr>
|
||||||
|
<p><a href="mailto:{{ email }}">Escribirle</a></p>
|
||||||
|
<p>Gracias</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
1
templates/contacto.txt
Normal file
1
templates/contacto.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Mensaje de {{ nombre }} con el email {{ email }} y el mensaje es: {{ mensaje }}
|
Loading…
Reference in New Issue
Block a user