]> git.llucax.com Git - mecon/ai.git/blobdiff - lib/AI/Servicio.php
Se cambian los die(expr) por trigger_error(expr, E_USER_ERROR) para poder interceptar...
[mecon/ai.git] / lib / AI / Servicio.php
index a6b4fec3d7935b07a395d737262d5c0604b4d7a1..eb39944200713f388a4ec4c973ef38e6b0033821 100644 (file)
 // $Id$
 //
 
-// +X2C includes
 require_once 'AI/DBTreeObject.php';
-// ~X2C
-//
 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.
  *
@@ -64,7 +77,7 @@ class AI_Servicio extends AI_DBTreeObject {
     var $nombre = '';
 
     /**
-     * Descripcin del servicio.
+     * Descripción del servicio.
      *
      * @var    string $descripcion
      * @access public
@@ -72,7 +85,7 @@ class AI_Servicio extends AI_DBTreeObject {
     var $descripcion = '';
 
     /**
-     * ?ono del servicio.
+     * Ícono del servicio.
      *
      * @var    string $icono
      * @access public
@@ -111,30 +124,34 @@ class AI_Servicio extends AI_DBTreeObject {
      */
     var $habilitado = true;
 
-    // ~X2C
+    /**
+     * Indica si debe abrirse en una ventana nueva.
+     *
+     * @var    bool $ventana_nueva
+     * @access public
+     */
+    var $ventana_nueva = false;
 
-    // +X2C Operation 465
     /**
      * @param  int $servicio ID del servicio.
      *
      * @return void
      * @access public
      */
-    function AI_Servicio($servicio = 0) // ~X2C
+    function AI_Servicio($servicio = 0)
     {
-        parent::AI_DBTreeObject($servicio, dirname(__FILE__) . '/Servicio.ini');
+        parent::AI_DBTreeObject($servicio, AI_SERVICIO_CONFFILE);
     }
-    // -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)
     {
         $datos = array(
             'servicio_padre'    => intval($this->servicio_padre),
@@ -145,16 +162,76 @@ class AI_Servicio extends AI_DBTreeObject {
             'link_ayuda'        => $this->link_ayuda,
             'necesita_logueo'   => $this->necesita_logueo ? 1 : 0,
             'habilitado'        => $this->habilitado ? 1 : 0,
+            'ventana_nueva'     => $this->ventana_nueva ? 1 : 0,
         );
         $err = parent::guardar($db, $datos, $nuevo);
         if (PEAR::isError($err)) {
             return $err;
         }
     }
-    // -X2C
-
 
+    /**
+     * 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)
+    {
+        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 Class :AI_Servicio
+}
 
 ?>
\ No newline at end of file