Herramientas de usuario

Herramientas del sitio


octaviotron:casero

Casero: Fundamentos de Programación Funcional en PHP

Haciendo páginas web con un simple script que he llamado “Casero” y que uso para enseñar PHP.

Hola Mundo

Así se hace un “Hola Mundo”:

<?php  
$Contenido = "<p>Hola mundo</p>";
?>

Sólo definiendo un contenido HTML en esta variable se colocará ese valor en el cuerpo de la página.

Entendiendo cómo funciona Casero

Toda “página” existe si hay un script con su nombre (con extensión .php) en el directorio local/

Veamos un ejemplo de cómo crear la página “ejemplo” en nuestro framework. Digamos que nuestro servidor está en la dirección 1.2.3.4 (bien puede ser un dominio), si invocamos esta URL:

http://1.2.3.4/ejemplo

Esto cargará (si existe) el script local/ejemplo.php y mostrará la página resultante, la cual se compone de lo que en este script se especifique.

Toda página existe si hay una “pagina.php” correspondiente en local/ de lo contrario, si en nuestro caso local/ejemplo.php no existe, se cargará un contenido definido por omisión en static/404.html.

Cuando se ejecuta el script “ejemplo.php” (cuando se llama desde la URL) ya se habrán cargado todas las funciones existentes en todos los archivos que haya en la la carpeta lib/ Eso lo hace automáticamente el framework.

Lo único que DEBE hacer un script de página (local/ejemplo.php en nuestro caso) es definir la variable $Contenido. Este puede ser el contenido de local/ejemplo.php

<?php
$Contenido = "<h1>Ejemplo de Página con funciones de Usuario</h1 script>";
$Contenido.= funcionEjemplo();

function funcionEjemplo()
  {
  return "Framework Casero";
  }
?>

Por comodidad, si el desarrollador quiere tener sus funciones aparte del algoritmo principal las podrá poner en un archivo que se carga automáticamente (si existe) en la dirección local/lib/ejemplo.php y de existir el directorio local/ejemplo/ cargará todo el contenido allí existente.

No habrá necesidad de hacerle un INCLUDE pues ya el Framework lo habrá hecho en caso de que el archivo esté allí y las funciones existentes se habrán cargado antes.

NOTA: Estoy modificando el script para que al cargarse el contenido de la carpeta /local/ejemplo/ cada una de las funciones principales sea el nombre de las posibles URLs a visitar: http://.../ejemplo/funcion/parametro/ al parecer necesitará un híbrido con programación orientada a objetos para facilitar la sintaxis interna.

Estructura

Casero viene con una estructura inicial que se puede adaptar luego a cualquier forma. Su configuración por omisión es la siguiente:

  _______________________________
 | Titulo                        |
 |_______________________________|
 |_m_e_n_u_______________________|
 |        |                      |
 | Bloque |      Contenido       |
 |        |                      |
 |________|                      |
 |                               |
 |_______________________________|
 |                               |
 | Pie                           |
 |_______________________________| 

Esto se puede cambiar en la posición y tamaño que sea, mediante cambios en el CSS y en el orden que sea colocando en una plantilla HTML la etiqueta respectiva donde se quiera colocar la sección. En la plantilla HTML cada sección se etiqueta en el archivo index.html de la carpeta tema/ de la siguiente manera:

<!-- #nombrebloque# -->

Y esta será el nombre de cada “bloque” que se use en el arreglo de variables definidas en este script. Se pueden crear tantos bloques como se necesiten. Basta con que estén en la plantilla HTML y que asignarle el valor.

Variables por omisión

El archivo config.php es quien tiene todos los datos por omisión de nuestro sitio, los cuales se pueden definir en cada una de las páginas cuando se desee cambiar su valor.

Se recomienda ver el contenido de config.php para comprender bien qué valores provee. Estos valores se podrán redefinir siempre para cada página.

NOTA: está por hacer que el tema pueda ser también cargado dinámicamente, para poder hacer páginas con distinto esquema y diseño. Esto aún no está implementado.

En este archivo también se define los elementos del menú y el contenido de las partes o bloques de la página que se definieron con cada <!– #nombrebloque# –> previamente.

Estas son las variables que vienen con el script:

$FWK['menu']

Una lista no-ordenada de HTML (con etiquetas UL-LI) que consituirán el Menú Principal de la página. Si no se define ningún valor o si se iguala a vacío en una página, se eliminará el menú.

$FWK['bloque']

Acá va el contenido del bloque (lateral en el css existente por defecto). Igualmente si se declara vacío se eliminará el bloque y si no se declara, se carga estáticamente desde la función frmwk_bloque().

$FWK['contenido']

En realidad $Contenido es simplemente un alias de $FWK['contenido']. Se puede opcionalmente usar esta variable y no $Contenido.

$FWK['titulo'] y $FWK['subtitulo']

Respectivamente el contenido de las etiquetas H1 y H2 que salen en la cabecera de la página. Si se declaran vacíos sus valores se omite su aparición.

$FWK['pie']

Es el pie de página. Su valor por omisión está en lib/omision.php

$FWK['title']

Será la cadena de caracteres que aparecerá en la barra del navegador

Variables más específicas:

$FWK['head']

Se agregará al HTML <HEAD></HEAD>. Util para hacer las llamadas a archivos con javascript o a CSS adicional.

$FWK['body']

Se agregara a la etiqueta <BODY $valor>. Util para definir eventos onload en BODY.

EJEMPLO:

<?php
$FWK['titulo']    = "Página Tal";
$FWK['subtitulo'] = "...y tal";
$FWK['head']      = "<script src='lib/js/script.js'>";
$FWK['body']      = " OnLoad='funcionTal()'";
$FWK['menu']      = ""; # esta página no tiene menú principal
$FWK['bloque']    = ""; # tampoco bloque

$FWK['contenido'] = función_tal();

?>

El Menú Principal

Un archivo JSON define los elementos que se ven en el Menú Principal. Estos elementos serán un par “Nombre del Vínculo”:“vínculo” y podrán tener submenúes de segundo nivel opcionalmente.

La estructura está en “lib/menu/menu.json” y se podrá editar para los fines necesarios.

Si se desea eliminar el menú y no tener tal sección, sólo es necesario declarar vacía la variable $FWK['menu'] en config.php o en la página de local/ donde se desee no tener menú.

Variables pasadas en la URL via GET

Este método para pasar variables es inseguro y desaconsejado. Aún así, siendo estricto y sólo con mucha paranoia y excesivo nerviosismo, es posible publicar algunas variables. Un ejemplo de ello es el nombre de la función que se invoca por ejemplo en una página llamada “misitio/ver/galeria” o “misitio/formulario/inscribirse”

Todo contenido posterior al dominio y nombre de página que esté en la URL pasará al arreglo $PVARS.

Ejemplo:

http://1.2.3.4/frutas/peras/manzanas/limones

Contenido de local/frutas.php

<?php
$Contenido = "Datos enviados en la URL:";
$Contenido.= "<ol>";
foreach ($PVARS as $dato) 
  $Contenido.= "<li>$dato</li>";
$Contenido.= "</ol>";
?>

Dará como resultado:

Datos Enviados en la URL:
  0- frutas
  1- peras
  2- Manzanas
  3- Limones

Autenticación y Sesiones

Cuando una página necesite estar restringida, sólo será necesario declarar la variable $FWK['cred']. Al hacer esto sólo a quienes tengan un registro de credencial se le dejará pasar.

Esta variable deberá ser numérica y cualquier valor superior a cero hará que la página necesite autenticación. El número que se define es el NIVEL de autenticación requerido. Este valor viene de la tabla Usuarios de la Base de Datos y podrá ser un identificador que arroje una tabla de la base de datos, de manera de tener una ACL.

En nuestro framework hay una página restringida de ejemplo (local/ejemplo_restringida.php) cuyo contenido es el siguiente:

<?php
$FWK['auth']=3;
$Contenido = "<strong>Este es un ejemplo de página con contenido restringido</strong>";
?>

Esto hará que nuestra página sea automáticamente redirigida a un formulario de usuario/clave que deberá enviarse con los datos correctos. Una vez hecho esto se abrirá la página anteriormente solicitada y que requirió autenticación.

Si ya hubo una autenticación y por lo tanto hay una sesión activa, se verá el contenido que se defina a continuación, sin necesidad de autenticar nuevamente.

Acceso a Bases de Datos

Tres funciones predefinidas tiene Casero para acceder a bases de datos. Son funciones simples (como todo en Casero) y se podrán agregar más a medida que el usuario lo requiera en lib/libsql.php o en cualquier otro archivo con extensión .php que se coloque en lib/

Actualmente sólo se usa MySQL, pero en prontas versiones se agregará soporte para PostgreSQL y LiteSQL.

bd_ejecutar($sql)

la función bd_ejecutar sirve para hacer INSERT o UPDATE en la base de datos y retornará por omisión TRUE o FALSE si el SQL enviado pudo o no ser ejecutado. Opcionalmente si se invoca con un segundo parámetro 'id' retornará el ID si existe un índice AUTO_INCREMENT en la tabla donde se insertó o se actualizó un campo.

Ejemplos:

$sql = "INSERT INTO frutas VALUE 'limones'";
bd_ejecutar($sql);

Eso ejecutará el query simplemente.

Otras formas de usarse:

$sql = "INSERT INTO frutas VALUE 'lechoza'";
if (bd_ejecutar($sql)) echo "todo bien";
$sql = "INSERT INTO frutas VALUE 'lechoza'";
$id = bd_ejecutar($sql, 'id');
echo "El índice AUTO INCREMENT del último query fue: $id";

bd_obtener($ambito, $sql)

La variable $ambito puede tener dos valores: “campo” o “tabla”. Si se especifica “campo” la salida será un arreglo asociativo unidimensional y si se especifica “tabla” la salida será un arreglo bidimensional.

Ejemplos:

$sql = "SELECT nombre,apellido FROM usuarios WHERE cedula='1234567890'";
$arreglo = bd_obtener("campo", $sql);

La salida de esta función será

array (nombre=>'Fulano', apellido=>'Detal');

Si queremos leer más de un campo y obtener como salida una tabla:

$sql = "Select nombre,apellido FROM usuarios WHERE edad > '85';
$arreglo = bd_obtener("tabla", $sql);

La salida de esta función será

array 
  (
  [0] => array (nombre => 'Zutano', apellido => 'Pascual'),
  [1] => array (nombre => 'Elviejito', apellido => 'Delaesquina')
  )

Se recomienda, para separar el SQL del resto del código que se genere una función por cada búsqueda, y que todas devuelvan un arreglo.

Ejemplo: esta sería una función en lib/libsql.php:

function bd_usuarios_listar()
  {
  $sql = "SELECT * FROM usuarios";
  $salida = bd_obtener("tabla", $sql);
  return $salida;
  }

Entonces para invocarla en nuestros scripts sería así:

$arreglo = bd_usuarios_listar();
foreach ($arreglo as $usuario)
  {
  ...
  }

Descargar e Instalar

El código de Casero se puede descargar AQUI

Proceso de instalación:

  1. Debe haber un servidor http apuntando al directorio raíz del código. No está implementado que se pueda usar dentro de un directorio.
  2. El módulo “mod_rewrite” o similar debe estar apropiadamente configurado. En la mayoría de las distribuciones de Apache para que esto suceda es necesario colocar la opción “AllowOverride All” para el host y para la capeta raíz.
  3. Opcionalmente, si se va a usar el sistema de sesiones y credenciales, debe editar el archivo config.php con los datos de conexión a una BD vacía y se abre la URL /install para que se llene la base de datos con la tabla de usuarios donde el usuario “admin” y la clave “admin” autenticará en la página de prueba

Archivo por Archivo, qué tiene Casero

  • Archivo index.php: lo que hace es invocar a load.php y dibujar el resultado final del Framework
  • Archivo cargar.php: este archivo es el principal y es quien invoca a todas las funciones y decide cuál página abrir, mediante el análisis del URL proporcionado.
  • Archivo config.php: las configuraciones básicas: datos de conexión SQL y todos los valores por defecto.
  • Archivo install.php: se usa para crear la Base de Datos que se usará luego para la autenticación de usuarios
  • Directorio lib/: Contiene todas las funciones básicas. Todos los archivos .php que estén en este directorio serán cargados automáticamente.
    • Archivo funciones.php: rutinas básicas del Framework. Actualmente la encargada de leer el URL y descomponerlo y la función de requerimiento de autenticación.
    • Archivo layout.php: es quien hace la vista partiendo de los campos definidos en el tema. Luego haré una sección dedicado a cómo funciona un tema en el Framework Casero.
    • Archivo sql.php: es donde se alojan todas las funciones de Base de Datos. Luego haré una sección dedicada a las funciones básicas de Base de Datos.
    • Archivo libsql.php: complemento al anterior.
  • Directorio local/: es donde se alojan las páginas. Principal directorio de trabajo
    • Directorio local/lib/: si se invoca una página de “local/” automáticamente, si existe, se le hará include al archivo con el mismo nombre que se encuentre en esta carpeta.
  • Directorio static/: Contiene los archivos estáticos de sólo lectura que necesitará Casero.
    • Archivo 404.html: será el HTML que se vea cuando no exista la página que está siendo invocada.
    • Archivo bloque.html: En este archivo está el HTML del bloque por omisión que opcionalmente puede mostrarse al lado del contenido principal de la página
    • Archivo menu.json: es el archivo JSON con los datos para el despliegue del menú.
  • Directorio tema/: plantilla HTML y definiciones CSS
    • Archivo index.html: contiene la plantilla HTML de los bloques de contenido. Ver sección “TEMAS” para más detalle
    • Archivo style.css: coniente la hoja de estilo necesaria para el index.html
  • Directorio doc/: se encuentra la licencia (GPLv·) y la documentación hasta ahora escrita del desarrollo.
octaviotron/casero.txt · Última modificación: 2013/12/10 14:43 (editor externo)