From c10122c6db7b34edd6cdb6feb3b964a6b71e9a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Garc=C3=ADa=20Jim=C3=A9nez?= Date: Sun, 13 Mar 2022 19:08:09 -0600 Subject: [PATCH] =?UTF-8?q?[Agrega]=20bolet=C3=ADn=20de=20nabu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bolletin.php | 101 ++++++++++++++++++++++++++++ controllers/communityController.php | 2 +- core/config.php | 10 +++ core/requests.php | 16 ++--- views/emails/bolletin.php | 28 ++++++++ views/emails/suscription.php | 2 +- 6 files changed, 145 insertions(+), 14 deletions(-) create mode 100644 bolletin.php create mode 100644 views/emails/bolletin.php diff --git a/bolletin.php b/bolletin.php new file mode 100644 index 0000000..b8426fd --- /dev/null +++ b/bolletin.php @@ -0,0 +1,101 @@ +#!/usr/bin/env php +. +*/ + +php_sapi_name() == 'cli' || exit(); + +// Imprime errores en terminal. +class messages { + static public function errors(string $message, int $code = 500) { + exit($message); + } +} + +define('NABU', true); + +$components = require 'core/routes.php'; + +require_once 'core/config.php'; +require_once 'db/connection.php'; +require_once 'libs/emails.php'; +require_once 'core/utils.php'; + +// Envía por e-mail los artículos más recientes a una lista de suscriptores. +$bolletin = new class extends dbConnection { + private $articles = 10; + + public function __construct() { + parent::__construct(); + } + + public function __invoke() { + $query = 'SELECT title, synopsis, slug FROM articles ' . + 'ORDER BY modification_date DESC LIMIT ?'; + + // Obtiene los artículos más recientes. + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(array($this -> articles)); + + $articles = $prepare -> fetchAll(); + } + catch (PDOException $e) { + messages::errors('Tuvimos un problema para obtener los artículos más recientes'); + } + + if (empty($articles)) + exit(); + + $query = 'SELECT id, email FROM suscriptions'; + + // Obtiene la lista de suscriptores. + try { + $prepare = $this -> pdo -> prepare($query); + + $prepare -> execute(); + + $subscribers = $prepare -> fetchAll(); + } + catch (PDOException $e) { + messages::errors('Tuvimos un problema para obtener la lista de suscriptores'); + } + + if (empty($subscribers)) + $subscribers = array(); + + $body = require_once 'views/emails/bolletin.php'; + + $emails = new emails(); + + // Adjunta en un solo e-mail los destinatarios. + foreach ($subscribers as $subscriber) { + $emails -> prepare($subscriber['email'], $subscriber['email']); + } + + // Envía el boletín. + $emails -> send('¡Llegaron los artículos del mes!', $body); + } + + public function __destruct() { + parent::__destruct(); + $this -> pdo = null; + } +}; + +$bolletin(); diff --git a/controllers/communityController.php b/controllers/communityController.php index 20a6aef..5020bf9 100644 --- a/controllers/communityController.php +++ b/controllers/communityController.php @@ -104,7 +104,7 @@ class communityController { // Valida el email de la suscripción. $data = $validations -> validate($form, array( - array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true), + array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true) )); $email = strtolower($data['email']); diff --git a/core/config.php b/core/config.php index 19eb657..293b262 100644 --- a/core/config.php +++ b/core/config.php @@ -46,6 +46,16 @@ define('NABU_DEFAULT', array( 'image-size' => 1048576 * 2, // 2 MB (en bytes). )); +$routes = array(); + +// Genera la URL completa de todas las rutas. +foreach ($components as $alias => $component) + $routes[$alias] = NABU_URL . '/index.php?view=' . $component['route']; + +define('NABU_ROUTES', $routes); + +unset($routes); + // Define la zona horario de todas las funciones de fecha/tiempo. date_default_timezone_set('America/Mexico_City'); diff --git a/core/requests.php b/core/requests.php index 47364bc..f233d1e 100644 --- a/core/requests.php +++ b/core/requests.php @@ -20,6 +20,8 @@ defined('NABU') || exit(); session_start(); +$components = require 'core/routes.php'; + require_once 'core/config.php'; require_once 'core/utils.php'; require_once 'core/messages.php'; @@ -27,16 +29,6 @@ require_once 'db/connection.php'; require_once 'libs/csrf.php'; require_once 'libs/validations.php'; -$components = require 'core/routes.php'; - -$routes = array(); - -// Genera la URL completa de todas las rutas. -foreach ($components as $alias => $component) - $routes[$alias] = NABU_URL . '/index.php?view=' . $component['route']; - -define('NABU_ROUTES', $routes); - // Selecciona el controlador y la vista de una ruta solicitada. if (isset($_GET['view'])) foreach ($components as $alias => $component) @@ -46,11 +38,11 @@ if (isset($_GET['view'])) break; } +unset($components); + if (empty($controller) || empty($view)) utils::redirect(NABU_ROUTES['home']); -unset($components, $routes); - require_once 'controllers/' . $controller . '.php'; // Renderiza la vista de una página web. diff --git a/views/emails/bolletin.php b/views/emails/bolletin.php new file mode 100644 index 0000000..864e493 --- /dev/null +++ b/views/emails/bolletin.php @@ -0,0 +1,28 @@ +. +*/ + +defined('NABU') || exit(); + +$body = '

Los artículos más recientes del mes

'; + +foreach ($articles as $article) { + $body = $body . '

' . utils::escape($article['title']) . '

' . + '

' . utils::escape($article['synopsis']) . '

'; +} + +return $body; diff --git a/views/emails/suscription.php b/views/emails/suscription.php index 037c424..e11e85b 100644 --- a/views/emails/suscription.php +++ b/views/emails/suscription.php @@ -18,7 +18,7 @@ defined('NABU') || exit(); -return 'A partir de ahora recibirás correos de parte de nuestro equipo en los que compartiremos ' . +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.

' . '

Cancelar suscripción.

';