]> git.llucax.com Git - mecon/ai.git/commitdiff
- Se agrega un método estático AI_Error::isError() para saber si algo es un
authorLeandro Lucarella <llucax@gmail.com>
Mon, 21 Jul 2003 19:25:02 +0000 (19:25 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Mon, 21 Jul 2003 19:25:02 +0000 (19:25 +0000)
  error.
- Se verifica si un objeto tiene hijos antes de borrarlo e impidiendo que
  se lo borre con un mensaje de error en ese caso.
- Se actualiza la TODO list.

TODO
doc/uml.xmi
lib/AI/DBTreeObject.php
lib/AI/Error.php
lib/AI/Sistema.php
sistema/www/index.php

diff --git a/TODO b/TODO
index 9fc3e85824666e0974559680ee1cd6de3e2ef847..5527c3f542ab8daf3f4c2fe4e204a6b3b3b40701 100644 (file)
--- a/TODO
+++ b/TODO
@@ -4,9 +4,6 @@ $Id$
   con un nombre más apropiado.
 - Ordenar todo mejor (index.php no da más).
 - No crear una DB on-the-fly en Form.php.
-- Ver que se hace con los hijos cuando se borra un elemento. Opciones:
-    * Borrar todos los hijos.
-    * Mover los hijos al padre del elemento a borrar (recomendado).
 - Agregar links para agregar un elemento nuevo sin tener que tocar en el
   ícono de la sección que es poco intuitivo.
 - Ver que se hace con sistemas borrados de SAMURAI con baja lógica.
index 6597776830c0c2d4e5d425d593a49e86d0bf94ad..ee2eb86667f8b95399f035d816c64a3f65cf3f7e 100644 (file)
@@ -9,7 +9,7 @@
   <XMI.metamodel xmi.name="UML" href="UML.xml" xmi.version="1.3" />
  </XMI.header>
  <XMI.content>
-  <docsettings viewid="412" documentation="" uniqueid="528" />
+  <docsettings viewid="412" documentation="" uniqueid="530" />
   <umlobjects>
    <UML:Class stereotype="" package="AI" xmi.id="413" abstract="0" documentation="Servicio." name="AI_Servicio" static="0" scope="200" >
     <UML:Operation stereotype="" package="" xmi.id="465" type="void" abstract="0" documentation="" name="AI_Servicio" static="0" scope="200" >
@@ -56,6 +56,9 @@ FIXME - preguntar a gonzalo si le sirve." name="nombre" static="0" scope="200" /
      <UML:Parameter stereotype="" package="" xmi.id="1" value="" type="int" abstract="0" documentation="Código de error." name="codigo" static="0" scope="200" />
      <UML:Parameter stereotype="" package="" xmi.id="2" value="''" type="string" abstract="0" documentation="Mensaje para mostrar" name="mensaje" static="0" scope="200" />
     </UML:Operation>
+    <UML:Operation stereotype="" package="" xmi.id="530" type="bool" abstract="0" documentation="" name="isError" static="1" scope="200" >
+     <UML:Parameter stereotype="" package="" xmi.id="1" value="" type="mixed" abstract="0" documentation="Variable a evaluar si es un error." name="error" static="0" scope="200" />
+    </UML:Operation>
    </UML:Class>
    <UML:Class stereotype="" package="" xmi.id="471" abstract="0" documentation="x2c:extern
 x2c:include: PEAR.php" name="PEAR_Error" static="0" scope="200" />
@@ -130,6 +133,9 @@ x2c:include: PEAR.php" name="PEAR_Error" static="0" scope="200" />
     <UML:Operation stereotype="" package="" xmi.id="527" type="PEAR_Error" abstract="0" documentation="" name="cargarHijos" static="0" scope="200" >
      <UML:Parameter stereotype="" package="" xmi.id="1" value="" type="mixed" abstract="0" documentation="Base de datos o resultado de donde cargar los hijos." name="db" static="0" scope="200" />
     </UML:Operation>
+    <UML:Operation stereotype="" package="" xmi.id="529" type="PEAR_Error" abstract="0" documentation="Borra el objeto de la base de datos verificando que no tenga hijos." name="borrar" static="0" scope="200" >
+     <UML:Parameter stereotype="" package="" xmi.id="1" value="" type="DB" abstract="0" documentation="Base de datos de la cual borrar el objeto." name="db" static="0" scope="200" />
+    </UML:Operation>
     <UML:Attribute stereotype="" package="" xmi.id="525" value="array()" type="array" abstract="0" documentation="Grupos de secciones que tiene este grupo.
 x2c:get" name="hijos" static="0" scope="202" />
    </UML:Class>
@@ -137,60 +143,60 @@ x2c:get" name="hijos" static="0" scope="202" />
   <diagrams>
    <diagram snapgrid="0" showattsig="1" fillcolor="#ffffc0" showgrid="1" showopsig="1" usefillcolor="1" snapx="10" snapy="10" showatts="1" xmi.id="412" documentation="" type="402" showops="1" showpackage="0" name="Clases" localid="30000" showstereotype="0" showscope="1" font="Helvetica,8,-1,5,50,0,0,0,0,0" linecolor="#ff0000" >
     <widgets>
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="170" showattsigs="601" usesdiagramusefillcolour="0" x="278" linecolour="#ff0000" y="324" showopsigs="600" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="168" usefillcolor="1" showattributes="1" xmi.id="413" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="287" showattsigs="601" usesdiagramusefillcolour="0" x="31" linecolour="#ff0000" y="165" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="154" usefillcolor="1" showattributes="1" xmi.id="416" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="262" showattsigs="601" usesdiagramusefillcolour="0" x="421" linecolour="#ff0000" y="557" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="35" usefillcolor="1" showattributes="1" xmi.id="469" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="73" showattsigs="601" usesdiagramusefillcolour="0" x="516" linecolour="#ff0000" y="501" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#dcdcdc" height="24" usefillcolor="1" showattributes="0" xmi.id="471" showoperations="0" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="277" showattsigs="601" usesdiagramusefillcolour="0" x="461" linecolour="#ff0000" y="310" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="182" usefillcolor="1" showattributes="1" xmi.id="486" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="192" showattsigs="601" usesdiagramusefillcolour="0" x="64" linecolour="#ff0000" y="393" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="49" usefillcolor="1" showattributes="1" xmi.id="503" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="46" showattsigs="601" usesdiagramusefillcolour="0" x="137" linecolour="#ff0000" y="330" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#dcdcdc" height="24" usefillcolor="1" showattributes="0" xmi.id="504" showoperations="0" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="271" showattsigs="601" usesdiagramusefillcolour="0" x="27" linecolour="#ff0000" y="543" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="49" usefillcolor="1" showattributes="1" xmi.id="507" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="146" showattsigs="601" usesdiagramusefillcolour="0" x="89" linecolour="#ff0000" y="468" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#dcdcdc" height="24" usefillcolor="1" showattributes="0" xmi.id="508" showoperations="0" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="346" showattsigs="601" usesdiagramusefillcolour="0" x="157" linecolour="#ff0000" y="31" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="98" usefillcolor="1" showattributes="1" xmi.id="516" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
-     <UML:ConceptWidget usesdiagramfillcolour="0" width="297" showattsigs="601" usesdiagramusefillcolour="0" x="326" linecolour="#ff0000" y="165" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="56" usefillcolor="1" showattributes="1" xmi.id="524" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="170" showattsigs="601" usesdiagramusefillcolour="0" x="267" linecolour="#ff0000" y="310" showopsigs="600" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="168" usefillcolor="1" showattributes="1" xmi.id="413" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="287" showattsigs="601" usesdiagramusefillcolour="0" x="20" linecolour="#ff0000" y="151" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="154" usefillcolor="1" showattributes="1" xmi.id="416" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="262" showattsigs="601" usesdiagramusefillcolour="0" x="410" linecolour="#ff0000" y="543" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="49" usefillcolor="1" showattributes="1" xmi.id="469" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="73" showattsigs="601" usesdiagramusefillcolour="0" x="505" linecolour="#ff0000" y="487" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#dcdcdc" height="24" usefillcolor="1" showattributes="0" xmi.id="471" showoperations="0" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="277" showattsigs="601" usesdiagramusefillcolour="0" x="450" linecolour="#ff0000" y="296" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="182" usefillcolor="1" showattributes="1" xmi.id="486" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="192" showattsigs="601" usesdiagramusefillcolour="0" x="53" linecolour="#ff0000" y="379" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="49" usefillcolor="1" showattributes="1" xmi.id="503" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="46" showattsigs="601" usesdiagramusefillcolour="0" x="126" linecolour="#ff0000" y="316" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#dcdcdc" height="24" usefillcolor="1" showattributes="0" xmi.id="504" showoperations="0" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="271" showattsigs="601" usesdiagramusefillcolour="0" x="16" linecolour="#ff0000" y="529" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="49" usefillcolor="1" showattributes="1" xmi.id="507" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="146" showattsigs="601" usesdiagramusefillcolour="0" x="78" linecolour="#ff0000" y="454" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#dcdcdc" height="24" usefillcolor="1" showattributes="0" xmi.id="508" showoperations="0" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="346" showattsigs="601" usesdiagramusefillcolour="0" x="146" linecolour="#ff0000" y="17" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="98" usefillcolor="1" showattributes="1" xmi.id="516" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
+     <UML:ConceptWidget usesdiagramfillcolour="0" width="297" showattsigs="601" usesdiagramusefillcolour="0" x="319" linecolour="#ff0000" y="151" showopsigs="601" usesdiagramlinecolour="0" fillcolour="#ffffc0" height="70" usefillcolor="1" showattributes="1" xmi.id="524" showoperations="1" showpackage="0" showscope="1" showstereotype="0" font="Helvetica,8,-1,5,50,0,0,0,0,0" />
     </widgets>
     <messages/>
     <associations>
      <UML:AssocWidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" widgetbid="471" widgetaid="469" documentation="" type="500" >
       <linepath>
-       <startpoint startx="552" starty="557" />
-       <endpoint endx="552" endy="525" />
+       <startpoint startx="541" starty="543" />
+       <endpoint endx="541" endy="511" />
       </linepath>
      </UML:AssocWidget>
      <UML:AssocWidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" widgetbid="508" widgetaid="507" documentation="" type="500" >
       <linepath>
-       <startpoint startx="162" starty="543" />
-       <endpoint endx="162" endy="492" />
+       <startpoint startx="151" starty="529" />
+       <endpoint endx="151" endy="478" />
       </linepath>
      </UML:AssocWidget>
      <UML:AssocWidget totalcounta="2" indexa="1" totalcountb="3" indexb="1" widgetbid="516" widgetaid="416" documentation="" type="500" >
       <linepath>
-       <startpoint startx="174" starty="165" />
-       <endpoint endx="272" endy="129" />
+       <startpoint startx="163" starty="151" />
+       <endpoint endx="261" endy="115" />
       </linepath>
      </UML:AssocWidget>
      <UML:AssocWidget totalcounta="2" indexa="1" totalcountb="3" indexb="2" widgetbid="516" widgetaid="524" documentation="" type="500" >
       <linepath>
-       <startpoint startx="474" starty="165" />
-       <endpoint endx="387" endy="129" />
+       <startpoint startx="467" starty="151" />
+       <endpoint endx="376" endy="115" />
       </linepath>
      </UML:AssocWidget>
      <UML:AssocWidget totalcounta="2" indexa="1" totalcountb="2" indexb="1" widgetbid="504" widgetaid="503" documentation="" type="500" >
       <linepath>
-       <startpoint startx="160" starty="393" />
-       <endpoint endx="160" endy="354" />
+       <startpoint startx="149" starty="379" />
+       <endpoint endx="149" endy="340" />
       </linepath>
      </UML:AssocWidget>
      <UML:AssocWidget totalcounta="2" indexa="1" totalcountb="3" indexb="2" widgetbid="524" widgetaid="486" documentation="" type="500" >
       <linepath>
-       <startpoint startx="599" starty="310" />
-       <endpoint endx="524" endy="221" />
+       <startpoint startx="588" starty="296" />
+       <endpoint endx="517" endy="221" />
       </linepath>
      </UML:AssocWidget>
      <UML:AssocWidget totalcounta="2" indexa="1" totalcountb="3" indexb="1" widgetbid="524" widgetaid="413" documentation="" type="500" >
       <linepath>
-       <startpoint startx="363" starty="324" />
-       <endpoint endx="425" endy="221" />
+       <startpoint startx="352" starty="310" />
+       <endpoint endx="418" endy="221" />
       </linepath>
      </UML:AssocWidget>
     </associations>
@@ -214,11 +220,13 @@ x2c:get" name="hijos" static="0" scope="202" />
       </listitem>
       <listitem open="0" type="813" id="524" label="AI_DBTreeObject" >
        <listitem open="0" type="815" id="526" label="AI_DBTreeObject" />
+       <listitem open="0" type="815" id="529" label="borrar" />
        <listitem open="0" type="815" id="527" label="cargarHijos" />
        <listitem open="0" type="814" id="525" label="hijos" />
       </listitem>
-      <listitem open="0" type="813" id="469" label="AI_Error" >
+      <listitem open="1" type="813" id="469" label="AI_Error" >
        <listitem open="0" type="815" id="470" label="AI_Error" />
+       <listitem open="0" type="815" id="530" label="isError" />
       </listitem>
       <listitem open="0" type="813" id="507" label="AI_Form" >
        <listitem open="0" type="815" id="509" label="iniciar" />
index 5d86cba46356b00d62c79a816cb0d7a5be80e574..c8752c8ce194066659bfe518ec97fa6dcc6e804c 100644 (file)
@@ -114,6 +114,42 @@ class AI_DBTreeObject extends AI_DBObject {
     }
     // -X2C
 
+    // +X2C Operation 529
+    /**
+     * Borra el objeto de la base de datos verificando que no tenga hijos.
+     *
+     * @param  DB $db Base de datos de la cual borrar el objeto.
+     *
+     * @return PEAR_Error
+     * @access public
+     */
+    function borrar($db) // ~X2C
+    {
+               $id_field = $this->conf['id'];
+               $id_padre = $this->conf['padre'];
+        $tabla = $this->conf['base'].'.'.$this->conf['tabla'];
+        $id = intval($this->$id_field);
+        if ($id) {
+            // Verifico si tiene hijos.
+            $hijos = $db->getOne("
+                SELECT $id_field
+                FROM   $tabla
+                WHERE  $id_padre = $id");
+            if (DB::isError($hijos)) {
+                return $hijos;
+            } elseif ($hijos) {
+                // Si tiene hijos, da error.
+                return new AI_Error(AI_ERROR_TIENE_HIJOS,
+                    "El elemento de identificador $id todavía tiene hijos.");
+            } else {
+                // Si no tiene hijos, lo borro.
+                return parent::borrar($db);
+            }
+        }
+        return PEAR::raiseError('No hay un identificador válido para borrar');
+    }
+    // -X2C
+
 } // -X2C Class :AI_DBTreeObject
 
 ?>
\ No newline at end of file
index b4a221a977492a96253b438bbd0d9e0f1aa2c304..f73cd22b8efd2c6acd024ba83541fdcbca9488c1 100644 (file)
@@ -39,6 +39,15 @@ require_once 'PEAR.php';
  */
 define('AI_ERROR_NO_RESULTADOS', 1);
 
+/**
+ * Error que indica que un padre no se puede borrar porque aún tiene
+ * hijos.
+ *
+ * Es un error esperado y poco grave que sucede cuando se intenta borrar
+ * un elemento del tipo AI_DBTreeObject que aún tiene hijos.
+ */
+define('AI_ERROR_TIENE_HIJOS', 2);
+
 // +X2C Class 469 :AI_Error
 /**
  * @access public
@@ -60,6 +69,20 @@ class AI_Error extends PEAR_Error {
     }
     // -X2C
 
+    // +X2C Operation 530
+    /**
+     * @param  mixed $error Variable a evaluar si es un error.
+     *
+     * @return bool
+     * @access public
+     * @static
+     */
+    function isError($error) // ~X2C
+    {
+        return is_a($error, 'ai_error');
+    }
+    // -X2C
+
 } // -X2C Class :AI_Error
 
-?>
\ No newline at end of file
+?>
index c7d40dac56f8617db83be49368e67c81c50cdb1a..e149668b4f28c8af08e2cd55b6345d6efe9bb16f 100644 (file)
@@ -174,4 +174,4 @@ FIXME - preguntar a gonzalo si le sirve.
 
 } // -X2C Class :AI_Sistema
 
-?>
+?>
\ No newline at end of file
index 50218683cd26f203cc3b56ef7d2f38e5de2d71a4..a497965c5fe490f6d4761fe7fbc4632a70b332f1 100644 (file)
@@ -156,11 +156,14 @@ if ($tipo) {
                 $form->llenarObjeto($obj);
                 $err =& $obj->guardar($db, true);
                 if (PEAR::isError($err)) {
-                    if (DB::isError($err) and $err->getCode() == DB_ERROR_ALREADY_EXISTS) {
-                        $error = new MECON_HTML_Error("Ya existe un $nombre con el identificador "
+                    if (DB::isError($err)
+                            and $err->getCode() == DB_ERROR_ALREADY_EXISTS) {
+                        $error = new MECON_HTML_Error(
+                            "Ya existe un $nombre con el identificador "
                             . $obj->$tipo);
                     } else {
-                        $error = new MECON_HTML_Error('Error no esperado: ' . $err->getMessage());
+                        $error = new MECON_HTML_Error('Error no esperado: '
+                            . $err->getMessage());
                     }
                     $marco->addBody($error);
                 } else {
@@ -174,8 +177,15 @@ if ($tipo) {
                 if (!@$a_confirmar) {
                     $form->llenarObjeto($obj);
                     $err =& $obj->borrar($db);
-                    if (PEAR::isError($err)) {
-                        $error = new MECON_HTML_Error('Error no esperado: ' . $err->getMessage());
+                    if (AI_Error::isError($err)
+                            and $err->getCode() == AI_ERROR_TIENE_HIJOS) {
+                        $error = new MECON_HTML_Error('No se puede borrar el '
+                            . $nombre . 'porque todavía tiene "hijos".'
+                            . ' Elimine todos los "hijos" y pruebe otra vez.');
+                        $marco->addBody($error);
+                    } elseif (PEAR::isError($err)) {
+                        $error = new MECON_HTML_Error('Error no esperado: '
+                            . $err->getMessage());
                         $marco->addBody($error);
                     } else {
                         header("Location: $tipo");