. */ defined('NABU') || exit(); // Colección de herramientas propias de Nabu. class utils { // Redirecciona a una ruta y termina la ejecución de todos los scripts de PHP. static public function redirect(string $route) { header('Location: ' . $route); exit(); } // Redirecciona a una ruta si existe una sesión de usuario. static public function session_exists(string $route) { if (isset($_SESSION['user'])) self::redirect($route); } // @return un string escapado para HTML. static public function escape(string $str) { return htmlentities($str, ENT_COMPAT | ENT_HTML5, 'UTF-8'); } // @return la fecha actual. static public function current_date() { return date('Y-m-d H:i:s'); } // Redirecciona a una ruta si no existe una sesión de usuario. static public function check_session(string $route) { if (empty($_SESSION['user'])) self::redirect($route); } // Genera la URL de un artículo. public static function url_slug(string $title) { return date('Ymd') . '-' . preg_replace('/[^A-Za-z0-9-]+/', '-', strtolower($title)); } // @return la URL completa de una imagen. public static function url_image(string $category, $filename) { $url = NABU_DEFAULT[$category]; if (!empty($filename)) if (file_exists(NABU_DIRECTORY['storage-' . $category . 's'] . '/' . $filename)) $url = NABU_DIRECTORY[$category . 's'] . '/' . $filename; return $url; } // Elimina una imagen. public static function remove_image(string $category, $filename) { if (!empty($filename)) { $path = NABU_DIRECTORY['storage-' . $category . 's'] . '/' . $filename; if (file_exists($path)) unlink($path); } } // @return el nombre de una imagen y reemplaza una imagen por otra. public static function update_image(string $model, string $category, $original, array $replacement) { $extension = explode('/', $replacement['type'])[1]; if ($extension == 'svg+xml') $extension = 'svg'; require_once 'models/' . $model . '.php'; $Model = new $model(); // Valida si el nombre de la imagen es único. do $filename = bin2hex(random_bytes(32)) . '.' . $extension; while(!empty($Model -> find_image($category, $filename))); unset($Model); $destination = NABU_DIRECTORY['storage-' . $category . 's'] . '/' . $filename; // Mueve la imagen subida a la carpeta de almacenamiento. if (move_uploaded_file($replacement['tmp_name'], $destination)) { self::remove_image($category, $original); return $filename; } return false; } // @return un array asociativo con la gestión de páginas de resultados. public static function pagination(int $total, int $limit, string $route) { // Página de resultado inicial. $page = 1; // Calcula el número total de páginas de resultados. $results = ceil($total/$limit); if (isset($_GET['page']) && is_numeric($_GET['page'])) $page = $_GET['page']; if ($page < 1) self::redirect($route); if ($results < 1) $results = 1; if ($page > $results) self::redirect($route . '&page=' . $results); // Calcula el número de resultados acumulados por paginación. $pagination = array( 'page' => $page, 'accumulation' => ($page - 1) * $limit ); return $pagination; } // @return un array asociativo con el string de búsqueda. public static function validate_search(string $view, int $max) { $search = array('query' => '', 'view' => $view); $form = $_GET; // Selecciona si se realiza una búsqueda por el método POST o GET. if (isset($_POST['q'])) { csrf::validate($_POST['csrf']); $form = $_POST; } if (!empty($form['q'])) { $validations = new validations($view); // Valida el string de búsqueda. $data = $validations -> validate($form, array( array('field' => 'q', 'trim_all' => true, 'min_length' => 1, 'max_length' => $max) )); $search['query'] = $data['q']; $search['view'] = $view . '&q=' . urlencode($search['query']); } // Redirecciona a una búsqueda por el método GET si se realiza una búsqueda por el método POST. if (isset($_POST['q'])) utils::redirect($search['view']); return $search; } // @return un array asociativo con una fecha segmentada. public static function format_date(string $date) { $date = date_parse($date); switch ($date['month']) { case 1: $month = 'Enero'; break; case 2: $month = 'Febrero'; break; case 3: $month = 'Marzo'; break; case 4: $month = 'Abril'; break; case 5: $month = 'Mayo'; break; case 6: $month = 'Junio'; break; case 7: $month = 'Julio'; break; case 8: $month = 'Agosto'; break; case 9: $month = 'Septiembre'; break; case 10: $month = 'Octubre'; break; case 11: $month = 'Noviembre'; break; case 12: $month = 'Diciembre'; break; default: $month = ''; } $date['month'] = $month; return $date; } }