X-Git-Url: https://git.llucax.com/mecon/ai.git/blobdiff_plain/df9d0deaca85d998cd966a75db730202e0f7c993..beb4f27c0f38e10c639f5ec2000a0ac57719221c:/lib/AI/Servicio.php diff --git a/lib/AI/Servicio.php b/lib/AI/Servicio.php index a6b4fec..29f2070 100644 --- a/lib/AI/Servicio.php +++ b/lib/AI/Servicio.php @@ -30,9 +30,26 @@ // +X2C includes require_once 'AI/DBTreeObject.php'; // ~X2C -// + require_once 'AI/Error.php'; +/** + * Archivo de configuración. + */ +define('AI_SERVICIO_CONFFILE', dirname(__FILE__).'/Servicio.ini'); + +/** + * Trae los servicios en un orden según la longitud de los hijos. + * La longitud de los hijos se calcula prediciendo la cantidad de + * renglones que va a ocupar cada hijo y sumándolos para un mismo padre. + */ +define('AI_SERVICIO_ORDEN_LONG_HIJOS', 1); + +/** + * Trae los servicios en un orden según la longitud del nombre. + */ +define('AI_SERVICIO_ORDEN_LONG_NOMBRE', 2); + // +X2C Class 413 :AI_Servicio /** * Servicio. @@ -64,7 +81,7 @@ class AI_Servicio extends AI_DBTreeObject { var $nombre = ''; /** - * Descripcin del servicio. + * Descripción del servicio. * * @var string $descripcion * @access public @@ -72,7 +89,7 @@ class AI_Servicio extends AI_DBTreeObject { var $descripcion = ''; /** - * ?ono del servicio. + * Ícono del servicio. * * @var string $icono * @access public @@ -122,7 +139,7 @@ class AI_Servicio extends AI_DBTreeObject { */ function AI_Servicio($servicio = 0) // ~X2C { - parent::AI_DBTreeObject($servicio, dirname(__FILE__) . '/Servicio.ini'); + parent::AI_DBTreeObject($servicio, AI_SERVICIO_CONFFILE); } // -X2C @@ -153,7 +170,63 @@ class AI_Servicio extends AI_DBTreeObject { } // -X2C - + // +X2C Operation 539 + /** + * Carga hijos de un servicio. Si hubo error devuelve un PEAR_Error, si no hubo error, devuleve un array de objetos (los hijos). + * + * @param mixed $db Base de datos o resultado a usar. + * @param bool $soloHabilitados Si es true, sólo trae los servicios habilitados. + * @param mixed $orden Indica el orden en que se deben traer los hijos. Puede ser AI_SERVICIO_ORDEN_CANT_HIJOS, AI_SERVICIO_ORDEN_LONG_NOMBRE o un campo arbitrario. + * + * @return mixed + * @access public + */ + function cargarHijos($db, $soloHabilitados = true, $orden = false) // ~X2C + { + if (!is_a($db, 'db_result')) { + if (is_int($orden)) { + $id_field = $this->conf['id']; + $id_padre = $this->conf['padre']; + $id = intval($this->$id_field); + if ($orden === AI_SERVICIO_ORDEN_LONG_HIJOS) { + $query = " + SELECT + A.*, + count(1) as COUNT, + SUM(CEIL(LENGTH(B.nombre) / 22)) as RENGLONES + FROM {$this->conf['base']}.{$this->conf['tabla']} AS A, + {$this->conf['base']}.{$this->conf['tabla']} AS B + WHERE A.$id_field = B.$id_padre + AND A.$id_padre = $id"; + if ($soloHabilitados) { + $query .= " AND A.{$this->conf['habilitado']} = 1"; + } + $query .= " + GROUP BY A.$id_field + ORDER BY RENGLONES DESC, COUNT DESC, A.nombre"; + } elseif ($orden === AI_SERVICIO_ORDEN_LONG_NOMBRE) { + $query = " + SELECT * + FROM {$this->conf['base']}.{$this->conf['tabla']} + WHERE $id_padre = $id"; + if ($soloHabilitados) { + $query .= ' AND ' . $this->conf['habilitado'] . ' = 1'; + } + $query .= ' ORDER BY LENGTH(nombre)'; + } else { + return new AI_Error(AI_ERROR_ORDEN_INVALIDO, + "Tipo de órden incorrecto [orden=$orden]"); + } + $result = $db->query($query); + if (DB::isError($result)) { + return $result; + } + return parent::cargarHijos($result, $soloHabilitados, $orden); + } + } + return parent::cargarHijos($db, $soloHabilitados, $orden); + } + // -X2C } // -X2C Class :AI_Servicio