]> git.llucax.com Git - mecon/ai.git/blobdiff - lib/AI/Servicio.php
Cambios cortesía de gmeray:
[mecon/ai.git] / lib / AI / Servicio.php
index b03c5a2c3a7a098225353ae261ff650f0c7a71f8..29f20703f5f6f3b4129e99c3c3a43c0a562d3bc0 100644 (file)
@@ -1,5 +1,5 @@
 <?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$
 //
 
+// +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 <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);
+
 // +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,93 +163,71 @@ 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
 
 } // -X2C Class :AI_Servicio
 
-?>
+?>
\ No newline at end of file