X-Git-Url: https://git.llucax.com/mecon/ai.git/blobdiff_plain/aa4d3a72d7aac371a0b4f9e6d902cd2bd9ea8764..5d1175ef0a3555a5042a7ab07f0e67db544b4685:/lib/AI/Servicio.php?ds=sidebyside diff --git a/lib/AI/Servicio.php b/lib/AI/Servicio.php index e83bfd1..29f2070 100644 --- a/lib/AI/Servicio.php +++ b/lib/AI/Servicio.php @@ -1,5 +1,5 @@ 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. @@ -36,7 +57,7 @@ require_once 'AI/Error.php'; * @package AI * @access public */ -class AI_Servicio { +class AI_Servicio extends AI_DBTreeObject { /** * ID del servicio. * @@ -51,14 +72,6 @@ class AI_Servicio { */ var $servicio_padre = 0; - /** - * Servicios hijos. - * - * @var array $hijos - * @access protected - */ - var $_hijos = array(); - /** * Nombre del servicio. * @@ -68,7 +81,7 @@ class AI_Servicio { var $nombre = ''; /** - * Descripcin del servicio. + * Descripción del servicio. * * @var string $descripcion * @access public @@ -76,12 +89,12 @@ class AI_Servicio { var $descripcion = ''; /** - * ?ono del servicio. + * Ícono del servicio. * - * @var HTML_Imagen $icono + * @var string $icono * @access public */ - var $icono = null; + var $icono = ''; /** * Enlace a donde el este servicio. @@ -115,17 +128,6 @@ class AI_Servicio { */ var $habilitado = true; - /** - * Gets Hijos. - * - * @return array - * @access public - */ - function getHijos() - { - return $this->_hijos; - } - // ~X2C // +X2C Operation 465 @@ -137,51 +139,7 @@ class AI_Servicio { */ function AI_Servicio($servicio = 0) // ~X2C { - $this->servicio = $servicio; - } - // -X2C - - // +X2C Operation 457 - /** - * @param mixed $db Base de datos o Resultado a utilizar. - * - * @return PEAR_Error - * @access public - */ - function cargar($db) // ~X2C - { - $servicio = intval($this->servicio); - if (is_a($db, 'db_result')) { - $result = $db; - // Si no es un resultado, hago el query. - } else { - $result = $db->query( - "SELECT * - FROM servicio - WHERE servicio = $servicio" - ); - if (DB::isError($result)) { - return $result; - } - } - // Obtengo la fila. - $row = $result->fetchRow(DB_FETCHMODE_ASSOC); - if (!$row) { - return new AI_Error(AI_ERROR_NO_RESULTADOS, - "No hay más resultados en la DB [servicio=$servicio]"); - } - // Asigno valores al objeto. - extract($row); - $this->servicio = $servicio; - $this->servicio_padre = $servicio_padre; - $this->nombre = $nombre; - $this->descripcion = $descripcion; - $this->icono = $icono; # FIXME - new HTML_Icono (o no?) - $this->link = $link; - $this->link_ayuda = $link_ayuda; - $this->necesita_logueo = $necesita_logueo; - $this->habilitado = $habilitado; - return true; + parent::AI_DBTreeObject($servicio, AI_SERVICIO_CONFFILE); } // -X2C @@ -195,9 +153,7 @@ class AI_Servicio { */ function guardar($db, $nuevo = false) // ~X2C { - $servicio = intval($this->servicio); - $where = ''; - $datos = array( + $datos = array( 'servicio_padre' => intval($this->servicio_padre), 'nombre' => $this->nombre, 'descripcion' => $this->descripcion, @@ -207,90 +163,68 @@ class AI_Servicio { 'necesita_logueo' => $this->necesita_logueo ? 1 : 0, 'habilitado' => $this->habilitado ? 1 : 0, ); - if ($servicio and !$nuevo) { - $accion = DB_AUTOQUERY_UPDATE; - $where = "servicio = $servicio"; - } else { - $accion = DB_AUTOQUERY_INSERT; - // Si no tiene ID, le asigno uno nuevo. - if (!$servicio) { - $servicio = $db->nextId('servicio'); - if (DB::isError($servicio)) { - return $servicio; - } - $this->servicio = $servicio; - } - $datos['servicio'] = $servicio; - } - $res = $db->autoExecute('servicio', $datos, $accion, $where); - if (DB::isError($res)) { - return $res; + $err = parent::guardar($db, $datos, $nuevo); + if (PEAR::isError($err)) { + return $err; } - return true; } // -X2C - // +X2C Operation 456 + // +X2C Operation 539 /** - * @param DB $db DB de donde borrar. + * Carga hijos de un servicio. Si hubo error devuelve un PEAR_Error, si no hubo error, devuleve un array de objetos (los hijos). * - * @return PEAR_Error - * @access public - */ - function borrar($db) // ~X2C - { - $servicio = intval($this->servicio); - if ($servicio) { - $res = $db->query( - "DELETE FROM servicio WHERE servicio = $servicio"); - if (DB::isError($res)) { - return $res; - } - return true; - } - return PEAR::raiseError("No hay un servicio válido para borrar"); - } - // -X2C - - // +X2C Operation 463 - /** - * @param DB $db DB de donde cargar 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 PEAR_Error + * @return mixed * @access public */ - function cargarHijos($db) // ~X2C + function cargarHijos($db, $soloHabilitados = true, $orden = false) // ~X2C { - $servicio = intval($this->servicio); - $result = $db->query("SELECT * FROM servicio WHERE servicio_padre = $servicio"); - if (DB::isError($result)) { - return $result; - } - $this->_hijos = array(); - $hijo = new Servicio; - $err = $hijo->cargar($result); - while (!PEAR::isError($err)) { - $this->_hijos[] = $hijo->__clone(); - $err = $hijo->cargar($result); - } - // Si no hay mas resultados, entonces terminó bien. - if (AI_Error::isError($err) - and $err->getCode() == AIERROR_NO_RESULTADOS) { - return true; + 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); + } } - // Si no, se devuelve el error. - return $err; - } - // -X2C - - // +X2C Operation 501 - /** - * @return Servicio - * @access public - */ - function __clone() // ~X2C - { - return $this; + return parent::cargarHijos($db, $soloHabilitados, $orden); } // -X2C