[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';
|
require_once 'models/communityModel.php';
|
||||||
|
|
||||||
class communityController {
|
class communityController {
|
||||||
// Elimina un comentario.
|
// Elimina un comentario con el método GET.
|
||||||
static public function delete_comment() {
|
static public function delete_comment() {
|
||||||
$view = NABU_ROUTES['home'];
|
$view = NABU_ROUTES['home'];
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ class communityController {
|
||||||
utils::redirect(NABU_ROUTES['article'] . '&slug=' . $comment['slug']);
|
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() {
|
static public function likes() {
|
||||||
utils::check_session(NABU_ROUTES['login']);
|
utils::check_session(NABU_ROUTES['login']);
|
||||||
|
|
||||||
|
@ -85,6 +85,92 @@ class communityController {
|
||||||
utils::redirect(NABU_ROUTES['article'] . '&slug=' . $article['slug']);
|
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() {
|
static public function favorites() {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,4 +41,5 @@ return array(
|
||||||
'registered-users' => array('route' => 'registered-users', 'controller' => 'adminController', 'view' => 'registered_users'),
|
'registered-users' => array('route' => 'registered-users', 'controller' => 'adminController', 'view' => 'registered_users'),
|
||||||
'review-article' => array('route' => 'review-article', 'controller' => 'adminController', 'view' => 'review_article'),
|
'review-article' => array('route' => 'review-article', 'controller' => 'adminController', 'view' => 'review_article'),
|
||||||
'signup' => array('route' => 'signup', 'controller' => 'usersController', 'view' => 'signup'),
|
'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
|
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 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 users VALUES(1, 1, 'root', 'root', 'root@example.com', '$2y$12$.1ycdL5xs4nOpQ3GXga7m.IFNtfMgV5nKVe4R87B3CypgigBaJ55C', TRUE, NOW());
|
||||||
INSERT INTO profiles(id) VALUES(1);
|
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() {
|
public function __destruct() {
|
||||||
parent::__destruct();
|
parent::__destruct();
|
||||||
$this -> pdo = null;
|
$this -> pdo = null;
|
||||||
|
|
24
views/emails/suscription.php
Normal file
24
views/emails/suscription.php
Normal file
|
@ -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>
|
<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>
|
<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">
|
<div class="CTA__mail">
|
||||||
<form class="CTA__form" method="POST" action="">
|
<form class="CTA__form" method="POST" action="<?= NABU_ROUTES['suscription'] ?>">
|
||||||
<input class = "form__input-mail" type="text" minlength="1" placeholder="Tu e-mail" maxlength="246" required>
|
<input type="hidden" name="csrf" value="<?= $token ?>">
|
||||||
<input class = "form__join" type="submit" name="mail-submit" value="Unirme">
|
<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>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue