Generador de código

Es un script escrito en PHP orientando su uso a la consola, su ubicación es ./gen.php y tiene como cometido ser bastante útil al momento de escribir una y otra vez contenidos similares, además de automatizar enormemente la creación de módulos completos en un sistema, por ejemplo CRUDS enteros, escribiéndo todo el código y creando tablas en la base de datos, inclusive acoplándose al diseño web que tenga la aplicación.

NOTA: para utilizar el generador, se debe poder utilizar PHP desde la consola, es decir, tenerla en el registro de variabels globales de Windows/Mac/Linux

Cómo utilizarlo

Hay que ubicarse en la ruta root de el framework desde la consola, es decir, en el índice donde se encuentra el fichero gen.php

php gen.php -ayuda

Dicho comando mostrará un menú de ayuda con todos los posibles comandos que puede manejar el generador.

Crear un controlador

Un uso simple, sería crear un controlador

php gen.php app:c Hola

Generaría el fichero ./app/controllers/holaController.php que tendrá escrito código PHP con la estructura mínima para que el framework la considere un controlador.

NOTA: si el fichero ya existe, no será reemplazado, por tanto no será creado por el generador.

La plantilla que utiliza el framework para escribir este código está en ./Ocrend/Kernel/Generator/Templates/controller.php cuyo contenido es:


namespace appcontrollers;

use appmodels as Model;
use OcrendKernelRouterIRouter;
use OcrendKernelControllersControllers;
use OcrendKernelControllersIControllers;
  
/**
 * Controlador {{view}}/
 *
 * @author {{author}} <{{author_email}}>
*/
  
class {{controller}} extends Controllers implements IControllers {

    public function __construct(IRouter $router) {
        parent::__construct($router);   
        {{content}}
    }

}

Referencia de marcas

Marca Interpretación del Generador
{{view}} Nombre de la vista que corresponde
{{author}} Autor de la clase
{{author_email}} Email del autor de la clase
{{controller}} Nombre de la clase del controlador
{{content}} Contenido del controlador, varía según opciones y otros elementos generados

Crear un modelo

Para crear un modelo

php gen.php app:m Hola

Para crear un modelo con la característica DBModel

php gen.php app:m Hola -db

NOTA: Si se usa la opción -db en conjunto con otras, ésta debe estar escrita al final de toda la instrucción.

Generaría el fichero ./app/models/Hola.php que tendrá escrito código PHP con la estructura mínima para que el framework la considere un modelo.

NOTA 2: si el fichero ya existe, no será reemplazado, por tanto no será creado por el generador.

La plantilla que utiliza el framework para escribir este código está en ./Ocrend/Kernel/Generator/Templates/models.php cuyo contenido es:


namespace appmodels;

use appmodels as Model;
use OcrendKernelModelsModels;
use OcrendKernelModelsIModels;
use OcrendKernelModelsModelsException;
use OcrendKernelModelsTraitsDBModel;
use OcrendKernelRouterIRouter;

/**
 * Modelo {{model}}
 *
 * @author {{author}} <{{author_email}}>
 */

class {{model}} extends Models implements IModels {
    {{trait_db_model}}

    {{content}}

    /**
      * __construct()
    */
    public function __construct(IRouter $router = null) {
        parent::__construct($router);
        {{trait_db_model_construct}}
    }

    /**
      * __destruct()
    */ 
    public function __destruct() {
        parent::__destruct();
        {{trait_db_model_destruct}}
    }
}

Referencia de marcas

Marca Interpretación del Generador
{{model}} Nombre del la clase del modelo
{{author}} Autor de la clase
{{author_email}} Email del autor de la clase
{{content}} Contenido del modelo, varía según opciones y otros elementos generados
{{trait_db_model}} Se sustituye por la característica DBModel en caso de que exista la opción -db
{{trait_db_model_construct}} Se sustituye por la característica DBModel en caso de que exista la opción -db
{{trait_db_model_destruct}} Se sustituye por la característica DBModel en caso de que exista la opción -db

Crear una vista simple

Para crear una vista simple

php gen.php app:v Hola

Generaría el fichero ./app/templates/hola.twig que tendrá escrito código HTML y TWIG.

NOTA: si el fichero ya existe, no será reemplazado, por tanto no será creado por el generador.

La plantilla que utiliza el framework para escribir este código está en ./Ocrend/Kernel/Generator/Templates/Twig/blank.twig cuyo contenido es:


{% extends 'overall/layout' %}
{% block appBody %}
    ¡Hola Mundo!
{% endblock %}

Si adaptamos un poco dicha plantilla de acuerdo al diseño que tenga la aplicación, el resultado será asombroso.

Combinaciones de comandos

El generador es muy flexible, y podemos combinar los tres comandos anteriores de una forma muy sencilla para obtener variados resultados, por ejemplo, para crear un MVC completo bastaría con escribir:

php gen.php app:mvc Ejemplo

NOTA: si alguno de los ficheros ya existe, no será reemplazado, por tanto no será creado por el generador.

No debemos memorizar los comandos, es sencillo, un controlador se representa con la "c", una vista con la "v" y un modelo con la "m", y sin importar el orden, cuando estén juntos, creará los tres, o sea que los siguientes comandos también serían válidos:


php gen.php app:mcv Ejemplo
php gen.php app:vmc Ejemplo
php gen.php app:vcm Ejemplo
php gen.php app:cvm Ejemplo
php gen.php app:cmv Ejemplo

El resultado de crear combinaciones no sólamente se ve reflejado en la cantidad de archivos creados, si no también, en el contenido de los mismos. Al crear MVC por ejemplo, en el contenido del controlador ya se renderiza la vista creada y se hace una instancia del modelo en un objeto, de ésta manera, ahorramos pequeños lapsos de tiempo en escribir código para conectar todo lo que el generador creó.

Opciones para extender las combinaciones

Además de las combinaciones posibles anteriores, si se añaden las siguientes opciones, que también pueden combinarse, se puede reducir de forma importante el tiempo de desarrollo para ciertas situaciones.

Opción Resultado obtenido
-ajax Escribe en ./app/http/post.php y genera un fichero javascript, que conecta con ajax hacia esa ruta en la api rest utilizando una petición POST.

Generará un archivo en ./views/app/js/[nombre]/[nombre].js

-api[verbo] Escribe en ./app/http/[verbo].php y genera un fichero javascript, que conecta con ajax hacia esa ruta en la api rest utilizando el verbo indicado.
Los verbos aceptados son:
  • GET
  • POST
  • DELETE
  • PUT

Generará un archivo en ./views/app/js/[nombre]/[nombre].js

-db Si se acompaña con un modelo, éste nuevo modelo va a ser capaz de conectarse a la base de datos usando la característica DBModel.
NOTA: Ésta opción siempre debe estar al final de la instrucción.
-db [nombre_tabla] campo1:tipo:longitud Crea una tabla en la base de datos que esté configurada por defecto en Ocrend.ini.yml, se debe proporcionar el nombre de la tabla y los campos.
  • campo:tipo:longitud representa la sintaxis para cada campo a crear, cada campo nuevo se debe separar con un espacio y continuar misma sintaxis.
  • Si el tipo de dato del campo no acepta longitud, por ejemplo precio DOUBLE, longitud queda como opcional y se debe expresar como precio:double
NOTA: Ésta opción siempre debe estar al final de la instrucción ya que todo lo que esté después de -db [nombre_tabla] será interpretado como campos para la tabla.
NOTA 2: Si la tabla ya existe no será creada.
NOTA 3: La tabla se creará con un campo id_[nombre_tabla] INT(11) PRIMARY KEY AUTOINCREMENT, por lo que no se debe escribir entre los campos, alguno con el nombre de dicho id.

Para las opciones -ajax y -api:[verbo], se toma el javascript de la plantilla ubicada en ./Ocrend/Kernel/Generator/Templates/ajax.js cuyo contenido es:


function {{view}}(e){
  $.ajax({
    type : '{{method}}',
    url : 'api/{{rest}}',
    data : $('#{{view}}_form').serialize(),
    success : function(json) {
      console.log(json.success);
      console.log(json.message);
      if(json.success == 1) {
        setTimeout(function(){
            location.reload();
        },1000);
      }
    },
    error : function(xhr, status) {
      console.log('Ha ocurrido un problema.');
    }
  });
}

$('#{{view}}').click(function(e) {
  e.defaultPrevented;
  (e);
});
$('#{{view}}_form').keypress(function(e) {
    e.defaultPrevented;
    if(e.which == 13) {
        (e);
    }
});

Referencia de marcas

Marca Interpretación del Generador
{{method}} Método del verbo HTTP
{{rest}} Ruta en la API REST
{{view}} Nombre de la vista desde donde se debe llamar

Crear un CRUD completo

El CRUD representa una estructura MVC completa, donde el modelo tiene acciones para editar, agregar, borrar y listar una entidad de una tabla en la base de datos. Además, de tener un controlador que distribuye dichas acciones. También genera tres vistas, tabla con listado, formularios de agregar y editar, ambos formularios implementados con AJAX.
Los campos representados en la tabla, e inputs en los formularios dependen de los campos creados para la tabla en la base de datos.

Para crear un crud

php gen.php app:crud [Nombre] -db [nombre_tabla] [...campo:tipo:longitud...]

Un ejemplo de crud completo sería

php gen.php app:crud Clientes -db clientes nombre:varchar:30 apellido:varchar:30 edad:int:2 sexo:varchar:10 email:varchar:50

Dicho comando realizará lo siguiente:

  • Tabla clientes en la base de datos configurada en el fichero Ocrend.ini.yml
  • Modelo en ./app/models/Clientes.php con métodos comentados para manejar el CRUD.
  • Controlador en ./app/controllers/clientesController.php que maneja las rutas para el CRUD.
  • Vista de listado en ./app/templates/clientes/clientes.twig y se accede por la url desde clientes/
  • Vista para crear en ./app/templates/clientes/crear.twig y se accede por la url desde clientes/crear/
  • Vista para editar en ./app/templates/clientes/editar.twig y se accede por la url desde clientes/editar/ID_CLIENTE
  • Ajax para forrmularios en ./views/app/js/clientes/ que conecta con la API REST, ésta al modelo, y da respuesta.
  • Escribe nuevas rutas POST en ./api/http/post.php que invocan los métodos necesarios para el CRUD.

NOTA: si alguno de los ficheros ya existe, no será reemplazado, por tanto no será creado por el generador.

NOTA 2: si se está usando el fichero ajax.js por defecto, los resultados se verán en consola de javascript (F12).


La plantilla que utiliza el framework para escribir este código de la vista que maneja el listado está en ./Ocrend/Kernel/Generator/Templates/Twig/table.twig cuyo contenido es:


{% extends 'overall/layout' %}
{% block appBody %}
    <div class="container">
        <div class="col-xs-12 col-md-12 col-lg-12">
            <table class="table table-bordered">
                <thead>
{{thead}}
                </thead>
                <tbody>
{{tbody}}
                </tbody>
            </table>
        </div>
        <div class="col-xs-12 col-md-12 col-lg-12">
            <a href="{{view}}/crear" class="btn btn-primary">+ Crear</a>
        </div>
    </div>
{% endblock %}

Si adaptamos un poco dicha plantilla de acuerdo al diseño que tenga la aplicación, el resultado será asombroso.

Referencia de marcas

Marca Interpretación del Generador
{{view}} Nombre de la vista que corresponde
{{thead}} Se sustituye por la cabecera de la tabla, toma elementos de:
  • ./Ocrend/Kernel/Generator/Templates/Twig/Resources/thead.twig donde {{name}} representa el nombre del campo y tiene el diseño que representará cada th.
  • ./Ocrend/Kernel/Generator/Templates/Twig/Resources/actions_title.twig tiene el diseño de el th para las "Acciones"
{{tbody}} Se sustituye por el contenido de la tabla, toma elementos de:
  • ./Ocrend/Kernel/Generator/Templates/Twig/Resources/tbody.twig donde {{name}} representa la condificación en TWIG que será reemplazada para mostrar el valor del campo.
  • ./Ocrend/Kernel/Generator/Templates/Twig/Resources/actions.twig tiene el diseño de los botones de acción en la tabla.
    • {{view}} representa la url de acción del controlador
    • {{id_element}} será reemplazado por la etiqueta TWIG que representa el id del elemento

La plantilla que utiliza el framework para escribir este código de las vista que manejan los formularios está en ./Ocrend/Kernel/Generator/Templates/Twig/form.twig cuyo contenido es:


{% extends 'overall/layout' %}
{% block appBody %}
    <div class="container">
        <form role="form" id="{{view}}_form">
{{hiddens}}
{{inputs}}
            <div class="form-group">
                <button type="button" class="btn btn-primary" id="{{view}}">Enviar</button>
            </div>
        </form>
    </div>
{% endblock %}
{% block appFooter %}
    <script src="views/app/js/{{view}}/{{ajax_file_name}}.js"></script>
{% endblock %}

Si adaptamos un poco dicha plantilla de acuerdo al diseño que tenga la aplicación, el resultado será asombroso.

Referencia de marcas

Marca Interpretación del Generador
{{view}} Nombre de la vista que corresponde
{{ajax_file_name}} Nombre del fichero javascript que enviará la información del formulario vía AJAX al modelo
{{hiddens}} Se sustituye por campos de tipo hidden necesarios para la edición
{{inputs}} Se sustituye por los inputs de los campos creados en la tabla de la base de datos, se carga directamente desde ./Ocrend/Kernel/Generator/Templates/Twig/Resources/inputs.twig donde:
  • {{label}} es el nombre del campo con la primera letra en mayúscula.
  • {{{{type_input}}}} representa el tipo de input.
  • {{name}} representa el nombre del campo.
  • {{value}} representa el valor que debe tener ese campo, en la edición se cambia por la etiqueta twig correspondiente.