[Registra] emails para suscribirse al boletín de Nabu
This commit is contained in:
parent
f60cb11043
commit
a09962c290
|
@ -21,7 +21,7 @@ defined('NABU') || exit();
|
|||
require_once 'models/communityModel.php';
|
||||
|
||||
class communityController {
|
||||
// Elimina un comentario.
|
||||
// Elimina un comentario con el método GET.
|
||||
static public function delete_comment() {
|
||||
$view = NABU_ROUTES['home'];
|
||||
|
||||
|
@ -50,7 +50,7 @@ class communityController {
|
|||
utils::redirect(NABU_ROUTES['article'] . '&slug=' . $comment['slug']);
|
||||
}
|
||||
|
||||
// Registra o elimina el like de un artículo.
|
||||
// Registra o elimina el like de un artículo con el método GET.
|
||||
static public function likes() {
|
||||
utils::check_session(NABU_ROUTES['login']);
|
||||
|
||||
|
@ -85,6 +85,92 @@ class communityController {
|
|||
utils::redirect(NABU_ROUTES['article'] . '&slug=' . $article['slug']);
|
||||
}
|
||||
|
||||
// Cancela la suscripción de un correo con el método GET
|
||||
// y registra un e-mail al boletín de los artículos más recientes con el método POST.
|
||||
static public function suscription() {
|
||||
$view = NABU_ROUTES['all-articles'];
|
||||
|
||||
$validations = new validations($view);
|
||||
|
||||
// Cancela la suscripción.
|
||||
if (empty($_POST['suscription-form'])) {
|
||||
// Valida los parámetros de la URL.
|
||||
$data = $validations -> validate($_GET, array(
|
||||
array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true),
|
||||
array('field' => 'key', 'min_length' => 1, 'max_length' => 255)
|
||||
));
|
||||
|
||||
$email = strtolower($data['email']);
|
||||
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
messages::add('Por favor ingresa una dirección de correo electrónico válido');
|
||||
utils::redirect($view);
|
||||
}
|
||||
|
||||
$communityModel = new communityModel();
|
||||
|
||||
// Obtiene los datos de suscripción.
|
||||
$suscription = $communityModel -> get_suscription($email);
|
||||
|
||||
if (empty($suscription))
|
||||
utils::redirect($view);
|
||||
|
||||
messages::add('Tu suscripción se ha cancelado correctamente');
|
||||
|
||||
utils::redirect($view);
|
||||
}
|
||||
|
||||
csrf::validate($_POST['csrf']);
|
||||
|
||||
// Valida el email de la suscripción.
|
||||
$data = $validations -> validate($_POST, array(
|
||||
array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true),
|
||||
));
|
||||
|
||||
$email = strtolower($data['email']);
|
||||
|
||||
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
messages::add('Por favor ingresa una dirección de correo electrónico válido');
|
||||
utils::redirect($view);
|
||||
}
|
||||
|
||||
$communityModel = new communityModel();
|
||||
|
||||
// Obtiene los datos de suscripción.
|
||||
$suscription = $communityModel -> get_suscription($email);
|
||||
|
||||
if (empty($suscription)) {
|
||||
// Genera una llave aleatoria de cancelación de suscripción.
|
||||
$key = bin2hex(random_bytes(32));
|
||||
|
||||
// Genera un hash de cancelación de suscripción.
|
||||
$hash = hash_hmac('sha256', $email, $key);
|
||||
|
||||
require_once 'libs/emails.php';
|
||||
|
||||
$emails = new emails();
|
||||
$emails -> prepare($email, $email);
|
||||
|
||||
// Genera una URL de cancelación de suscripción.
|
||||
$url = NABU_ROUTES['suscription'] . '&email=' . urlencode($email) . '&key=' . $key;
|
||||
|
||||
$body = require_once 'views/emails/suscription.php';
|
||||
|
||||
// Envía primero un mensaje de suscripción antes de registrarlo.
|
||||
if (!$emails -> send('¡Gracias por suscribirte!', $body))
|
||||
messages::errors('¡Lo sentimos mucho! 😞, por el momento no podemos enviar tu mensaje de suscripción', 500);
|
||||
|
||||
// Registra la suscripción.
|
||||
$communityModel -> save_suscription($email, $hash);
|
||||
|
||||
messages::add('Gracias por suscribirte al boletín de ' . NABU_DEFAULT['website-name']);
|
||||
}
|
||||
else
|
||||
messages::add('Tu correo electrónico está suscripto al boletín de ' . NABU_DEFAULT['website-name']);
|
||||
|
||||
utils::redirect($view);
|
||||
}
|
||||
|
||||
static public function favorites() {
|
||||
//
|
||||
}
|
||||
|
|
|
@ -41,4 +41,5 @@ return array(
|
|||
'registered-users' => array('route' => 'registered-users', 'controller' => 'adminController', 'view' => 'registered_users'),
|
||||
'review-article' => array('route' => 'review-article', 'controller' => 'adminController', 'view' => 'review_article'),
|
||||
'signup' => array('route' => 'signup', 'controller' => 'usersController', 'view' => 'signup'),
|
||||
'suscription' => array('route' => 'suscription', 'controller' => 'communityController', 'view' => 'suscription'),
|
||||
);
|
||||
|
|
|
@ -97,6 +97,14 @@ CREATE TABLE IF NOT EXISTS `favorites` (
|
|||
CONSTRAINT favorites_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE CASCADE ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `suscriptions` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`email` VARCHAR(255) NOT NULL,
|
||||
`hash` VARCHAR(255) NOT NULL,
|
||||
CONSTRAINT suscriptions_pk PRIMARY KEY(id),
|
||||
CONSTRAINT suscriptions_email_uk UNIQUE(email)
|
||||
);
|
||||
|
||||
INSERT INTO roles(id, name) VALUES(1, 'ADMIN'), (2, 'MODERATOR'), (3, 'USER');
|
||||
INSERT INTO users VALUES(1, 1, 'root', 'root', 'root@example.com', '$2y$12$.1ycdL5xs4nOpQ3GXga7m.IFNtfMgV5nKVe4R87B3CypgigBaJ55C', TRUE, NOW());
|
||||
INSERT INTO profiles(id) VALUES(1);
|
||||
|
|
|
@ -109,6 +109,34 @@ class communityModel extends dbConnection {
|
|||
}
|
||||
}
|
||||
|
||||
// Obtiene los datos de suscripción de un e-mail.
|
||||
public function get_suscription(string $email) {
|
||||
$query = 'SELECT * FROM suscriptions WHERE email = ? LIMIT 1';
|
||||
|
||||
try {
|
||||
$prepare = $this -> pdo -> prepare($query);
|
||||
|
||||
$prepare -> execute(array($email));
|
||||
|
||||
return $prepare -> fetch();
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para obtener los datos de una suscripción');
|
||||
}
|
||||
}
|
||||
|
||||
// Registra una suscripción.
|
||||
public function save_suscription(string $email, string $hash) {
|
||||
$query = 'INSERT INTO suscriptions(email, hash) VALUES(?, ?)';
|
||||
|
||||
try {
|
||||
$this -> pdo -> prepare($query) -> execute(array($email, $hash));
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para registrar una suscripción');
|
||||
}
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
return 'A partir de ahora recibirás correos de parte de nuestro equipo en los que compartiremos ' .
|
||||
'contigo blogposts que te pudiesen interesar, así como tips para que tu escritura en medios ' .
|
||||
'digitales sea una de tus más grandes cualidades.</p>' .
|
||||
'<p><a href="' . $url . '">Cancelar suscripción.</a></p>';
|
|
@ -79,9 +79,10 @@
|
|||
<h2 class="CTA__title">Interesante, ¿No? 🤔</h2>
|
||||
<p class="CTA__description">Déjanos tu e-mail y te compartiremos los posts más recientes, además de recursos para mejorar tu escritura en medios digitales. 😉</p>
|
||||
<div class="CTA__mail">
|
||||
<form class="CTA__form" method="POST" action="">
|
||||
<input class = "form__input-mail" type="text" minlength="1" placeholder="Tu e-mail" maxlength="246" required>
|
||||
<input class = "form__join" type="submit" name="mail-submit" value="Unirme">
|
||||
<form class="CTA__form" method="POST" action="<?= NABU_ROUTES['suscription'] ?>">
|
||||
<input type="hidden" name="csrf" value="<?= $token ?>">
|
||||
<input class = "form__input-mail" type="email" name="email" minlength="5" placeholder="Tu e-mail" maxlength="255" required>
|
||||
<input class = "form__join" type="submit" name="suscription-form" value="Unirme">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue