<?php
-// vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4:
+// vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
// +--------------------------------------------------------------------+
// | Ministerio de Economía |
// | AI (Administrador de Intranet) |
// $Id$
//
+require_once 'AI/DBTreeObject.php';
require_once 'AI/Error.php';
-// +X2C Class 413 :AI_Servicio
+/**
+ * Archivo de configuración.
+ */
+define('AI_SERVICIO_CONFFILE', dirname(__FILE__).'/Servicio.ini');
+
+/**
+ * Trae los servicios en un orden según la <em>longitud</em> de los hijos.
+ * La <em>longitud<em> 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);
+
/**
* Servicio.
*
* @package AI
* @access public
*/
-class AI_Servicio {
+class AI_Servicio extends AI_DBTreeObject {
/**
* ID del servicio.
*
*/
var $servicio_padre = 0;
- /**
- * Servicios hijos.
- *
- * @var array $hijos
- * @access protected
- */
- var $_hijos = array();
-
/**
* Nombre del servicio.
*
var $nombre = '';
/**
- * Descripcin del servicio.
+ * Descripción del servicio.
*
* @var string $descripcion
* @access public
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.
var $habilitado = true;
/**
- * Gets Hijos.
+ * Indica si debe abrirse en una ventana nueva.
*
- * @return array
+ * @var bool $ventana_nueva
* @access public
*/
- function getHijos()
- {
- return $this->_hijos;
- }
+ var $ventana_nueva = false;
- // ~X2C
-
- // +X2C Operation 465
/**
* @param int $servicio ID del servicio.
*
* @return void
* @access public
*/
- function AI_Servicio($servicio = 0) // ~X2C
+ function AI_Servicio($servicio = 0)
{
- $this->servicio = $servicio;
+ parent::AI_DBTreeObject($servicio, AI_SERVICIO_CONFFILE);
}
- // -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;
- }
- // -X2C
-
- // +X2C Operation 458
/**
* @param DB $db DB donde guardar.
- * @param bool $nuevo Si es true, se fuerza a guardar el Servicio como nuevo.
+ * @param bool $nuevo Si es true, se fuerza a guardar el Servicio como
+ * nuevo.
*
* @return PEAR_Error
* @access public
*/
- function guardar($db, $nuevo = false) // ~X2C
+ function guardar($db, $nuevo = false)
{
- $servicio = intval($this->servicio);
- $where = '';
- $datos = array(
+ $datos = array(
'servicio_padre' => intval($this->servicio_padre),
'nombre' => $this->nombre,
'descripcion' => $this->descripcion,
'link_ayuda' => $this->link_ayuda,
'necesita_logueo' => $this->necesita_logueo ? 1 : 0,
'habilitado' => $this->habilitado ? 1 : 0,
+ 'ventana_nueva' => $this->ventana_nueva ? 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
/**
- * @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)
{
- $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
-} // -X2C Class :AI_Servicio
+}
?>
\ No newline at end of file