Update html export.

This commit is contained in:
KJ 2024-05-31 16:26:27 -04:00
parent 407fb26d62
commit b002afe5d4
1 changed files with 280 additions and 280 deletions

View File

@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head> <head>
<!-- 2024-05-14 mar 02:58 --> <!-- 2024-05-31 vie 16:24 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Duckbrain - Manual de inicio</title> <title>Duckbrain - Manual de inicio</title>
@ -219,57 +219,57 @@ $(function() { $('.note').before("<p class='admonition-title note'>Note</p>")
<h2>Table of Contents</h2> <h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc"> <div id="text-table-of-contents" role="doc-toc">
<ul> <ul>
<li><a href="#org9a7d226">1. Introducción</a> <li><a href="#orgb616059">1. Introducción</a>
<ul> <ul>
<li><a href="#org5a4ba0a">1.1. Estructura de archivos de Duckbrain</a> <li><a href="#org183eeb2">1.1. Estructura de archivos de Duckbrain</a>
<ul> <ul>
<li><a href="#org4ea86b4">1.1.1. Carpeta src</a></li> <li><a href="#org1127b4e">1.1.1. Carpeta src</a></li>
<li><a href="#orgb1fa808">1.1.2. Carpetas: Controllers, Libs, Models, Middlewares, Views y Routers</a></li> <li><a href="#org9e57cac">1.1.2. Carpetas: Controllers, Libs, Models, Middlewares, Views y Routers</a></li>
<li><a href="#orgc87d01b">1.1.3. Los archivos en la raíz</a></li> <li><a href="#orgdddedef">1.1.3. Los archivos en la raíz</a></li>
<li><a href="#orga7d97ce">1.1.4. Los archivos en la carpeta Libs</a></li> <li><a href="#org9749ac7">1.1.4. Los archivos en la carpeta Libs</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgfec9624">1.2. Comprendiendo el arranque del sistema</a></li> <li><a href="#org6cd7e08">1.2. Comprendiendo el arranque del sistema</a></li>
<li><a href="#org2c6b3ec">1.3. Extra: Namespaces</a></li> <li><a href="#org2f8fef7">1.3. Extra: Namespaces</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org2ac527f">2. Primeros pasos</a> <li><a href="#orgba38cbf">2. Primeros pasos</a>
<ul> <ul>
<li><a href="#org40c4a21">2.1. Usando un Webserver para el desarrollo</a></li> <li><a href="#orged59cba">2.1. Usando un Webserver para el desarrollo</a></li>
<li><a href="#org405d525">2.2. Hola mundo</a> <li><a href="#orgf0430f5">2.2. Hola mundo</a>
<ul> <ul>
<li><a href="#org96ab6d3">2.2.1. Explicación del código del hola mundo</a></li> <li><a href="#orga6e37a0">2.2.1. Explicación del código del hola mundo</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
</li> </li>
<li><a href="#org9c2dbee">3. Mi primera aplicación</a> <li><a href="#orgae63c96">3. Mi primera aplicación</a>
<ul> <ul>
<li><a href="#org98d72c4">3.1. Definición del proyecto</a></li> <li><a href="#orgff897d3">3.1. Definición del proyecto</a></li>
<li><a href="#orga494037">3.2. Base de datos</a> <li><a href="#org6c86b2c">3.2. Base de datos</a>
<ul> <ul>
<li><a href="#org7401d20">3.2.1. Configuración de Duckbrain para la base de datos</a></li> <li><a href="#org4d11364">3.2.1. Configuración de Duckbrain para la base de datos</a></li>
</ul> </ul>
</li> </li>
<li><a href="#orgf4acd86">3.3. Modelos</a></li> <li><a href="#org9c2f8fe">3.3. Modelos</a></li>
<li><a href="#org3f20aab">3.4. Creando vistas</a></li> <li><a href="#org83adc27">3.4. Creando vistas</a></li>
<li><a href="#org95443fb">3.5. Mostrando el formulario</a> <li><a href="#org896289f">3.5. Mostrando el formulario</a>
<ul> <ul>
<li><a href="#org83a2991">3.5.1. Extra: Explicación del tipo callable</a></li> <li><a href="#org884ff52">3.5.1. Extra: Explicación del tipo callable</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org7f6f95f">3.6. Creando la nota encriptada</a></li> <li><a href="#orga360861">3.6. Creando la nota encriptada</a></li>
<li><a href="#org9ec9013">3.7. Recta final: Desencriptando y mostrando las notas</a></li> <li><a href="#orgbe74891">3.7. Recta final: Desencriptando y mostrando las notas</a></li>
<li><a href="#orgb6ce768">3.8. Repositorio</a></li> <li><a href="#orga9e5de1">3.8. Repositorio</a></li>
</ul> </ul>
</li> </li>
<li><a href="#org6070584">4. Contacto</a></li> <li><a href="#org77dff78">4. Contacto</a></li>
</ul> </ul>
</div> </div>
</div> </div>
<div id="outline-container-org9a7d226" class="outline-2"> <div id="outline-container-orgb616059" class="outline-2">
<h2 id="org9a7d226"><span class="section-number-2">1.</span> Introducción</h2> <h2 id="orgb616059"><span class="section-number-2">1.</span> Introducción</h2>
<div class="outline-text-2" id="text-1"> <div class="outline-text-2" id="text-1">
<p> <p>
<a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> es un conjunto de librerías creadas especialmente pensando en hacer algo simple, que cualquiera pueda deshacer y rearmar fácilmente. Gracias a esa versatilidad, puedes usarlo cualquier proyecto, peo por ello debes tener en cuenta que mientras más grande sea el proyecto, mayor será el nivel de ingeniería que se requerirá de tu parte para acondicionar esta herramienta a los requerimientos. <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> es un conjunto de librerías creadas especialmente pensando en hacer algo simple, que cualquiera pueda deshacer y rearmar fácilmente. Gracias a esa versatilidad, puedes usarlo cualquier proyecto, peo por ello debes tener en cuenta que mientras más grande sea el proyecto, mayor será el nivel de ingeniería que se requerirá de tu parte para acondicionar esta herramienta a los requerimientos.
@ -284,8 +284,8 @@ Ducho eso, vamos a comenzar&#x2026;
</p> </p>
</div> </div>
<div id="outline-container-org5a4ba0a" class="outline-3"> <div id="outline-container-org183eeb2" class="outline-3">
<h3 id="org5a4ba0a"><span class="section-number-3">1.1.</span> Estructura de archivos de Duckbrain</h3> <h3 id="org183eeb2"><span class="section-number-3">1.1.</span> Estructura de archivos de Duckbrain</h3>
<div class="outline-text-3" id="text-1-1"> <div class="outline-text-3" id="text-1-1">
<p> <p>
Al entrar a la carpeta de Duckbrain encontraras esta estructura de archivos (ignoramos el readme.org porque no es necesario). Al entrar a la carpeta de Duckbrain encontraras esta estructura de archivos (ignoramos el readme.org porque no es necesario).
@ -318,8 +318,8 @@ Primero veamos las carpetas y luego los archivos:
</p> </p>
</div> </div>
<div id="outline-container-org4ea86b4" class="outline-4"> <div id="outline-container-org1127b4e" class="outline-4">
<h4 id="org4ea86b4"><span class="section-number-4">1.1.1.</span> Carpeta src</h4> <h4 id="org1127b4e"><span class="section-number-4">1.1.1.</span> Carpeta src</h4>
<div class="outline-text-4" id="text-1-1-1"> <div class="outline-text-4" id="text-1-1-1">
<p> <p>
En esta carpeta se encuentra todo el código PHP. En esta carpeta se encuentra todo el código PHP.
@ -331,8 +331,8 @@ Como todo en <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a>, esta ruta
</div> </div>
</div> </div>
<div id="outline-container-orgb1fa808" class="outline-4"> <div id="outline-container-org9e57cac" class="outline-4">
<h4 id="orgb1fa808"><span class="section-number-4">1.1.2.</span> Carpetas: Controllers, Libs, Models, Middlewares, Views y Routers</h4> <h4 id="org9e57cac"><span class="section-number-4">1.1.2.</span> Carpetas: Controllers, Libs, Models, Middlewares, Views y Routers</h4>
<div class="outline-text-4" id="text-1-1-2"> <div class="outline-text-4" id="text-1-1-2">
<p> <p>
Si sabes de estructuras de diseño, el nombre de estas carpetas ya te debe quedar claro qué va en cada una de ellas, puesto que en el nombre de la carpeta dice lo que va a ir dentro. Si sabes de estructuras de diseño, el nombre de estas carpetas ya te debe quedar claro qué va en cada una de ellas, puesto que en el nombre de la carpeta dice lo que va a ir dentro.
@ -343,7 +343,7 @@ Si no sabes que es un Model, un Middleware, Controller, etc. entonces requieres
</p> </p>
<p> <p>
Al igual que con la carpeta <code>src</code>, todo lo puedes cambiar y colocar otra estructura de carpetas y las únicas que requerirían algún tipo de edición de archivos serían las carpetas <code>Views</code> y <code>Router</code> que se editarían en el archivo <code>src/Libs/View.php</code> y el archivo <code>index.php</code> respectivamente. Las demás carpetas las puedes borrar cuando quieras y usar otra estructura, pero por lo pronto no lo hagas al menos hasta que hayas pasado la sección <a href="#org9c2dbee">3</a> que es cuando ya habrías leído y, con algo de suerte y pericia, asimilado los conocimientos necesarios para hacer lo que te de la gana con este ser de librería al punto de que ya le podrás colocar las tuyas propias, le borrarás alguna de las que viene por defecto porque no la necesites o incluso crees una versión extendida de las que viene por defecto para poder añadirle alguna mejora que necesites. Al igual que con la carpeta <code>src</code>, todo lo puedes cambiar y colocar otra estructura de carpetas y las únicas que requerirían algún tipo de edición de archivos serían las carpetas <code>Views</code> y <code>Router</code> que se editarían en el archivo <code>src/Libs/View.php</code> y el archivo <code>index.php</code> respectivamente. Las demás carpetas las puedes borrar cuando quieras y usar otra estructura, pero por lo pronto no lo hagas al menos hasta que hayas pasado la sección <a href="#orgae63c96">3</a> que es cuando ya habrías leído y, con algo de suerte y pericia, asimilado los conocimientos necesarios para hacer lo que te de la gana con este ser de librería al punto de que ya le podrás colocar las tuyas propias, le borrarás alguna de las que viene por defecto porque no la necesites o incluso crees una versión extendida de las que viene por defecto para poder añadirle alguna mejora que necesites.
</p> </p>
<p> <p>
@ -356,8 +356,8 @@ Para el resto de mortales y gente con menos arrogancia, pueden seguir un ratito
</div> </div>
</div> </div>
<div id="outline-container-orgc87d01b" class="outline-4"> <div id="outline-container-orgdddedef" class="outline-4">
<h4 id="orgc87d01b"><span class="section-number-4">1.1.3.</span> Los archivos en la raíz</h4> <h4 id="orgdddedef"><span class="section-number-4">1.1.3.</span> Los archivos en la raíz</h4>
<div class="outline-text-4" id="text-1-1-3"> <div class="outline-text-4" id="text-1-1-3">
<p> <p>
El <code>.htaccess</code> es un archivo que te será útil si usas apache o algún otro servidor web que use estos archivos y lo que lleva es una configuración especial para que funcionen las <b>rutas virtuales</b>, o sea, para que podamos crear una ruta tipo <code>mitsitio.com/mi-ruta-virtual/</code> y podamos decir que allí muestre un mensaje de <code>Hola mundo</code>, a pesar de que la carpeta <code>mi-ruta-virtual</code> no exista, ni haya dentro ningún archivo index que tenga el texto <code>Hola mundo</code>. Si esta aún no lo entendiste, no exasperes que ya lo vas a entender en un momento y ahí podrás volver a repasar esta parte. El <code>.htaccess</code> es un archivo que te será útil si usas apache o algún otro servidor web que use estos archivos y lo que lleva es una configuración especial para que funcionen las <b>rutas virtuales</b>, o sea, para que podamos crear una ruta tipo <code>mitsitio.com/mi-ruta-virtual/</code> y podamos decir que allí muestre un mensaje de <code>Hola mundo</code>, a pesar de que la carpeta <code>mi-ruta-virtual</code> no exista, ni haya dentro ningún archivo index que tenga el texto <code>Hola mundo</code>. Si esta aún no lo entendiste, no exasperes que ya lo vas a entender en un momento y ahí podrás volver a repasar esta parte.
@ -368,8 +368,8 @@ En caso de que uses nginx, debes configurar el webserver con la regla equivalent
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-nginx"><span style="color: #a020f0;">location</span> <span style="color: #0000ff;">/</span> { <pre class="src src-nginx"><span style="color: #ad45ba; font-weight: bold;">location</span> <span style="color: #5165e4;">/</span> {
<span style="color: #a020f0;">try_files</span> <span style="color: #a0522d;">$uri</span> <span style="color: #a0522d;">$uri</span>/ ./index.php<span style="color: #a0522d;">$args</span>; <span style="color: #ad45ba; font-weight: bold;">try_files</span> <span style="color: #3f6faf;">$uri</span> <span style="color: #3f6faf;">$uri</span>/ ./index.php<span style="color: #3f6faf;">$args</span>;
} }
</pre> </pre>
</div> </div>
@ -384,8 +384,8 @@ El archivo <code>config.php</code>, como su nombre indica, es el archivo para co
</div> </div>
</div> </div>
<div id="outline-container-orga7d97ce" class="outline-4"> <div id="outline-container-org9749ac7" class="outline-4">
<h4 id="orga7d97ce"><span class="section-number-4">1.1.4.</span> Los archivos en la carpeta Libs</h4> <h4 id="org9749ac7"><span class="section-number-4">1.1.4.</span> Los archivos en la carpeta Libs</h4>
<div class="outline-text-4" id="text-1-1-4"> <div class="outline-text-4" id="text-1-1-4">
<p> <p>
Son básicamente librerías, cada una tiene como nombre lo que hace, no tiene mucho misterio y al igual que antes con las carpetas, si sabes algo de diseño, con leer el nombre de las mismas te debería bastar para saber lo que hacen. Si no lo entiendes, sigue leyendo el manual que hablaremos de casi todas poco a poco. Son básicamente librerías, cada una tiene como nombre lo que hace, no tiene mucho misterio y al igual que antes con las carpetas, si sabes algo de diseño, con leer el nombre de las mismas te debería bastar para saber lo que hacen. Si no lo entiendes, sigue leyendo el manual que hablaremos de casi todas poco a poco.
@ -394,8 +394,8 @@ Son básicamente librerías, cada una tiene como nombre lo que hace, no tiene mu
</div> </div>
</div> </div>
<div id="outline-container-orgfec9624" class="outline-3"> <div id="outline-container-org6cd7e08" class="outline-3">
<h3 id="orgfec9624"><span class="section-number-3">1.2.</span> Comprendiendo el arranque del sistema</h3> <h3 id="org6cd7e08"><span class="section-number-3">1.2.</span> Comprendiendo el arranque del sistema</h3>
<div class="outline-text-3" id="text-1-2"> <div class="outline-text-3" id="text-1-2">
<p> <p>
Como la intención de este manual es que comprendas <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> y no solo seas un robot que copia y pega de la documentación, vamos a calentar comprendiendo el código que lo arranca. Como la intención de este manual es que comprendas <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> y no solo seas un robot que copia y pega de la documentación, vamos a calentar comprendiendo el código que lo arranca.
@ -410,7 +410,7 @@ Supongamos que entramos en la ruta <code>/hola</code> (o sea, <code>misitio.com/
</p> </p>
<p> <p>
Primero intenta comprobar si el fichero "hola" existe en la ruta a la que se desea acceder, si no es el caso prueba si existe una carpeta "hola" y si tampoco sucede eso, reenvía todo a <code>index.php</code> y le pide que él se encargue de ahí en adelante. Si llega hasta la tercera opción decimos que es una <b>ruta virtual</b> (lo que mencionamos en <a href="#orgc87d01b">Los archivos en la raiz</a>), porque devolveremos algo desde el PHP simulando un archivo o una carpeta, a pesar de que esa ruta realmente no existe ni como fichero ni como carpeta. Primero intenta comprobar si el fichero "hola" existe en la ruta a la que se desea acceder, si no es el caso prueba si existe una carpeta "hola" y si tampoco sucede eso, reenvía todo a <code>index.php</code> y le pide que él se encargue de ahí en adelante. Si llega hasta la tercera opción decimos que es una <b>ruta virtual</b> (lo que mencionamos en <a href="#orgdddedef">Los archivos en la raiz</a>), porque devolveremos algo desde el PHP simulando un archivo o una carpeta, a pesar de que esa ruta realmente no existe ni como fichero ni como carpeta.
</p> </p>
<p> <p>
@ -418,7 +418,7 @@ Ahora veamos que hace <code>index.php</code>, en la primera línea nos dice esto
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">require_once</span>(<span style="color: #8b2252;">'config.php'</span>); <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">require_once</span>(<span style="color: #007f6f;">'config.php'</span>);
</pre> </pre>
</div> </div>
@ -427,8 +427,8 @@ Aquí carga el archivo <code>config.php</code>, o sea, carga la configuración.
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php">define(<span style="color: #8b2252;">'ROOT_DIR'</span>, <span style="color: #483d8b;">__DIR__</span>); <pre class="src src-php">define(<span style="color: #007f6f;">'ROOT_DIR'</span>, <span style="color: #705ae3; font-weight: bold;">__DIR__</span>);
define(<span style="color: #8b2252;">'ROOT_CORE'</span>, <span style="color: #008b8b;">ROOT_DIR</span>.<span style="color: #8b2252;">'/src'</span>); define(<span style="color: #007f6f;">'ROOT_CORE'</span>, <span style="color: #c035aa;">ROOT_DIR</span>.<span style="color: #007f6f;">'/src'</span>);
</pre> </pre>
</div> </div>
@ -437,14 +437,14 @@ Se está definiendo una constante <code>ROOT_DIR</code> que contiene como valor
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php">spl_autoload_register(<span style="color: #a020f0;">function</span> ($<span style="color: #a0522d;">className</span>) { <pre class="src src-php">spl_autoload_register(<span style="color: #ad45ba; font-weight: bold;">function</span> ($<span style="color: #3f6faf;">className</span>) {
$<span style="color: #a0522d;">fp</span> = str_replace(<span style="color: #8b2252;">'</span><span style="color: #8b2252; font-weight: bold;">\</span><span style="color: #8b2252; font-weight: bold;">\</span><span style="color: #8b2252;">'</span>,<span style="color: #8b2252;">'/'</span>,$<span style="color: #a0522d;">className</span>); $<span style="color: #3f6faf;">fp</span> = str_replace(<span style="color: #007f6f;">'</span><span style="color: #5165e4;">\</span><span style="color: #c3303a;">\</span><span style="color: #007f6f;">'</span>,<span style="color: #007f6f;">'/'</span>,$<span style="color: #3f6faf;">className</span>);
$<span style="color: #a0522d;">name</span> = basename($<span style="color: #a0522d;">fp</span>); $<span style="color: #3f6faf;">name</span> = basename($<span style="color: #3f6faf;">fp</span>);
$<span style="color: #a0522d;">dir</span> = dirname($<span style="color: #a0522d;">fp</span>); $<span style="color: #3f6faf;">dir</span> = dirname($<span style="color: #3f6faf;">fp</span>);
$<span style="color: #a0522d;">file</span> = <span style="color: #008b8b;">ROOT_CORE</span>.<span style="color: #8b2252;">'/'</span>.$<span style="color: #a0522d;">dir</span>.<span style="color: #8b2252;">'/'</span>.$<span style="color: #a0522d;">name</span>.<span style="color: #8b2252;">'.php'</span>; $<span style="color: #3f6faf;">file</span> = <span style="color: #c035aa;">ROOT_CORE</span>.<span style="color: #007f6f;">'/'</span>.$<span style="color: #3f6faf;">dir</span>.<span style="color: #007f6f;">'/'</span>.$<span style="color: #3f6faf;">name</span>.<span style="color: #007f6f;">'.php'</span>;
<span style="color: #a020f0;">if</span> (file_exists($<span style="color: #a0522d;">file</span>)) { <span style="color: #ad45ba; font-weight: bold;">if</span> (file_exists($<span style="color: #3f6faf;">file</span>)) {
<span style="color: #a020f0;">require_once</span> $<span style="color: #a0522d;">file</span>; <span style="color: #ad45ba; font-weight: bold;">require_once</span> $<span style="color: #3f6faf;">file</span>;
<span style="color: #a020f0;">return</span>; <span style="color: #ad45ba; font-weight: bold;">return</span>;
} }
}); });
</pre> </pre>
@ -463,13 +463,13 @@ Si aún no lo entendiste, no pierdas tiempo releyendo el párrafo anterior, en s
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php">$<span style="color: #a0522d;">routers</span> = glob(<span style="color: #008b8b;">ROOT_CORE</span>.<span style="color: #8b2252;">'/Routers/*.php'</span>); <pre class="src src-php">$<span style="color: #3f6faf;">routers</span> = glob(<span style="color: #c035aa;">ROOT_CORE</span>.<span style="color: #007f6f;">'/Routers/*.php'</span>);
<span style="color: #a020f0;">foreach</span>($<span style="color: #a0522d;">routers</span> <span style="color: #a020f0;">as</span> $<span style="color: #a0522d;">file</span>){ <span style="color: #ad45ba; font-weight: bold;">foreach</span>($<span style="color: #3f6faf;">routers</span> <span style="color: #ad45ba; font-weight: bold;">as</span> $<span style="color: #3f6faf;">file</span>){
<span style="color: #a020f0;">require_once</span>($<span style="color: #a0522d;">file</span>); <span style="color: #ad45ba; font-weight: bold;">require_once</span>($<span style="color: #3f6faf;">file</span>);
} }
<span style="color: #008b8b;">\Libs\Router</span>::apply(); <span style="color: #c035aa;">\Libs\Router</span>::apply();
</pre> </pre>
</div> </div>
@ -487,8 +487,8 @@ Nótese que lo que ha hecho el autoloader es convertir los backslashes o barras
</div> </div>
</div> </div>
<div id="outline-container-org2c6b3ec" class="outline-3"> <div id="outline-container-org2f8fef7" class="outline-3">
<h3 id="org2c6b3ec"><span class="section-number-3">1.3.</span> Extra: Namespaces</h3> <h3 id="org2f8fef7"><span class="section-number-3">1.3.</span> Extra: Namespaces</h3>
<div class="outline-text-3" id="text-1-3"> <div class="outline-text-3" id="text-1-3">
<p> <p>
Si eres nuevo en esto puede que no sepas lo que es un namespace, pero si también te dio curiosidad el que la una clase tenga <code>\</code> (backslash) en su nombre, entonces tienes futuro en este campo y como no quiero que te vayas de este manual, voy a explicarte rápidamente de donde viene ese backslash. Si eres nuevo en esto puede que no sepas lo que es un namespace, pero si también te dio curiosidad el que la una clase tenga <code>\</code> (backslash) en su nombre, entonces tienes futuro en este campo y como no quiero que te vayas de este manual, voy a explicarte rápidamente de donde viene ese backslash.
@ -499,7 +499,7 @@ Si abres el archivo <code>src/Libs/Router.php</code> verás que en su primera l
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">namespace</span> <span style="color: #228b22;">Libs</span>; <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">namespace</span> <span style="color: #0f7a9d;">Libs</span>;
</pre> </pre>
</div> </div>
@ -518,16 +518,16 @@ Puede que ahora mismo no notes la utilidad de esto, pero es algo muy útil realm
</div> </div>
</div> </div>
<div id="outline-container-org2ac527f" class="outline-2"> <div id="outline-container-orgba38cbf" class="outline-2">
<h2 id="org2ac527f"><span class="section-number-2">2.</span> Primeros pasos</h2> <h2 id="orgba38cbf"><span class="section-number-2">2.</span> Primeros pasos</h2>
<div class="outline-text-2" id="text-2"> <div class="outline-text-2" id="text-2">
<p> <p>
Antes de ponernos a programar vamos a asegurarnos de estar en la misma pagina preparando nuestro entorno de trabajo y haciendo el usual Hola mundo. Antes de ponernos a programar vamos a asegurarnos de estar en la misma pagina preparando nuestro entorno de trabajo y haciendo el usual Hola mundo.
</p> </p>
</div> </div>
<div id="outline-container-org40c4a21" class="outline-3"> <div id="outline-container-orged59cba" class="outline-3">
<h3 id="org40c4a21"><span class="section-number-3">2.1.</span> Usando un Webserver para el desarrollo</h3> <h3 id="orged59cba"><span class="section-number-3">2.1.</span> Usando un Webserver para el desarrollo</h3>
<div class="outline-text-3" id="text-2-1"> <div class="outline-text-3" id="text-2-1">
<p> <p>
Desde luego esta la carpeta con <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> supongo que ya la tienes con un webserver nginx o apache en localhost. Si no es el caso, al menos deberás instalarte PHP primero y una ves instalado, abres una terminal en la carpeta donde tienes Duckbrain y ejecutas: Desde luego esta la carpeta con <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> supongo que ya la tienes con un webserver nginx o apache en localhost. Si no es el caso, al menos deberás instalarte PHP primero y una ves instalado, abres una terminal en la carpeta donde tienes Duckbrain y ejecutas:
@ -552,8 +552,8 @@ He conocido gente que usa directamente un hosting y edita los archivos allí. Es
</div> </div>
</div> </div>
<div id="outline-container-org405d525" class="outline-3"> <div id="outline-container-orgf0430f5" class="outline-3">
<h3 id="org405d525"><span class="section-number-3">2.2.</span> Hola mundo</h3> <h3 id="orgf0430f5"><span class="section-number-3">2.2.</span> Hola mundo</h3>
<div class="outline-text-3" id="text-2-2"> <div class="outline-text-3" id="text-2-2">
<p> <p>
Agarren su teclado y su editor de código que vamos a comenzar a hacer la magia. Como es usual, el primer paso para hacer nuetra aplicación, será imprimir un <code>hello world</code>. Agarren su teclado y su editor de código que vamos a comenzar a hacer la magia. Como es usual, el primer paso para hacer nuetra aplicación, será imprimir un <code>hello world</code>.
@ -564,12 +564,12 @@ Para ello vamos a la carpeta <code>src/Routers</code> y crearemos un archivo con
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Request</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Request</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Router</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Router</span>;
<span style="color: #008b8b;">Router</span>::get(<span style="color: #8b2252;">'/'</span>, <span style="color: #a020f0;">function</span>(<span style="color: #228b22;">Request</span> $<span style="color: #a0522d;">requets</span>) { <span style="color: #c035aa;">Router</span>::get(<span style="color: #007f6f;">'/'</span>, <span style="color: #ad45ba; font-weight: bold;">function</span>(<span style="color: #0f7a9d;">Request</span> $<span style="color: #3f6faf;">requets</span>) {
<span style="color: #a020f0;">echo</span> <span style="color: #8b2252;">"Hola mundo"</span>; <span style="color: #ad45ba; font-weight: bold;">echo</span> <span style="color: #007f6f;">"Hola mundo"</span>;
}); });
</pre> </pre>
</div> </div>
@ -580,16 +580,16 @@ Ahora, siguiendo con el código, abrimos la URL donde estamos corriendo el sitio
</p> </p>
</div> </div>
<div id="outline-container-org96ab6d3" class="outline-4"> <div id="outline-container-orga6e37a0" class="outline-4">
<h4 id="org96ab6d3"><span class="section-number-4">2.2.1.</span> Explicación del código del hola mundo</h4> <h4 id="orga6e37a0"><span class="section-number-4">2.2.1.</span> Explicación del código del hola mundo</h4>
<div class="outline-text-4" id="text-2-2-1"> <div class="outline-text-4" id="text-2-2-1">
<p> <p>
Si entendiste el código con solo leerlo, perfecto, pero si no lo hiciste, vamos a explicarlo. Primero vamos a explicar esta parte: Si entendiste el código con solo leerlo, perfecto, pero si no lo hiciste, vamos a explicarlo. Primero vamos a explicar esta parte:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #008b8b;">Router</span>::get(<span style="color: #8b2252;">'/'</span>, <span style="color: #a020f0;">function</span>(<span style="color: #228b22;">Request</span> $<span style="color: #a0522d;">requets</span>) { <pre class="src src-php"><span style="color: #c035aa;">Router</span>::get(<span style="color: #007f6f;">'/'</span>, <span style="color: #ad45ba; font-weight: bold;">function</span>(<span style="color: #0f7a9d;">Request</span> $<span style="color: #3f6faf;">requets</span>) {
<span style="color: #a020f0;">echo</span> <span style="color: #8b2252;">"Hola mundo"</span>; <span style="color: #ad45ba; font-weight: bold;">echo</span> <span style="color: #007f6f;">"Hola mundo"</span>;
}); });
</pre> </pre>
</div> </div>
@ -611,7 +611,7 @@ Lo que estámos haciendo aquí, es llamar al método <code>get</code> de la clas
</p> </p>
<p> <p>
Al igual que en <a href="#org2c6b3ec">Extra: Namespaces</a> la explicación de las primeras 2 líneas de este código, realmente no es algo de <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a>, sino del lenguaje mismo, pero de todos modos lo explicaré. Al igual que en <a href="#org2f8fef7">Extra: Namespaces</a> la explicación de las primeras 2 líneas de este código, realmente no es algo de <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a>, sino del lenguaje mismo, pero de todos modos lo explicaré.
</p> </p>
<p> <p>
@ -619,9 +619,9 @@ Primero que nada, si no quisieramos o no tuviéramos la posibilidad de usar <cod
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #008b8b;">Libs\Router</span>::get(<span style="color: #8b2252;">'/'</span>, <span style="color: #a020f0;">function</span>(<span style="color: #228b22;">Libs\Request</span> $<span style="color: #a0522d;">requets</span>) { <span style="color: #c035aa;">Libs\Router</span>::get(<span style="color: #007f6f;">'/'</span>, <span style="color: #ad45ba; font-weight: bold;">function</span>(<span style="color: #0f7a9d;">Libs\Request</span> $<span style="color: #3f6faf;">requets</span>) {
<span style="color: #a020f0;">echo</span> <span style="color: #8b2252;">"Hola mundo"</span>; <span style="color: #ad45ba; font-weight: bold;">echo</span> <span style="color: #007f6f;">"Hola mundo"</span>;
}); });
</pre> </pre>
</div> </div>
@ -635,7 +635,7 @@ Si un <code>namespace</code> es como dar un apellido, <code>use</code> es como d
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Router</span> <span style="color: #a020f0;">as</span> <span style="color: #228b22;">Rutercito</span>; <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Router</span> <span style="color: #ad45ba; font-weight: bold;">as</span> <span style="color: #0f7a9d;">Rutercito</span>;
</pre> </pre>
</div> </div>
@ -651,16 +651,16 @@ Prueba ponerle apodos ambas clases y usar sus distintos nombres en el código. E
</div> </div>
</div> </div>
<div id="outline-container-org9c2dbee" class="outline-2"> <div id="outline-container-orgae63c96" class="outline-2">
<h2 id="org9c2dbee"><span class="section-number-2">3.</span> Mi primera aplicación</h2> <h2 id="orgae63c96"><span class="section-number-2">3.</span> Mi primera aplicación</h2>
<div class="outline-text-2" id="text-3"> <div class="outline-text-2" id="text-3">
<p> <p>
Ya hicimos un hola mundo, ahora vamos a hacer algo completo de verdad. Una buena práctica a la hora de crear proyectos es comenzar a definir lo que vamos a hacer, por lo tanto: Ya hicimos un hola mundo, ahora vamos a hacer algo completo de verdad. Una buena práctica a la hora de crear proyectos es comenzar a definir lo que vamos a hacer, por lo tanto:
</p> </p>
</div> </div>
<div id="outline-container-org98d72c4" class="outline-3"> <div id="outline-container-orgff897d3" class="outline-3">
<h3 id="org98d72c4"><span class="section-number-3">3.1.</span> Definición del proyecto</h3> <h3 id="orgff897d3"><span class="section-number-3">3.1.</span> Definición del proyecto</h3>
<div class="outline-text-3" id="text-3-1"> <div class="outline-text-3" id="text-3-1">
<p> <p>
Vamos a hacer un sistema que nos permita compartir textos de manera secreta. Una persona cualquiera podrá entrar a nuestra web, escribir un texto o nota secreta y se le entregará un enlace con el que puede compartir esa nota secreta. Vamos a hacer un sistema que nos permita compartir textos de manera secreta. Una persona cualquiera podrá entrar a nuestra web, escribir un texto o nota secreta y se le entregará un enlace con el que puede compartir esa nota secreta.
@ -680,8 +680,8 @@ El nombre de la aplicación será <b>Ignota</b>. No soy bueno con los nombres y
</div> </div>
</div> </div>
<div id="outline-container-orga494037" class="outline-3"> <div id="outline-container-org6c86b2c" class="outline-3">
<h3 id="orga494037"><span class="section-number-3">3.2.</span> Base de datos</h3> <h3 id="org6c86b2c"><span class="section-number-3">3.2.</span> Base de datos</h3>
<div class="outline-text-3" id="text-3-2"> <div class="outline-text-3" id="text-3-2">
<p> <p>
Este sistema no es algo complicado en lo que al diseño de la base de datos se refiere, por lo que sólo vendría a tener una tabla: Este sistema no es algo complicado en lo que al diseño de la base de datos se refiere, por lo que sólo vendría a tener una tabla:
@ -704,11 +704,11 @@ El código para crear las tablas en SQLite sería este:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-sqlite"><span style="color: #a020f0;">CREATE</span> <span style="color: #a020f0;">TABLE</span> <span style="color: #0000ff;">notes</span> ( <pre class="src src-sqlite"><span style="color: #ad45ba; font-weight: bold;">CREATE</span> <span style="color: #ad45ba; font-weight: bold;">TABLE</span> <span style="color: #5165e4;">notes</span> (
id <span style="color: #228b22;">INTEGER</span> <span style="color: #a020f0;">PRIMARY</span> <span style="color: #a020f0;">KEY</span>, id <span style="color: #0f7a9d;">INTEGER</span> <span style="color: #ad45ba; font-weight: bold;">PRIMARY</span> <span style="color: #ad45ba; font-weight: bold;">KEY</span>,
content TEXT, content TEXT,
expire_at <span style="color: #228b22;">INTEGER</span>, expire_at <span style="color: #0f7a9d;">INTEGER</span>,
max_views <span style="color: #228b22;">INTEGER</span> max_views <span style="color: #0f7a9d;">INTEGER</span>
); );
</pre> </pre>
</div> </div>
@ -718,11 +718,11 @@ El código para crear las tablas en SQLite sería este:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-sql"><span style="color: #a020f0;">CREATE</span> <span style="color: #a020f0;">TABLE</span> <span style="color: #0000ff;">notes</span> ( <pre class="src src-sql"><span style="color: #ad45ba; font-weight: bold;">CREATE</span> <span style="color: #ad45ba; font-weight: bold;">TABLE</span> <span style="color: #5165e4;">notes</span> (
id BIGINT <span style="color: #a020f0;">PRIMARY</span> <span style="color: #a020f0;">KEY</span> AUTO_INCREMENT, id BIGINT <span style="color: #ad45ba; font-weight: bold;">PRIMARY</span> <span style="color: #ad45ba; font-weight: bold;">KEY</span> AUTO_INCREMENT,
content TEXT, content TEXT,
expire_at <span style="color: #228b22;">INT</span> <span style="color: #a020f0;">default</span> <span style="color: #a020f0;">null</span>, expire_at <span style="color: #0f7a9d;">INT</span> <span style="color: #ad45ba; font-weight: bold;">default</span> <span style="color: #ad45ba; font-weight: bold;">null</span>,
max_views <span style="color: #228b22;">INT</span> <span style="color: #a020f0;">default</span> 0 max_views <span style="color: #0f7a9d;">INT</span> <span style="color: #ad45ba; font-weight: bold;">default</span> 0
); );
</pre> </pre>
</div> </div>
@ -732,25 +732,25 @@ Voy a obviar la parte de cómo crear las bases de datos ya que ambas cosas se pu
</p> </p>
</div> </div>
<div id="outline-container-org7401d20" class="outline-4"> <div id="outline-container-org4d11364" class="outline-4">
<h4 id="org7401d20"><span class="section-number-4">3.2.1.</span> Configuración de Duckbrain para la base de datos</h4> <h4 id="org4d11364"><span class="section-number-4">3.2.1.</span> Configuración de Duckbrain para la base de datos</h4>
<div class="outline-text-4" id="text-3-2-1"> <div class="outline-text-4" id="text-3-2-1">
<p> <p>
Desde luego, <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> va necesitar tener la información de la base de datos, por lo que abriremos el archivo y veremos algo como esto: Desde luego, <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a> va necesitar tener la información de la base de datos, por lo que abriremos el archivo y veremos algo como esto:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
define(<span style="color: #8b2252;">'DB_TYPE'</span>, <span style="color: #8b2252;">'mysql'</span>); define(<span style="color: #007f6f;">'DB_TYPE'</span>, <span style="color: #007f6f;">'mysql'</span>);
define(<span style="color: #8b2252;">'DB_HOST'</span>, <span style="color: #8b2252;">'localhost'</span>); define(<span style="color: #007f6f;">'DB_HOST'</span>, <span style="color: #007f6f;">'localhost'</span>);
define(<span style="color: #8b2252;">'DB_NAME'</span>, <span style="color: #8b2252;">''</span>); define(<span style="color: #007f6f;">'DB_NAME'</span>, <span style="color: #007f6f;">''</span>);
define(<span style="color: #8b2252;">'DB_USER'</span>, <span style="color: #8b2252;">''</span>); define(<span style="color: #007f6f;">'DB_USER'</span>, <span style="color: #007f6f;">''</span>);
define(<span style="color: #8b2252;">'DB_PASS'</span>, <span style="color: #8b2252;">''</span>); define(<span style="color: #007f6f;">'DB_PASS'</span>, <span style="color: #007f6f;">''</span>);
<span style="color: #b22222;">//</span><span style="color: #b22222;">define('SITE_URL', '');</span> <span style="color: #a05b5f; font-style: italic;">//</span><span style="color: #a05b5f; font-style: italic;">define('SITE_URL', '');</span>
define(<span style="color: #8b2252;">'ROOT_DIR'</span>, <span style="color: #483d8b;">__DIR__</span>); define(<span style="color: #007f6f;">'ROOT_DIR'</span>, <span style="color: #705ae3; font-weight: bold;">__DIR__</span>);
<span style="color: #483d8b;">?&gt;</span> <span style="color: #c01f5f;">?&gt;</span>
</pre> </pre>
</div> </div>
@ -763,17 +763,17 @@ El código terminaría así:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
define(<span style="color: #8b2252;">'DB_TYPE'</span>, <span style="color: #8b2252;">'sqlite'</span>); define(<span style="color: #007f6f;">'DB_TYPE'</span>, <span style="color: #007f6f;">'sqlite'</span>);
define(<span style="color: #8b2252;">'DB_HOST'</span>, <span style="color: #8b2252;">'localhost'</span>); define(<span style="color: #007f6f;">'DB_HOST'</span>, <span style="color: #007f6f;">'localhost'</span>);
define(<span style="color: #8b2252;">'DB_NAME'</span>, <span style="color: #8b2252;">'mi-bd.sqlite'</span>); define(<span style="color: #007f6f;">'DB_NAME'</span>, <span style="color: #007f6f;">'mi-bd.sqlite'</span>);
define(<span style="color: #8b2252;">'DB_USER'</span>, <span style="color: #8b2252;">''</span>); define(<span style="color: #007f6f;">'DB_USER'</span>, <span style="color: #007f6f;">''</span>);
define(<span style="color: #8b2252;">'DB_PASS'</span>, <span style="color: #8b2252;">''</span>); define(<span style="color: #007f6f;">'DB_PASS'</span>, <span style="color: #007f6f;">''</span>);
define(<span style="color: #8b2252;">'SITE_URL'</span>, <span style="color: #8b2252;">'http://localhost/'</span>); define(<span style="color: #007f6f;">'SITE_URL'</span>, <span style="color: #007f6f;">'http://localhost/'</span>);
define(<span style="color: #8b2252;">'ROOT_DIR'</span>, <span style="color: #483d8b;">__DIR__</span>); define(<span style="color: #007f6f;">'ROOT_DIR'</span>, <span style="color: #705ae3; font-weight: bold;">__DIR__</span>);
<span style="color: #483d8b;">?&gt;</span> <span style="color: #c01f5f;">?&gt;</span>
</pre> </pre>
</div> </div>
@ -784,8 +784,8 @@ Como nuestra base de dato es solo un archivo sqlite, no requerimos de <code>DB_H
</div> </div>
</div> </div>
<div id="outline-container-orgf4acd86" class="outline-3"> <div id="outline-container-org9c2f8fe" class="outline-3">
<h3 id="orgf4acd86"><span class="section-number-3">3.3.</span> Modelos</h3> <h3 id="org9c2f8fe"><span class="section-number-3">3.3.</span> Modelos</h3>
<div class="outline-text-3" id="text-3-3"> <div class="outline-text-3" id="text-3-3">
<p> <p>
Debo hacer incapié en que nada está escrito en piedra y podemos hacer las cosas de muchas manera con <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a>, pero en este caso, siguiendo la estructura MVC, vamos a crear modelos, vistas y controladores. Debo hacer incapié en que nada está escrito en piedra y podemos hacer las cosas de muchas manera con <a href="https://git.kj2.me/kj/duckbrain">Duckbrain</a>, pero en este caso, siguiendo la estructura MVC, vamos a crear modelos, vistas y controladores.
@ -796,15 +796,15 @@ Comenzando con los modelos, que en realidad para este proyecto sería en singula
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">namespace</span> <span style="color: #228b22;">Models</span>; <span style="color: #ad45ba; font-weight: bold;">namespace</span> <span style="color: #0f7a9d;">Models</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Model</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Model</span>;
<span style="color: #a020f0;">class</span> <span style="color: #228b22;">Note</span> <span style="color: #a020f0;">extends</span> <span style="color: #228b22;">Model</span> { <span style="color: #ad45ba; font-weight: bold;">class</span> <span style="color: #0f7a9d;">Note</span> <span style="color: #ad45ba; font-weight: bold;">extends</span> <span style="color: #0f7a9d;">Model</span> {
<span style="color: #a020f0;">public</span> <span style="color: #228b22;">string</span> $<span style="color: #a0522d;">content</span>; <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #0f7a9d;">string</span> $<span style="color: #3f6faf;">content</span>;
<span style="color: #a020f0;">public</span> <span style="color: #228b22;">?int</span> $<span style="color: #a0522d;">expire_at</span>; <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #0f7a9d;">?int</span> $<span style="color: #3f6faf;">expire_at</span>;
<span style="color: #a020f0;">public</span> <span style="color: #228b22;">int</span> $<span style="color: #a0522d;">max_views</span> = 0; <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #0f7a9d;">int</span> $<span style="color: #3f6faf;">max_views</span> = 0;
} }
</pre> </pre>
</div> </div>
@ -822,27 +822,27 @@ Nada de lo mencionado en el anterior párrafo lo necesitaremos, pero de todos mo
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">namespace</span> <span style="color: #228b22;">Models</span>; <span style="color: #ad45ba; font-weight: bold;">namespace</span> <span style="color: #0f7a9d;">Models</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Model</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Model</span>;
<span style="color: #a020f0;">class</span> <span style="color: #228b22;">Note</span> <span style="color: #a020f0;">extends</span> <span style="color: #228b22;">Model</span> { <span style="color: #ad45ba; font-weight: bold;">class</span> <span style="color: #0f7a9d;">Note</span> <span style="color: #ad45ba; font-weight: bold;">extends</span> <span style="color: #0f7a9d;">Model</span> {
<span style="color: #a020f0;">public</span> <span style="color: #228b22;">string</span> $<span style="color: #a0522d;">content</span>; <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #0f7a9d;">string</span> $<span style="color: #3f6faf;">content</span>;
<span style="color: #a020f0;">public</span> <span style="color: #228b22;">?int</span> $<span style="color: #a0522d;">expire_at</span>; <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #0f7a9d;">?int</span> $<span style="color: #3f6faf;">expire_at</span>;
<span style="color: #a020f0;">public</span> <span style="color: #228b22;">int</span> $<span style="color: #a0522d;">max_views</span> = 0; <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #0f7a9d;">int</span> $<span style="color: #3f6faf;">max_views</span> = 0;
<span style="color: #a020f0;">public</span> <span style="color: #228b22;">string</span> $<span style="color: #a0522d;">tmp_cache</span>; <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #0f7a9d;">string</span> $<span style="color: #3f6faf;">tmp_cache</span>;
<span style="color: #a020f0;">private</span> <span style="color: #228b22;">string</span> $<span style="color: #a0522d;">password</span>; <span style="color: #ad45ba; font-weight: bold;">private</span> <span style="color: #0f7a9d;">string</span> $<span style="color: #3f6faf;">password</span>;
<span style="color: #a020f0;">protected</span> <span style="color: #228b22;">string</span> $<span style="color: #a0522d;">salt</span>; <span style="color: #ad45ba; font-weight: bold;">protected</span> <span style="color: #0f7a9d;">string</span> $<span style="color: #3f6faf;">salt</span>;
<span style="color: #b22222;">// </span><span style="color: #b22222;">Cambiamos el nombre de la tabla a la que se relacionar&#225; nuestro modelo.</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Cambiamos el nombre de la tabla a la que se relacionar&#225; nuestro modelo.</span>
<span style="color: #a020f0;">static</span> <span style="color: #a020f0;">protected</span> <span style="color: #228b22;">string</span> $<span style="color: #a0522d;">table</span> = <span style="color: #8b2252;">'se_llama_como_YO_quiero_AAAhh'</span>; <span style="color: #ad45ba; font-weight: bold;">static</span> <span style="color: #ad45ba; font-weight: bold;">protected</span> <span style="color: #0f7a9d;">string</span> $<span style="color: #3f6faf;">table</span> = <span style="color: #007f6f;">'se_llama_como_YO_quiero_AAAhh'</span>;
<span style="color: #b22222;">// </span><span style="color: #b22222;">Forzamos a que se guarden las propiedades salt y password a pesar de que no son p&#250;blicas.</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Forzamos a que se guarden las propiedades salt y password a pesar de que no son p&#250;blicas.</span>
<span style="color: #a020f0;">static</span> <span style="color: #a020f0;">protected</span> <span style="color: #228b22;">array</span> $<span style="color: #a0522d;">forceSave</span> = [<span style="color: #8b2252;">'password'</span>, <span style="color: #8b2252;">'salt'</span>]; <span style="color: #ad45ba; font-weight: bold;">static</span> <span style="color: #ad45ba; font-weight: bold;">protected</span> <span style="color: #0f7a9d;">array</span> $<span style="color: #3f6faf;">forceSave</span> = [<span style="color: #007f6f;">'password'</span>, <span style="color: #007f6f;">'salt'</span>];
<span style="color: #b22222;">// </span><span style="color: #b22222;">Frozamos a no guuardar la propiedad p&#250;blica tmp_cache</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Frozamos a no guuardar la propiedad p&#250;blica tmp_cache</span>
<span style="color: #a020f0;">static</span> <span style="color: #a020f0;">protected</span> <span style="color: #228b22;">array</span> $<span style="color: #a0522d;">ignoreSave</span> = [<span style="color: #8b2252;">'tmp_cache'</span>]; <span style="color: #ad45ba; font-weight: bold;">static</span> <span style="color: #ad45ba; font-weight: bold;">protected</span> <span style="color: #0f7a9d;">array</span> $<span style="color: #3f6faf;">ignoreSave</span> = [<span style="color: #007f6f;">'tmp_cache'</span>];
} }
</pre> </pre>
</div> </div>
@ -853,8 +853,8 @@ Nada de lo mencionado en el anterior párrafo lo necesitaremos, pero de todos mo
</div> </div>
</div> </div>
<div id="outline-container-org3f20aab" class="outline-3"> <div id="outline-container-org83adc27" class="outline-3">
<h3 id="org3f20aab"><span class="section-number-3">3.4.</span> Creando vistas</h3> <h3 id="org83adc27"><span class="section-number-3">3.4.</span> Creando vistas</h3>
<div class="outline-text-3" id="text-3-4"> <div class="outline-text-3" id="text-3-4">
<p> <p>
En este caso solo necesitaremos una sola vista, por ello no crearemos archivos aparte para el código CSS, sino que irá todo en un solo archivo. En este caso solo necesitaremos una sola vista, por ello no crearemos archivos aparte para el código CSS, sino que irá todo en un solo archivo.
@ -865,13 +865,13 @@ Vamos a crear un archivo llamado <code>CreateNote.php</code> en <code>src/Views/
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-html">&lt;<span style="color: #a020f0;">!DOCTYPE</span> html&gt; <pre class="src src-html">&lt;<span style="color: #ad45ba; font-weight: bold;">!DOCTYPE</span> html&gt;
&lt;<span style="color: #0000ff;">html</span>&gt; &lt;<span style="color: #5165e4;">html</span>&gt;
&lt;<span style="color: #0000ff;">head</span>&gt; &lt;<span style="color: #5165e4;">head</span>&gt;
&lt;<span style="color: #0000ff;">meta</span> <span style="color: #a0522d;">charset</span>=<span style="color: #8b2252;">"UTF-8"</span>/&gt; &lt;<span style="color: #5165e4;">meta</span> <span style="color: #3f6faf;">charset</span>=<span style="color: #007f6f;">"UTF-8"</span>/&gt;
&lt;<span style="color: #0000ff;">meta</span> <span style="color: #a0522d;">name</span>=<span style="color: #8b2252;">"viewport"</span> <span style="color: #a0522d;">content</span>=<span style="color: #8b2252;">"width=device-width, initial-scale=1.0"</span>&gt; &lt;<span style="color: #5165e4;">meta</span> <span style="color: #3f6faf;">name</span>=<span style="color: #007f6f;">"viewport"</span> <span style="color: #3f6faf;">content</span>=<span style="color: #007f6f;">"width=device-width, initial-scale=1.0"</span>&gt;
&lt;<span style="color: #0000ff;">title</span>&gt;<span style="font-weight: bold; text-decoration: underline;">Ignota - Notas encriptadas punto a punto</span>&lt;/<span style="color: #0000ff;">title</span>&gt; &lt;<span style="color: #5165e4;">title</span>&gt;<span style="font-weight: bold; text-decoration: underline;">Ignota - Notas encriptadas punto a punto</span>&lt;/<span style="color: #5165e4;">title</span>&gt;
&lt;<span style="color: #0000ff;">style</span>&gt; &lt;<span style="color: #5165e4;">style</span>&gt;
form { form {
display: grid; display: grid;
place-content: center; place-content: center;
@ -906,22 +906,22 @@ Vamos a crear un archivo llamado <code>CreateNote.php</code> en <code>src/Views/
font-weight: bold; font-weight: bold;
display: ; display: ;
} }
&lt;/<span style="color: #0000ff;">style</span>&gt; &lt;/<span style="color: #5165e4;">style</span>&gt;
&lt;/<span style="color: #0000ff;">head</span>&gt; &lt;/<span style="color: #5165e4;">head</span>&gt;
&lt;<span style="color: #0000ff;">body</span>&gt; &lt;<span style="color: #5165e4;">body</span>&gt;
&lt;<span style="color: #0000ff;">form</span> <span style="color: #a0522d;">method</span>=<span style="color: #8b2252;">"POST"</span>&gt; &lt;<span style="color: #5165e4;">form</span> <span style="color: #3f6faf;">method</span>=<span style="color: #007f6f;">"POST"</span>&gt;
&lt;<span style="color: #0000ff;">textarea</span> <span style="color: #a0522d;">name</span>=<span style="color: #8b2252;">"note"</span> <span style="color: #a0522d;">placeholder</span>=<span style="color: #8b2252;">"Escribe tu texto a encriptar"</span>&gt;&lt;/<span style="color: #0000ff;">textarea</span>&gt; &lt;<span style="color: #5165e4;">textarea</span> <span style="color: #3f6faf;">name</span>=<span style="color: #007f6f;">"note"</span> <span style="color: #3f6faf;">placeholder</span>=<span style="color: #007f6f;">"Escribe tu texto a encriptar"</span>&gt;&lt;/<span style="color: #5165e4;">textarea</span>&gt;
&lt;<span style="color: #0000ff;">fieldset</span> <span style="color: #a0522d;">class</span>=<span style="color: #8b2252;">"config"</span>&gt; &lt;<span style="color: #5165e4;">fieldset</span> <span style="color: #3f6faf;">class</span>=<span style="color: #007f6f;">"config"</span>&gt;
&lt;<span style="color: #0000ff;">legend</span>&gt;Configuraci&#243;n de expiraci&#243;n&lt;/<span style="color: #0000ff;">legend</span>&gt; &lt;<span style="color: #5165e4;">legend</span>&gt;Configuraci&#243;n de expiraci&#243;n&lt;/<span style="color: #5165e4;">legend</span>&gt;
&lt;<span style="color: #0000ff;">label</span> <span style="color: #a0522d;">for</span>=<span style="color: #8b2252;">"max_views"</span>&gt;Visualizaciones m&#225;ximas (0 = infinitas):&lt;/<span style="color: #0000ff;">label</span>&gt; &lt;<span style="color: #5165e4;">label</span> <span style="color: #3f6faf;">for</span>=<span style="color: #007f6f;">"max_views"</span>&gt;Visualizaciones m&#225;ximas (0 = infinitas):&lt;/<span style="color: #5165e4;">label</span>&gt;
&lt;<span style="color: #0000ff;">input</span> <span style="color: #a0522d;">name</span>=<span style="color: #8b2252;">"max_views"</span> <span style="color: #a0522d;">type</span>=<span style="color: #8b2252;">"int"</span> <span style="color: #a0522d;">value</span>=<span style="color: #8b2252;">"0"</span>&gt; &lt;<span style="color: #5165e4;">input</span> <span style="color: #3f6faf;">name</span>=<span style="color: #007f6f;">"max_views"</span> <span style="color: #3f6faf;">type</span>=<span style="color: #007f6f;">"int"</span> <span style="color: #3f6faf;">value</span>=<span style="color: #007f6f;">"0"</span>&gt;
&lt;<span style="color: #0000ff;">label</span> <span style="color: #a0522d;">for</span>=<span style="color: #8b2252;">"expiration"</span>&gt;Tiempo de expiraci&#243;n (en minutos):&lt;/<span style="color: #0000ff;">label</span>&gt; &lt;<span style="color: #5165e4;">label</span> <span style="color: #3f6faf;">for</span>=<span style="color: #007f6f;">"expiration"</span>&gt;Tiempo de expiraci&#243;n (en minutos):&lt;/<span style="color: #5165e4;">label</span>&gt;
&lt;<span style="color: #0000ff;">input</span> <span style="color: #a0522d;">name</span>=<span style="color: #8b2252;">"expiration"</span> <span style="color: #a0522d;">type</span>=<span style="color: #8b2252;">"int"</span> <span style="color: #a0522d;">value</span>=<span style="color: #8b2252;">"15"</span>&gt; &lt;<span style="color: #5165e4;">input</span> <span style="color: #3f6faf;">name</span>=<span style="color: #007f6f;">"expiration"</span> <span style="color: #3f6faf;">type</span>=<span style="color: #007f6f;">"int"</span> <span style="color: #3f6faf;">value</span>=<span style="color: #007f6f;">"15"</span>&gt;
&lt;/<span style="color: #0000ff;">fieldset</span>&gt; &lt;/<span style="color: #5165e4;">fieldset</span>&gt;
&lt;<span style="color: #0000ff;">button</span> <span style="color: #a0522d;">type</span>=<span style="color: #8b2252;">"submit"</span>&gt;Guardar&lt;/<span style="color: #0000ff;">button</span>&gt; &lt;<span style="color: #5165e4;">button</span> <span style="color: #3f6faf;">type</span>=<span style="color: #007f6f;">"submit"</span>&gt;Guardar&lt;/<span style="color: #5165e4;">button</span>&gt;
&lt;/<span style="color: #0000ff;">form</span>&gt; &lt;/<span style="color: #5165e4;">form</span>&gt;
&lt;/<span style="color: #0000ff;">body</span>&gt; &lt;/<span style="color: #5165e4;">body</span>&gt;
&lt;/<span style="color: #0000ff;">html</span>&gt; &lt;/<span style="color: #5165e4;">html</span>&gt;
</pre> </pre>
</div> </div>
@ -931,8 +931,8 @@ No creo que sea necesario que expliquemos un código html, si no lo entiendes, n
</div> </div>
</div> </div>
<div id="outline-container-org95443fb" class="outline-3"> <div id="outline-container-org896289f" class="outline-3">
<h3 id="org95443fb"><span class="section-number-3">3.5.</span> Mostrando el formulario</h3> <h3 id="org896289f"><span class="section-number-3">3.5.</span> Mostrando el formulario</h3>
<div class="outline-text-3" id="text-3-5"> <div class="outline-text-3" id="text-3-5">
<p> <p>
Ahora no vamos a hacer un archivos completos, los haremos a pedacitos de código a medida que avancemos. Ahora no vamos a hacer un archivos completos, los haremos a pedacitos de código a medida que avancemos.
@ -943,16 +943,16 @@ Comenzando con el controlador, vamos a crear un archivo llamado <code>NoteContro
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">namespace</span> <span style="color: #228b22;">Controllers</span>; <span style="color: #ad45ba; font-weight: bold;">namespace</span> <span style="color: #0f7a9d;">Controllers</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Request</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Request</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\View</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\View</span>;
<span style="color: #a020f0;">class</span> <span style="color: #228b22;">NoteController</span> { <span style="color: #ad45ba; font-weight: bold;">class</span> <span style="color: #0f7a9d;">NoteController</span> {
<span style="color: #a020f0;">public</span> <span style="color: #a020f0;">static</span> <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">home</span>(Request $<span style="color: #a0522d;">request</span>): <span style="color: #228b22;">void</span> <span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #ad45ba; font-weight: bold;">static</span> <span style="color: #ad45ba; font-weight: bold;">function</span> <span style="color: #5165e4;">home</span>(Request $<span style="color: #3f6faf;">request</span>): <span style="color: #0f7a9d;">void</span>
{ {
<span style="color: #008b8b;">View</span>::render(<span style="color: #8b2252;">'CreateNote'</span>); <span style="color: #c035aa;">View</span>::render(<span style="color: #007f6f;">'CreateNote'</span>);
} }
} }
</pre> </pre>
@ -979,10 +979,10 @@ Aquí me doy el lujo de hacer otro paréntesis para hablar del tipo <code>callab
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Router</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Router</span>;
<span style="color: #008b8b;">Router</span>::get(<span style="color: #8b2252;">'/'</span>, <span style="color: #8b2252;">'Controllers\NoteController::home'</span>); <span style="color: #c035aa;">Router</span>::get(<span style="color: #007f6f;">'/'</span>, <span style="color: #007f6f;">'Controllers\NoteController::home'</span>);
</pre> </pre>
</div> </div>
@ -991,11 +991,11 @@ O de esta otra manera:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Controllers\NoteController</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Controllers\NoteController</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Router</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Router</span>;
<span style="color: #008b8b;">Router</span>::get(<span style="color: #8b2252;">'/'</span>, [<span style="color: #008b8b;">NoteController</span>::<span style="color: #483d8b;">class</span>, <span style="color: #8b2252;">'home'</span>]); <span style="color: #c035aa;">Router</span>::get(<span style="color: #007f6f;">'/'</span>, [<span style="color: #c035aa;">NoteController</span>::<span style="color: #705ae3; font-weight: bold;">class</span>, <span style="color: #007f6f;">'home'</span>]);
</pre> </pre>
</div> </div>
@ -1004,8 +1004,8 @@ Ambas funcionarán y al entrar en <code>http://localhost</code> ya
</p> </p>
</div> </div>
<div id="outline-container-org83a2991" class="outline-4"> <div id="outline-container-org884ff52" class="outline-4">
<h4 id="org83a2991"><span class="section-number-4">3.5.1.</span> Extra: Explicación del tipo callable</h4> <h4 id="org884ff52"><span class="section-number-4">3.5.1.</span> Extra: Explicación del tipo callable</h4>
<div class="outline-text-4" id="text-3-5-1"> <div class="outline-text-4" id="text-3-5-1">
<p> <p>
Enlos anteriores 2 bloques de código lo que hemos visto han sido 2 maneras de escribir un callable: Enlos anteriores 2 bloques de código lo que hemos visto han sido 2 maneras de escribir un callable:
@ -1016,13 +1016,13 @@ En el primer código he escrito el nombre completo hasta la función en un strin
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Controllers\NoteController</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Controllers\NoteController</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Request</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Request</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Router</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Router</span>;
<span style="color: #008b8b;">Router</span>::get(<span style="color: #8b2252;">'/'</span>, <span style="color: #a020f0;">function</span>(){}); <span style="color: #c035aa;">Router</span>::get(<span style="color: #007f6f;">'/'</span>, <span style="color: #ad45ba; font-weight: bold;">function</span>(){});
[<span style="color: #008b8b;">NoteController</span>::<span style="color: #483d8b;">class</span>, <span style="color: #8b2252;">'home'</span>](<span style="color: #a020f0;">new</span> <span style="color: #228b22;">Request</span>); [<span style="color: #c035aa;">NoteController</span>::<span style="color: #705ae3; font-weight: bold;">class</span>, <span style="color: #007f6f;">'home'</span>](<span style="color: #ad45ba; font-weight: bold;">new</span> <span style="color: #0f7a9d;">Request</span>);
</pre> </pre>
</div> </div>
@ -1031,12 +1031,12 @@ O también:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #483d8b;">&lt;?php</span> <pre class="src src-php"><span style="color: #c01f5f;">&lt;?php</span>
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Request</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Request</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Router</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Router</span>;
<span style="color: #008b8b;">Router</span>::get(<span style="color: #8b2252;">'/'</span>, <span style="color: #a020f0;">function</span>(){}); <span style="color: #c035aa;">Router</span>::get(<span style="color: #007f6f;">'/'</span>, <span style="color: #ad45ba; font-weight: bold;">function</span>(){});
<span style="color: #8b2252;">'Controllers\NoteController::home'</span>(<span style="color: #a020f0;">new</span> <span style="color: #228b22;">Request</span>); <span style="color: #007f6f;">'Controllers\NoteController::home'</span>(<span style="color: #ad45ba; font-weight: bold;">new</span> <span style="color: #0f7a9d;">Request</span>);
</pre> </pre>
</div> </div>
@ -1047,34 +1047,34 @@ Sé que esto es algo raro y que realmente tiene que ver con el conocimiendo de P
</div> </div>
</div> </div>
<div id="outline-container-org7f6f95f" class="outline-3"> <div id="outline-container-orga360861" class="outline-3">
<h3 id="org7f6f95f"><span class="section-number-3">3.6.</span> Creando la nota encriptada</h3> <h3 id="orga360861"><span class="section-number-3">3.6.</span> Creando la nota encriptada</h3>
<div class="outline-text-3" id="text-3-6"> <div class="outline-text-3" id="text-3-6">
<p> <p>
Ahora que ya tenemos el formulario, ya solo nos queda encriptar y guardar nuestra nota. Para ello comenzaremos agregando la siguiente función a nuestro modelo: Ahora que ya tenemos el formulario, ya solo nos queda encriptar y guardar nuestra nota. Para ello comenzaremos agregando la siguiente función a nuestro modelo:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">public</span> <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">encrypt</span>(): <span style="color: #228b22;">string</span> <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #ad45ba; font-weight: bold;">function</span> <span style="color: #5165e4;">encrypt</span>(): <span style="color: #0f7a9d;">string</span>
{ {
<span style="color: #b22222;">// </span><span style="color: #b22222;">Generamos una llave aleatoria de entre 12 a 32 caracteres</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Generamos una llave aleatoria de entre 12 a 32 caracteres</span>
$<span style="color: #a0522d;">secretKey</span> = substr( $<span style="color: #3f6faf;">secretKey</span> = substr(
str_shuffle(<span style="color: #8b2252;">'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'</span>), str_shuffle(<span style="color: #007f6f;">'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'</span>),
0, 0,
mt_rand(16, 32) mt_rand(16, 32)
); );
<span style="color: #b22222;">// </span><span style="color: #b22222;">Encriptamos la nota en AES256 usando la llave antes generada</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Encriptamos la nota en AES256 usando la llave antes generada</span>
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span> = openssl_encrypt( <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span> = openssl_encrypt(
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span>, <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span>,
<span style="color: #8b2252;">'AES-256-CBC'</span>, <span style="color: #007f6f;">'AES-256-CBC'</span>,
$<span style="color: #a0522d;">secretKey</span>, $<span style="color: #3f6faf;">secretKey</span>,
<span style="color: #008b8b;">OPENSSL_RAW_DATA</span>, <span style="color: #c035aa;">OPENSSL_RAW_DATA</span>,
substr($<span style="color: #a0522d;">secretKey</span>, 0, 16) substr($<span style="color: #3f6faf;">secretKey</span>, 0, 16)
); );
<span style="color: #b22222;">// </span><span style="color: #b22222;">Devolvemos la llave</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Devolvemos la llave</span>
<span style="color: #a020f0;">return</span> $<span style="color: #a0522d;">secretKey</span>; <span style="color: #ad45ba; font-weight: bold;">return</span> $<span style="color: #3f6faf;">secretKey</span>;
} }
</pre> </pre>
</div> </div>
@ -1088,20 +1088,20 @@ Ahora vamos a hacer un controlador que recibirá el formulario, encriptará la n
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">public</span> <span style="color: #a020f0;">static</span> <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">create</span>(Request $<span style="color: #a0522d;">request</span>): <span style="color: #228b22;">void</span> <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #ad45ba; font-weight: bold;">static</span> <span style="color: #ad45ba; font-weight: bold;">function</span> <span style="color: #5165e4;">create</span>(Request $<span style="color: #3f6faf;">request</span>): <span style="color: #0f7a9d;">void</span>
{ {
<span style="color: #b22222;">// </span><span style="color: #b22222;">Creamos una instancia de Note y le pasamos los datos del formulario</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Creamos una instancia de Note y le pasamos los datos del formulario</span>
$<span style="color: #a0522d;">note</span> = <span style="color: #a020f0;">new</span> <span style="color: #228b22;">Note</span>; $<span style="color: #3f6faf;">note</span> = <span style="color: #ad45ba; font-weight: bold;">new</span> <span style="color: #0f7a9d;">Note</span>;
$<span style="color: #a0522d;">note</span>-&gt;<span style="color: #a0522d;">content</span> = $<span style="color: #a0522d;">request</span>-&gt;<span style="color: #a0522d;">post</span>-&gt;<span style="color: #a0522d;">note</span>; $<span style="color: #3f6faf;">note</span>-&gt;<span style="color: #3f6faf;">content</span> = $<span style="color: #3f6faf;">request</span>-&gt;<span style="color: #3f6faf;">post</span>-&gt;<span style="color: #3f6faf;">note</span>;
$<span style="color: #a0522d;">note</span>-&gt;<span style="color: #a0522d;">max_views</span> = $<span style="color: #a0522d;">request</span>-&gt;<span style="color: #a0522d;">post</span>-&gt;<span style="color: #a0522d;">max_views</span>; $<span style="color: #3f6faf;">note</span>-&gt;<span style="color: #3f6faf;">max_views</span> = $<span style="color: #3f6faf;">request</span>-&gt;<span style="color: #3f6faf;">post</span>-&gt;<span style="color: #3f6faf;">max_views</span>;
$<span style="color: #a0522d;">note</span>-&gt;<span style="color: #a0522d;">expire_at</span> = strtotime(<span style="color: #8b2252;">"+</span><span style="color: #a0522d;">{$request-&gt;post-&gt;expiration}</span><span style="color: #8b2252;"> minutes"</span>); $<span style="color: #3f6faf;">note</span>-&gt;<span style="color: #3f6faf;">expire_at</span> = strtotime(<span style="color: #007f6f;">"+</span><span style="color: #3f6faf;">{$request-&gt;post-&gt;expiration}</span><span style="color: #007f6f;"> minutes"</span>);
<span style="color: #b22222;">// </span><span style="color: #b22222;">Encriptamos los datos y luego los guardamos</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Encriptamos los datos y luego los guardamos</span>
$<span style="color: #a0522d;">secretKey</span> = $<span style="color: #a0522d;">note</span>-&gt;encrypt(); $<span style="color: #3f6faf;">secretKey</span> = $<span style="color: #3f6faf;">note</span>-&gt;encrypt();
$<span style="color: #a0522d;">note</span>-&gt;save(); $<span style="color: #3f6faf;">note</span>-&gt;save();
<span style="color: #b22222;">// </span><span style="color: #b22222;">Redirigimos a la url final donde se ver&#225; la nota</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Redirigimos a la url final donde se ver&#225; la nota</span>
<span style="color: #008b8b;">Router</span>::redirect(<span style="color: #8b2252;">"/</span><span style="color: #a0522d;">{$note-&gt;id}</span><span style="color: #8b2252;">/</span><span style="color: #a0522d;">{$secretKey}</span><span style="color: #8b2252;">"</span>); <span style="color: #c035aa;">Router</span>::redirect(<span style="color: #007f6f;">"/</span><span style="color: #3f6faf;">{$note-&gt;id}</span><span style="color: #007f6f;">/</span><span style="color: #3f6faf;">{$secretKey}</span><span style="color: #007f6f;">"</span>);
} }
</pre> </pre>
</div> </div>
@ -1111,8 +1111,8 @@ Desde luego, también tenemos que añadir los uses de <code>Libs\Router</code> y
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">use</span> <span style="color: #228b22;">Libs\Router</span>; <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Libs\Router</span>;
<span style="color: #a020f0;">use</span> <span style="color: #228b22;">Models\Note</span>; <span style="color: #ad45ba; font-weight: bold;">use</span> <span style="color: #0f7a9d;">Models\Note</span>;
</pre> </pre>
</div> </div>
@ -1125,7 +1125,7 @@ Para finalizar vamos configurar la ruta. Así que editamos el archivo <code>note
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #008b8b;">Router</span>::post(<span style="color: #8b2252;">'/'</span>, [<span style="color: #008b8b;">NoteController</span>::<span style="color: #483d8b;">class</span>, <span style="color: #8b2252;">'create'</span>]); <pre class="src src-php"><span style="color: #c035aa;">Router</span>::post(<span style="color: #007f6f;">'/'</span>, [<span style="color: #c035aa;">NoteController</span>::<span style="color: #705ae3; font-weight: bold;">class</span>, <span style="color: #007f6f;">'create'</span>]);
</pre> </pre>
</div> </div>
@ -1139,57 +1139,57 @@ Ahora ya podemos comenzar a crear nuestras notas, auque aún no las podremos ver
</div> </div>
</div> </div>
<div id="outline-container-org9ec9013" class="outline-3"> <div id="outline-container-orgbe74891" class="outline-3">
<h3 id="org9ec9013"><span class="section-number-3">3.7.</span> Recta final: Desencriptando y mostrando las notas</h3> <h3 id="orgbe74891"><span class="section-number-3">3.7.</span> Recta final: Desencriptando y mostrando las notas</h3>
<div class="outline-text-3" id="text-3-7"> <div class="outline-text-3" id="text-3-7">
<p> <p>
Vamos directo al grano, editaremos el modelo (<code>src/Models/Note.php</code>) y le añadiremos esta otra función para desencriptar: Vamos directo al grano, editaremos el modelo (<code>src/Models/Note.php</code>) y le añadiremos esta otra función para desencriptar:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">public</span> <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">decrypt</span>(<span style="color: #228b22;">string</span> $<span style="color: #a0522d;">secretKey</span>) : <span style="color: #228b22;">void</span> <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #ad45ba; font-weight: bold;">function</span> <span style="color: #5165e4;">decrypt</span>(<span style="color: #0f7a9d;">string</span> $<span style="color: #3f6faf;">secretKey</span>) : <span style="color: #0f7a9d;">void</span>
{ {
<span style="color: #b22222;">// </span><span style="color: #b22222;">Verificamos si la nota ha expirado</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Verificamos si la nota ha expirado</span>
<span style="color: #a020f0;">if</span> (<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">expire_at</span> &lt; time()) { <span style="color: #ad45ba; font-weight: bold;">if</span> (<span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">expire_at</span> &lt; time()) {
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span> = <span style="color: #8b2252;">'La nota se ha destruido por expiraci&#243;n.'</span>; <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span> = <span style="color: #007f6f;">'La nota se ha destruido por expiraci&#243;n.'</span>;
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;delete(); <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;delete();
<span style="color: #a020f0;">return</span>; <span style="color: #ad45ba; font-weight: bold;">return</span>;
} }
<span style="color: #b22222;">// </span><span style="color: #b22222;">Intentamos desencriptar.</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Intentamos desencriptar.</span>
$<span style="color: #a0522d;">content</span> = openssl_decrypt( $<span style="color: #3f6faf;">content</span> = openssl_decrypt(
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span>, <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span>,
<span style="color: #8b2252;">'AES-256-CBC'</span>, <span style="color: #007f6f;">'AES-256-CBC'</span>,
$<span style="color: #a0522d;">secretKey</span>, $<span style="color: #3f6faf;">secretKey</span>,
<span style="color: #008b8b;">OPENSSL_RAW_DATA</span>, <span style="color: #c035aa;">OPENSSL_RAW_DATA</span>,
substr($<span style="color: #a0522d;">secretKey</span>, 0, 16) substr($<span style="color: #3f6faf;">secretKey</span>, 0, 16)
); );
<span style="color: #b22222;">// </span><span style="color: #b22222;">Verificamos si desencript&#243; correctamente</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Verificamos si desencript&#243; correctamente</span>
<span style="color: #a020f0;">if</span> (is_string($<span style="color: #a0522d;">content</span>)) { <span style="color: #ad45ba; font-weight: bold;">if</span> (is_string($<span style="color: #3f6faf;">content</span>)) {
<span style="color: #b22222;">// </span><span style="color: #b22222;">Verificamos si est&#225; configurado para infinitas vistas.</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Verificamos si est&#225; configurado para infinitas vistas.</span>
<span style="color: #a020f0;">if</span> (<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">max_views</span> == 0) { <span style="color: #ad45ba; font-weight: bold;">if</span> (<span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">max_views</span> == 0) {
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span> = $<span style="color: #a0522d;">content</span>; <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span> = $<span style="color: #3f6faf;">content</span>;
<span style="color: #a020f0;">return</span>; <span style="color: #ad45ba; font-weight: bold;">return</span>;
} }
<span style="color: #b22222;">// </span><span style="color: #b22222;">Reducimos el contador de vistas</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Reducimos el contador de vistas</span>
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">max_views</span> = <span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">max_views</span> - 1; <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">max_views</span> = <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">max_views</span> - 1;
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;save(); <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;save();
<span style="color: #b22222;">// </span><span style="color: #b22222;">Verificamos si el contador de vistas ha llegado a 0.</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Verificamos si el contador de vistas ha llegado a 0.</span>
<span style="color: #a020f0;">if</span> (<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">max_views</span> &lt;= 0) { <span style="color: #ad45ba; font-weight: bold;">if</span> (<span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">max_views</span> &lt;= 0) {
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span> = <span style="color: #8b2252;">'La nota se ha destruido seg&#250;n su l&#237;mite de vistas.'</span>; <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span> = <span style="color: #007f6f;">'La nota se ha destruido seg&#250;n su l&#237;mite de vistas.'</span>;
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;delete(); <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;delete();
<span style="color: #a020f0;">return</span>; <span style="color: #ad45ba; font-weight: bold;">return</span>;
} }
<span style="color: #b22222;">// </span><span style="color: #b22222;">Si no ha expirado, solo devolvemos el contenido</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Si no ha expirado, solo devolvemos el contenido</span>
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span> = $<span style="color: #a0522d;">content</span>; <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span> = $<span style="color: #3f6faf;">content</span>;
} <span style="color: #a020f0;">else</span> { } <span style="color: #ad45ba; font-weight: bold;">else</span> {
<span style="color: #b22222;">// </span><span style="color: #b22222;">Si no se pudo desencriptar colocamos un error</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Si no se pudo desencriptar colocamos un error</span>
<span style="color: #008b8b;">$</span><span style="color: #008b8b;">this</span>-&gt;<span style="color: #a0522d;">content</span> = <span style="color: #8b2252;">'Llave incorrecta.'</span>; <span style="color: #c035aa;">$</span><span style="color: #c035aa;">this</span>-&gt;<span style="color: #3f6faf;">content</span> = <span style="color: #007f6f;">'Llave incorrecta.'</span>;
} }
} }
@ -1201,29 +1201,29 @@ Ahora en el <code>NoteController</code> añadiremos esta otra función:
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #a020f0;">public</span> <span style="color: #a020f0;">static</span> <span style="color: #a020f0;">function</span> <span style="color: #0000ff;">show</span>(Request $<span style="color: #a0522d;">request</span>): <span style="color: #228b22;">void</span> <pre class="src src-php"><span style="color: #ad45ba; font-weight: bold;">public</span> <span style="color: #ad45ba; font-weight: bold;">static</span> <span style="color: #ad45ba; font-weight: bold;">function</span> <span style="color: #5165e4;">show</span>(Request $<span style="color: #3f6faf;">request</span>): <span style="color: #0f7a9d;">void</span>
{ {
<span style="color: #b22222;">// </span><span style="color: #b22222;">Verificamos si el ID es un n&#250;mero</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Verificamos si el ID es un n&#250;mero</span>
<span style="color: #a020f0;">if</span> (!is_numeric($<span style="color: #a0522d;">request</span>-&gt;<span style="color: #a0522d;">params</span>-&gt;<span style="color: #a0522d;">id</span>)) { <span style="color: #ad45ba; font-weight: bold;">if</span> (!is_numeric($<span style="color: #3f6faf;">request</span>-&gt;<span style="color: #3f6faf;">params</span>-&gt;<span style="color: #3f6faf;">id</span>)) {
<span style="color: #008b8b;">Router</span>::defaultNotFound(); <span style="color: #c035aa;">Router</span>::defaultNotFound();
<span style="color: #a020f0;">return</span>; <span style="color: #ad45ba; font-weight: bold;">return</span>;
} }
<span style="color: #b22222;">// </span><span style="color: #b22222;">Obtenemos la nota de la base de datos</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Obtenemos la nota de la base de datos</span>
$<span style="color: #a0522d;">note</span> = <span style="color: #008b8b;">Note</span>::getById($<span style="color: #a0522d;">request</span>-&gt;<span style="color: #a0522d;">params</span>-&gt;<span style="color: #a0522d;">id</span>); $<span style="color: #3f6faf;">note</span> = <span style="color: #c035aa;">Note</span>::getById($<span style="color: #3f6faf;">request</span>-&gt;<span style="color: #3f6faf;">params</span>-&gt;<span style="color: #3f6faf;">id</span>);
<span style="color: #b22222;">// </span><span style="color: #b22222;">Verificamos si la nota existe</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Verificamos si la nota existe</span>
<span style="color: #a020f0;">if</span> (is_null($<span style="color: #a0522d;">note</span>)) { <span style="color: #ad45ba; font-weight: bold;">if</span> (is_null($<span style="color: #3f6faf;">note</span>)) {
<span style="color: #008b8b;">Router</span>::defaultNotFound(); <span style="color: #c035aa;">Router</span>::defaultNotFound();
<span style="color: #a020f0;">return</span>; <span style="color: #ad45ba; font-weight: bold;">return</span>;
} }
<span style="color: #b22222;">// </span><span style="color: #b22222;">Desencriptamos la nota</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Desencriptamos la nota</span>
$<span style="color: #a0522d;">note</span>-&gt;decrypt($<span style="color: #a0522d;">request</span>-&gt;<span style="color: #a0522d;">params</span>-&gt;<span style="color: #a0522d;">key</span>); $<span style="color: #3f6faf;">note</span>-&gt;decrypt($<span style="color: #3f6faf;">request</span>-&gt;<span style="color: #3f6faf;">params</span>-&gt;<span style="color: #3f6faf;">key</span>);
<span style="color: #b22222;">// </span><span style="color: #b22222;">Imprimimos en formato de texto plano el resultado del desencriptado</span> <span style="color: #a05b5f; font-style: italic;">// </span><span style="color: #a05b5f; font-style: italic;">Imprimimos en formato de texto plano el resultado del desencriptado</span>
$<span style="color: #a0522d;">view</span> = <span style="color: #a020f0;">new</span> <span style="color: #228b22;">View</span>; $<span style="color: #3f6faf;">view</span> = <span style="color: #ad45ba; font-weight: bold;">new</span> <span style="color: #0f7a9d;">View</span>;
$<span style="color: #a0522d;">view</span>-&gt;text($<span style="color: #a0522d;">note</span>-&gt;<span style="color: #a0522d;">content</span>); $<span style="color: #3f6faf;">view</span>-&gt;text($<span style="color: #3f6faf;">note</span>-&gt;<span style="color: #3f6faf;">content</span>);
} }
</pre> </pre>
</div> </div>
@ -1245,7 +1245,7 @@ Ahora la cerecita del paste: Vamos a configurar el router, así que editamos nue
</p> </p>
<div class="org-src-container"> <div class="org-src-container">
<pre class="src src-php"><span style="color: #008b8b;">Router</span>::get(<span style="color: #8b2252;">'/{id}/{key}'</span>, [<span style="color: #008b8b;">NoteController</span>::<span style="color: #483d8b;">class</span>, <span style="color: #8b2252;">'show'</span>]); <pre class="src src-php"><span style="color: #c035aa;">Router</span>::get(<span style="color: #007f6f;">'/{id}/{key}'</span>, [<span style="color: #c035aa;">NoteController</span>::<span style="color: #705ae3; font-weight: bold;">class</span>, <span style="color: #007f6f;">'show'</span>]);
</pre> </pre>
</div> </div>
@ -1279,15 +1279,15 @@ Crea una aplicación de gestión tareas (un TODO list), en donde puedas agregar
</div> </div>
</div> </div>
<div id="outline-container-orgb6ce768" class="outline-3"> <div id="outline-container-orga9e5de1" class="outline-3">
<h3 id="orgb6ce768"><span class="section-number-3">3.8.</span> Repositorio</h3> <h3 id="orga9e5de1"><span class="section-number-3">3.8.</span> Repositorio</h3>
<div class="outline-text-3" id="text-3-8"> <div class="outline-text-3" id="text-3-8">
<p> <p>
Por si alguien se perdió o sencillamente quiere ver código, he subido la aplicación ignota en este repositorio: Por si alguien se perdió o sencillamente quiere ver código, he subido la aplicación ignota en este repositorio:
</p> </p>
<p> <p>
[URL faltante] <a href="https://gitlab.com/kj2me/Ignota">https://gitlab.com/kj2me/Ignota</a>
</p> </p>
<p> <p>
@ -1297,8 +1297,8 @@ Te animo a hacerle un fork, mejorarlo y enviármelo. Los forks que me parezcan i
</div> </div>
</div> </div>
<div id="outline-container-org6070584" class="outline-2"> <div id="outline-container-org77dff78" class="outline-2">
<h2 id="org6070584"><span class="section-number-2">4.</span> Contacto</h2> <h2 id="org77dff78"><span class="section-number-2">4.</span> Contacto</h2>
<div class="outline-text-2" id="text-4"> <div class="outline-text-2" id="text-4">
<p> <p>
Como siempre, pueden contactarme mediante el correo <code>webmaster@outcontol.net</code> Como siempre, pueden contactarme mediante el correo <code>webmaster@outcontol.net</code>
@ -1316,7 +1316,7 @@ No es una comunidad de programación solamente, pero ahora mismo no existe una d
</div> </div>
<div id="postamble" class="status"> <div id="postamble" class="status">
<p class="author">Author: KJ</p> <p class="author">Author: KJ</p>
<p class="date">Created: 2024-05-14 mar 02:58</p> <p class="date">Created: 2024-05-31 vie 16:24</p>
<p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p> <p class="validation"><a href="https://validator.w3.org/check?uri=referer">Validate</a></p>
</div> </div>
</body> </body>