Presentación de Jerarquías con PHPrunner
En algunos de nuestros proyectos hemos hecho integración de aplicaciones como DotProject o Web2Project con desarrollos a medida realizados con PHPRunner.
Uno de los problemas que presenta la explotación de los datos (Proyectos y Tareas) es la presentación jerárquica de las Tareas tal y como las presentan estos productos.
Os facilito, para aquellos que no lo conozcan, que los criterios -muy lógicos- son:
- Las Tareas de 1º nivel primero. El resto de las tareas por dependencias entre ellas.
- Para aquellas que están al mismo nivel y dependencia, las que empiezan antes serán las primeras representadas.
Revisando los códigos con los que hacen la ordenación y dependencia de las Tareas observé que era código PHP y varias SQL de acceso a la B.D. MySQL.
También he revisado soluciones aplicables a B.D. como «hierarchy_connect_by_parent_eq_prior_id» y aunque es muy interesante no resolvía de forma completa y sobre todo, con bajo coste de los recursos de los sistemas, por lo que he creado una solución, que comparto con vosotros, para resolver este «problema».
La solución está basada en las funciones encontradas en Internet de:
Partimos de que el acceso a la información de Web2Project la hacemos a través de B.D. y que sólo vamos a hacer lecturas de los datos.
Conceptos y criterios que nos sirven para hacer la explotación.
- Se debe crear una nueva tabla -task_order- (o modificar la existente) para almacenar la nueva información de la jerarquía. Campos «Orden», «Level» y «Master», para disponer de esos datos por Tarea y podemos unir (JOIN) con los datos de Tarea -tasks-.
- Para no tener que actualizar esta tabla -task-order- cada vez que se vaya a utilizar en la presentación de los datos del proyecto se crea esta -project_last_updated- que mantiene la información de la última actualización de las Tareas del Proyecto. Esto se basa en que cuando Web2Project actualiza una Tarea actualiza el campo -task_updated-. Con este control se elimina el repetir obtener la ordenación de las Tareas cuando no han sufrido ningún cambio.
Hay que incluir el código siguiente en el evento de PHPRunner del LIST de la tabla TASK. Evento -BeforeQueryList-:
Posteriormente a la publicación de este artículo he visto que algunos de los usuarios de PHPRunner desean y tienen problemas en utilizar estos datos de tareas en la representación de un GANTT, en concreto JSGANTT.
Para ellos he hecho este ejemplo que pongo a su disposición.
Aspectos que hay que cuidar:
- Los formatos de fecha deben entregarse en el formato solicitado.
- Las Tareas que no tienen «Padre» se les debe indicar que el «Padre» es 0.
Se ha hecho una actualización del Javascript JSGantt para incluir internalización y ponerlo es español.
El producto JSGantt está en: https://github.com/jsGanttImproved/jsgantt-improved
Cualquier duda o problema, por favor, comunicármelo a través de email.
Problema presentado en PHPRunner 10.0
Este ejemplo no funcionaba en versión PHPRunner 10.0 porque cuando se ejecuta la página «list.php» también se está ejecutando la de «masterlist.php» que no tiene sentido, pero así lo hace, y en este momento no hay contexto para disponer de la clave del proyecto.
Así pues cuando se ejecuta este código «$keyMaster=$data[‘project_id’];» si el el valor es NULL no se ejecuta el código.
Se adjunta la versión del ejemplo en PHPRunner 10.0