domingo, 22 de diciembre de 2013

Nueva versión

Hola amigos.

Hace mucho tiempo que no escribo una entrada, pero les comento que tengo una nueva versión que es funcional y sobre la cual construí todo un sistema de trazabilidad de producción de café.

Le agregue varias cosas al framework, espero lo puedan usar. No he trabajado mucho en la documentación, no me queda mucho tiempo para dedicarle.

Bueno, revísenlo y déjenme sus comentarios.

Saludos!

https://github.com/anwarHN/VelkanPHPFramework/

martes, 9 de julio de 2013

Primera versión

Hola de nuevo.

Hace tiempo que no hago una entrada, les cuento que ya tengo una primera versión con la que voy a empezar a desarrollar un ERP.

Voy a subirla a GitHub por si la quieren probar.

Por los momentos no he hecho documentación, pero tiene varios ejemplos que pueden servir para una evaluación.

Si alguno lo prueba, por favor hágamelo saber y deme sus comentarios, se los voy a agradecer.

Saludos.

https://github.com/anwarHN/VelkanPHPFramework

viernes, 10 de mayo de 2013

Controles

Hola de nuevo.

He estado trabajando en los controles, haciendo un par de ajustes y creando controles nuevos. Funcionalmente ya tengo los input, datepicker, textarea, checkbox y radio button. Esos controles básicos suplirán cualquier necesidad.

Ahora estoy creando un control que he denominado lookup. El lookup sera un input con un boton añadido que me levantará una ventana modal para hacer busquedas en la base de datos. Bastará con definir que taba, que campos y que filtros tendrá y hará todo el trabajo por nosotros.

Por otro lado estoy trabajando en algo que he denominado funciones en cache. En realidad es guardar funciones o comandos PHP en una variable de sesión para despues ejecutarlas mediante AJAX sin que el desarrollador tenga que volver a escribirlas. ¿En que me va a ayudar? Me ayudará por ejemplo en los combobox o select que se actualizan en cascada (el típico ejemplo de pais, provincia, ciudad), o en los mismos lookup que estoy haciendo para que la búsqueda en la base de datos desde los filtros no tenga que especificarse en una funcion o que el desarrollador tenga que escribir el código para generar los objetos y aparte el código para los callback desde AJAX. Quedará muy bien.

jueves, 18 de abril de 2013

El grid - parte 2

Hola de nuevo.

He seguido trabajando en el grid, pero por el momento llegaré hasta la la parte de los filtros, el ordenamiento de datos, celdas tipo link, y tipo barra de progreso. Quedo muy bien y fácil de usar. Se le puede especificar si se requiere que sea cargada mediante Ajax, o mediante la forma tradicional de parámetros por el método get.

El código para utilizar el grid queda como el siguiente:

class indexModel extends model{
 public $dataGrid;
 
 function getDataGrid($args=array()){
  /*Extraemos los argumentos en variables*/
  extract($args);
  /*Si el argumento $page no viene declarado, dejamos por defecto que página a mostrar sea la primera*/
  if(!isset($page)){
   $page=1;
  }
  
  /*Declaramos el tipo del objeto*/
  $this->dataGrid=new datagrid(array("id"=>"prueba","title"=>"Prueba de grid"));
  
  /*Seteamos si permitiremos filtros o no en las columnas*/
  $this->dataGrid->allowFilters(true);
  
  /*Seteamos si el grid sera llenado por Ajax. 
   * Esto ejecutará una funcion dentro del modelo que se debe declarar y cuyo nombre
   * debe ser el id que se definió anteriormente mas las palabras 'DataGridCallback'*/
  $this->dataGrid->allowAjaxCall(true);
  
  /*Setea los campos del grid*/
  $this->dataGrid->setFields("id,txt_desc,fecha,numero,porcentaje");
  /*Setea los tipos de cada campo en el orden que se declararon anteriormente*/
  $this->dataGrid->setTypes("number,string,date,number,progressbar");
  /*Vinculoa una accion a una de las columnas, en este caso un hipervinculo*/
  $this->dataGrid->bindFieldTypeParameter("id", "link", "?c=admin/dhdh&other=#fecha#&other2=#porcentaje#");
  /*Setea que el grid debe buscar los datos en la base de datos*/
  $this->dataGrid->getFromTable("grid_test",$page,"","ID, Nombre, Fecha, Número,Porcentaje",$filter,$order);
 }
 
 /*Funcion que se ejecutará cuando haya un llamado Ajax*/
 function pruebaDataGridCallback($args=array()){
  extract($args);
  /*Declaramos el tipo del objeto*/
  $dataGrid=new datagrid(array("id"=>"prueba"));
  /*Obtenemos los datos. El objeto detectará que el llamado actual es un llamado Ajax, y devolverá sólamente los datos,
   * sin el resto del código DOM*/
  $dataGrid->getFromTable("grid_test",$page,"","ID, Nombre, Fecha, Número,Porcentaje",$filter,$order);
 }
}
Lo que nos renderiza es algo como esto:
Un grid sencillo, fácil de usar.

Por el momento hasta aquí llegaré con el grid, ahora debo seguir con otros controles como los radio button, los checkbox y voy a hacer un objeto para subir archivos que será super fácil de usar. Hasta pronto.

sábado, 9 de marzo de 2013

Quieres verlo?

Pruebalo aqui: http://173.201.99.154/velkan/

Te parecerá poco, pero llegar a esto me ha llevado un buen tiempo. Claro que cuando alguien utilice el framework, hacer estas sencillas páginas, sera cuestión de minutos.

Si te gusta lo que ves, deja tus comentarios.

El grid

Hola de nuevo.

He estado trabajando en el grid. Como sabrán hay muchos grid para PHP, uno de los mejores es phpGrid, pero decidí hacer uno propio, y me esta quedando muy bien.

A este grid se le puede definir si funcionará enviando parámetros a través de método GET o se le podrán hacer recargas de información por medio de AJAX. Por el momento sólo tengo la paginación y el re-ordenamiento de los datos, se ve así:

Sigo ahora con la parte de filtrado y re-dimensionamiento de las columnas. Después trabajare en la parte de crear, modificar o eliminar registros, y por último en la funcionalidad de definir los tipos de datos de cada columnas y que se puedan hacer links, o tal vez lo haga de primero, no lo se aun.

domingo, 3 de marzo de 2013

Pequeño descanso, necesito evidenciar mis avances

He avanzado mucho estos últimos días. Por los momentos no he subido mi primer version a gitHub, pero estoy cerca de hacerlo.

Me preocupa que tengo que hacer documentacion, que es lo que menos nos gusta a los desarrolladores de software, pero para que pueda ser utilizado por otros, tendré que hacerlo.

Por los momentos quiero que vean como esta quedando.

¿Que tengo hecho?

Modelo Vista Controlador (MVC):

Velkan funciona en base al MVC. En un principio intenté hacerlo de otra forma, si utilizar este método, pero una vez que entendí bien de que trataba, no pude pensar en otra forma de hacerlo.

Control de sesiones y control de usuario

Los datos de las sesiones se guardan en archivos encriptados. El manejo de la información del usuario también se hará encriptada. Cada vez que cerremos sesion, Velkan generará un nuevo id, no permitirá que sigas navegando con el mismo id anterior.

Ajax

Velkan permite hacer llamados Ajax. Por el momento tengo algo muy básico, pero lo mejoraré dentro de poco.

Validaciones con jquery.validate plugin

Con una simple funcion se pueden definir las validaciones de los campos. En las vistas se pueden definir varios formularios, y las reglas se definen por cada formulario.

Aqui les muestro unas imágenes de como esta quedando:

Este es un pequeño vistazo de lo que llevo del proyecto:



Esta es una muestra de como se ve la interfaz con el bootstrap por defecto:
Aquí unas imágenes del código:

La vista del formulario login:

El modelo del formulario login:
Y su controlador:
Y ahí voy. Espero les llame la atención.

Bueno, como decimos en mi país: a seguir chambeando!

sábado, 2 de marzo de 2013

Ejecuciones Ajax



Hola de nuevo.

Velkan cada vez tiene más controles. Actualmente estoy desarrollando las ejecuciones ajax. Tengo por ejemplo una ejecución que vendrá por defecto que verificará el tiempo de vida de una sesión de usuario. Dependerá del diseño de la aplicación web si queremos incorporarla en todas las páginas o no y se podrá acceder a ella desde el archivo de configuración del framework.

La ejecución Ajax será muy sencilla. Tendré un ruteador que determinará si el llamado es desde Ajax y ejecutará la función específica en el archivo modelo.

En síntesis: se deberán definir las funciones ajax en el archivo modelo de cada controlador. Por el momento, se deben declarar en una variable que funciones del archivo modelo podrán ser ejecutadas por medio de Ajax, pero intentaré que pueda ser automático (lo veo medio difícil, pero bueno...). Al momento de renderizar la vista, Velkan declarará las funciones y los eventos a ejecutar. Esto permitirá al desarrollador acelerar los procesos de desarrollo porque no tendrá que escribir código JavaScript. Espero que quede bien.

Manejo de información del usuario

He terminado algo que me tenía preocupado: el manejo de las sesiones de usuario. Velkan tendrá un manejo automático de sesiones, pero la parte de las sesiones de usuarios la manejará por aparte. En Velkan, se recomendará no utilizar variables de sesión cuando hay usuarios logeados, sino la clase user, que será una clase estática que tendrá métodos para guardar y obtener información del usuario.

Si alguien hiciera un ataque a los sitios a nivel de sesión, se llevará la sorpresa que nada de la información del usuario estará en la variable de sesión, todo se manejará en archivos encriptados, lejos de los headers que se tramitan entre los navegadores y los servidores. Con el tiempo espero mejorar esta parte, para hacer los sitios que se construyan con Velkan de los más seguros.

jueves, 14 de febrero de 2013

MVC - Tango Down, ahora sesiones, usuarios y base de datos

Listo. El esquema Model-View-Controler está terminado. Todo este tiempo lo estuve mejorando, y la base está terminada.

Estoy utilizando clases estáticas para acceder a ciertos métodos de forma global, pero también estoy implementando el modelo Singleton (aquí una explicación del modelo) para el acceso global a variables y métodos sin necesidad de instanciar varios objetos.

He trabajado también en tres aspectos: el manejo de sesiones, el manejo de la información del usuario y el acceso a la base de datos.

En el manejo de las sesiones tiene dos capas: la capa normal que identifica el usuario que tiene abierta una sesión, y la capa del almacenamiento de las variables que se guardará en un archivo encriptado y que no será el mismo de la sesión. Esto proporciona mayor seguridad en el tema de robo de sesión. Me falta aun  mejorar un poco esta parte para lograr que los sitios que se construyan con Velkan sean lo más seguros posibles.

El manejo de la información del usuario también será a través de archivos encriptados. Estos no se guardarán en la información de la sesión. Si alguien roba la información de la sesión, pero todos  los datos del usuario están en otro archivo, no tendrá con que credenciales trabajar en el sistema.

El manejo de la base de datos se hace por medio de un adaptador. En los modelos no se hará instancia a funciones específicas de MySql, sino a funciones del manejador del adaptador. De esa forma, si se quisiera crear un adaptador para SQL Server, u Oracle y se quiera migrar una aplicación a otra base de datos, será fácil.

Por último, cree una cuenta en gitHub, pronto subiré mi primer version funcional.

domingo, 27 de enero de 2013

Ya va dando forma

He logrado construir la base del MVC. Ahora Velkan puede funcionar con clases controladores y renderizar vistas. También ya puede manejar errores en páginas predefinidas y puede manejar una vista base del sitio que sirve como layout.

Lo siguiente es trabajar en el modelo, la parte lógica y que vinculara a la vista con la base de datos.

Deberá de ser sencillo, tendré una clase que me permita manejar objetos de la base de datos, y crearé un controlador sencillo también para MySql, que podrá ser fácilmente substituible por otro controlador para otra base de datos.

Para el objeto de base de datos pensé en algo que me permitiera sólo llamar a una tabla y que esta clase me determine los campos, pero para eso tendría que hacer un query, y ya en un sistema de varios usuarios no lo considero funcional porque sería una llama extra a la base de datos.

Voy a abrir una cuenta en gitHub cuando tenga mi primer versión con la parte del modelo terminada y con los controladores form, input y combobox.

Otros framework que he visto piden en primera instancia generar la aplicación desde la línea de comandos. Se crean todas las carpetas necesarias, pero si alguien quiere modificar el framework se vuelve un tanto más complicado. En el caso de Velkan bastará con copiar los archivos, y si se requiere mejorar la funcionalidad por algo más avanzado, será súper sencillo.

¿Y la seguridad?

He leído de cual es la mejor forma de mantener la seguridad en los sitios web, mejor dicho, me estoy enfocando en el manejo de sesiones. Para esto voy a construir una clase que me permita mantener la sesión por tres medios: cookies, tokens y por medio de la variable de sesión.

El tema con esto es quitarle esa preocupación al programador de como manejar sus sesiones, y de nuevo, hacerlo lo más simple posible.

Velkan determinara si los tres medios pueden usarse al mismo tiempo, por lo menos se que dos si (los tokens y las variables de sesión). Si el usuario navegador del sitio no tiene activadas las cookies, diremos que Velkan está en un nivel de seguridad 2. Si el programador decide sólo utilizar las variables de sesión diremos que Velkan está en un nivel de seguridad 1. Si los tres métodos son accesibles, tendremos nivel de seguridad 3.

Veremos como queda.

jueves, 24 de enero de 2013

Model-View-Controller

He avanzado en el trato de los input y el form, pero estoy haciendo una pausa. Voy a implementar el esquema Modelo-Vista-Controlador (MVC).

El MVC es utilizado por frameworks como Yii y Zend. Al principio no entendía como funcionaba, pero viendo como funciona Yii en estos videos logre entender que es una separación de las capas de negocio, procesamiento y presentación al usuario.

Para empezar me base el estos videos, donde se construye un MVC simple, pero que a mi parecer lo suficiente para comenzar.

Velkan manejara las típicas tres carpetas: models (donde estarán los procesos de base de datos), views (donde estarán los códigos HTML) y controllers (donde estarán las clases con sus respectivas acciones).

Tendrá una clase ruteadora que a través de otra clase (request) definirá que controlador cargar, este a su vez, dependiendo de que acción deba ejecutar, renderizara las vistas.

Aquí se complica un poco al seguir desarrollando el framework, pero seguiré manteniendo la línea de que sea lo más simple para el programador que lo utilice.

lunes, 21 de enero de 2013

El form y el control input

Actualmente estoy trabajando en el control form y el control input solamente.

Centrandome en el control input, y viendo ciertas funciones de Bootstrap (aunque por el momento no todas), puedo generar formularios con el siguiente código:


<?php

include_once "velkan.php";

$velkan=new velkan(array("level"=>"",
                         "title"=>"Form e input"));

$input=new velkan_input(array("id"=>"id_1",
                              "name"=>"name_1",
                              "label"=>"Prueba 1:",
                              "placeholder"=>"Prueba de input"));

$input2=new velkan_input(array("id"=>"id_2",
                               "name"=>"name_2",
                               "label"=>"Prueba 2:",
                               "placeholder"=>"Prueba de input 2"));

$input2->set_append("00");

$input3=new velkan_input(array("id"=>"id_3",
"name"=>"name_3",
"label"=>"Prueba 3:",
"placeholder"=>"Prueba de input 3"));

$input3->set_prepend("@");

$form=new velkan_form(array("id"=>"forma",
                            "action"=>"#",
                            "method"=>"post"));

$form->add_obj("<legend>Prueba de input</legend>");
$form->add_obj($input);
$form->add_obj($input2);
$form->add_obj($input3);

$form->set_type(velkan_form::$FORM_TYPE_HORIZONTAL);

$velkan->add_obj($form);
$velkan->render();
unset($velkan);
?>
Parece mucho código, pero la ventaja será que estos componentes tendrán funciones y demás ya de forma predefinida.

Esto me generará el siguiente formulario:

Teniendo esto puedo hacer muchas cosas, como agregarle funciones javascript a cada input.

sábado, 19 de enero de 2013

Primeros pasos...

Como podrán imaginar, ya tengo algo desarrollado, lo estoy probando aún, y me faltan bastantes controles, pero voy avanzando. Hasta el momento, lo que he desarrollado me gusta.

Comencé por desarrollar un modulo principal que pudiera ir almacenando objetos y renderizarlos en el orden en que se agregan.

Lo llame velkan.php.

Esta clase se encargaría de ir agregando cada objeto. Tendría funciones generales que compartiría con las demás clases.

Parte del objetivo de este proyecto es tener controles que hagan las validaciones de formato, validaciones en formas en campos requeridos y similares. Otro objetivo era hacer combobox dependientes de manera sencilla. Era un obstáculo a superar, pero lo hice.

En un principio, cuando hice los primeros pasos, fue fácil. Cree primero el objeto form, y después el objeto input. Hice una prueba agregando a cada objeto la funcion render(), haciendo que el objeto form buscara en un arreglo todo objeto que tuviera el metodo render(), y lo ejecutaba, de la siguiente forma:


foreach ($this->objs as $obj){

if(method_exists($obj, "render")){

$render.=$obj->render();

}else{

$render.=$obj;

}

}

return $render;


De esta forma es sencillo ir agregando objetos y renderizarlos despues.

La primer prueba fue exitosa. La forma de generar un formulario quedo de la siguiente forma:

<?php

include_once 'velkan.php';



$velkan=new velkan(array("level"=>"","title"=>"Prueba"));



$form=new velkan_form();

$form->add_obj(new velkan_input(array("name"=>"prueba_input","label"=>"Prueba input")));

$velkan->add_obj($form);



$velkan->render();

?>


Esto generará el formulario siguiente:

Con el código siguiente:


<!DOCTYPE html>
<html>
<head>
<meta name="application-name" content="Saicom">
<meta name="author" content="Anwar Garcia">
<meta name="generator" content="Menos Codigo">
<link rel="stylesheet" type="text/css" href="lib/bootstrap/css/bootstrap.min.css" />
<script src="lib/jquery/jquery-1.8.3.min.js"></script>
<script src="lib/jquery/jquery.validate.js"></script>
<script src="lib/bootstrap/js/bootstrap.js"></script>
<script src="lib/js/general.js"></script>
<title>Prueba</title>
<script>$(document).ready(function(){$("#__MCFORM__1d67").validate();});</script>
</head>
<body>
<form name="__MCFORM__1d67" id="__MCFORM__1d67" class=" form-inline">
<label for="1077">Prueba input</label>
<input type="text" id="1077" name="prueba_input" class=" input-medium">
</form>
</body>
</html>


Fácil. Todo lo que hice fue crear tres clases, agregarle arrays para guardar objetos, y una función que devuelve strings para finalmente imprimirlos en pantalla. Otra vez, fácil.

Lo otro es que decidí pasar todo parámetro por arrays, casi todo objeto en su método __construct recibirá un array de parámetros. Aparte, tendrán sus respectivos métodos get y set de las distintas propiedades, por si se requieren funciones un poco más avanzadas, y para declarar variables he irles definiendo sus propiedades.

¿Qué hay del CSS y JavaScript?


No hay que inventar el agua caliente, aunque tal vez lo estoy haciendo con este framework. Para CSS voy a usar Bootstrap, y para JavaScript por supuesto que voy a utilizar jQuery, nada mas. Los controles fácilmente podrán llevar funciones de javascript, y también voy a usar el plugin validate para la validación de las formas, solo que Velkan lo hará más sencillo.

¿Ajax? por su puesto. Pensé mucho como debía de funcionar Ajax. Y decidí que se iban a poder declarar funciones en el PHP para que el Ajax después sólo ejecutara esas funciones, sera interesante. Sera como programar por eventos en VB.

¿Plantillas?

Yes. Podremos crear plantillas para no tener que hacer copiar y pegar cada vez. También tendrá dos archivos de configuración  uno donde le decimos varias cosas como los archivos CSS y JS que deba cargar en cada página, y otro donde definimos los mensajes de error y textos en los botones.

Va a quedar muy bien.

Historia de Velkan PHP

Por mucho tiempo he buscado una forma fácil de programar, pero que a la vez no me limite, que me permita hacer lo mismo que haría si lo hiciera parte por parte.

He visto como trabajan muchos Frameworks para PHP, y la verdad es que se ha llegado a un nivel bastante complejo.

Para aprender, debemos entender muchas cosas, no es fácil, aunque se proclame así. Para fabricar algo hay que instalar muchas cosas, y para muchos, que lo que pretenden hacer es poco, resulta demasiado.

He empezado a hacer mi propio Framework. Le he llamado Velkan, que significa perro valiente. Por supuesto que no pienso competir con muchas compañías que han fabricado grandes cosas, ni mucho menos revelarme de alguna forma. Lo único que pretendo es ofrecer algo sencillo, fácil de usar, y una vez que termine construiré un sitio utilizándolo.

Si te interesa, sígueme, valdrá la pena.