Un poco de autocrítica

Antes de decidirme a usar Kumbia estuve mirando muchos otros frameworks y, comparando, me di cuenta de que lo que cuentan ustedes es cierto: Kumbia es por ahora el más sencillo y rápido de usar, sin configuraciones especiales ni tener que usar línea de comandos para crear modelos (aunque hay gente que opina que es lo mejor, yo no).

Cierto es que aún está un poco verde en algunas cosas, pero la cosa promete mejorar rápidamente.

Ahora la crítica, jeje <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> . Estoy acabando mi primer proyecto con Kumbia 0.47, un proyecto bastante complejo con muchas tablas que dependen unas de otras, y hasta con cinco niveles de profundidad en relación uno a muchos.

Las primeras dificultades las he encontrado a la hora de pasar parámetros de un controlador a otro. Si sólo es un parámetro o dos, no hay problema. Pero si son más... me he vuelto medio loco tratando de averiguar cómo hacerlo, y aún no estoy convencido de haberlo hecho bien. A veces me ha funcionado: controller/action/parámetro1/parámetro2 y a veces he tenido que hacerlo con un controller/action?parámetro1&parámetro2

La segunda tiene que ver con las redirecciones.
Por ejemplo, en un formulario de mantenimiento, hago un save() y luego un route_to("action: index") y funciona de maravilla.
En otro controlador exactamente igual, de hecho hago un copy&paste y sólo cambio algunos nombres, hago un save() y el route_to() no funciona... Tengo que hacerlo con un redirect.
Esto no lo entiendo, pero me ha pasado más de cuatro veces.


Como veis, estos dos puntos afectan directamente al core de Kumbia, creo que debería haber una manera unificada de redirigir. He perdido muchísimo tiempo con esto, todo el tiempo que había ganado con Kumbia lo he perdido con estos detalles.

La tercera tiene que ver con ActiveRecord. Estoy trabajando en la solución, a falta de que alguien me diga cómo hacerlo.

Está muy bien tener el tag form_tag, pero no pierdo mucho tiempo escribiendo
&lt;form name=&quot;miform&quot; id=&quot;miform&quot; action=&quot;controller/action&quot; &gt;
. A ver si se me entiende, no me ofrece nada nuevo.
Creo que faltaría en el tag form_tag una opción de ligar el formulario a un modelo, de modo que si hago un load($id) me cargue automáticamente (con Ajax o algo así) los valores en los campos del formulario. Ahora sólo he podido resolverlo así:

En la vista:
&lt;?= form_tag(&quot;contrapartes/save&quot;)?&gt;
	&lt;?= hidden_field_tag(&quot;idc&quot;,&quot;value&#58; $id&quot;) ?&gt; 
	&lt;table&gt;
		&lt;tr&gt;
			&lt;td&gt;Nombre&#58; &lt;/td&gt;&lt;td&gt;&lt;?= text_field_tag('nombre',&quot;value&#58; $nombre&quot;)?&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Siglas&#58; &lt;/td&gt;&lt;td&gt;&lt;?= text_field_tag('siglas',&quot;value&#58; $siglas&quot;)?&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;Observaciones&#58; &lt;/td&gt;&lt;td&gt;&lt;?= textarea_tag('observaciones', 'cols&#58; 40', 'rows&#58; 3',&quot;value&#58; $observaciones&quot;)?&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td colspan=&quot;2&quot; align=&quot;right&quot;&gt;&lt;?= submit_tag(&quot;Guardar&quot;) ?&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
	&lt;?= end_form_tag()?&gt;

Y en el controller:
function index($cont=''){
		$this-&gt;id=$cont;
		
		if($this-&gt;id!=&quot;&quot;){
 			$c=$this-&gt;Contrapartes-&gt;find_first($this-&gt;id);
 			$this-&gt;nombre=$c-&gt;nombre;
 			$this-&gt;siglas=$c-&gt;siglas;
 			$this-&gt;observaciones=$c-&gt;observaciones;
 		}
 		else {
	 		$this-&gt;nombre=&quot;&quot;;
	 		$this-&gt;siglas=&quot;&quot;;
	 		$this-&gt;observaciones=&quot;&quot;;
 		}
	}

No me parece la mejor manera.

Me gustaría que con un simple form_save() se guardara, sin tener que estar recogiendo los valores en el controller (se que existe el save_from_request(), pero no he podido aplicarlo nunca por complejidades del proyecto).
Pero ya digo, si os parece bien trabajaré en la manera de implementarlo.

No recuerdo nada más ahora mismo, pero si surge os lo haré saber.

PD: acabo de recordar otra: find(). A veces find_first() me funciona y veces no, tengo que hacer find(), sabiendo que sólo hay un registro posible para el valor que le paso. A veces, tanto en find() como en find_first(), sólo pasando como parámetro la variable funciona:
find($this-&gt;id)

a veces no y tengo que escribir:
find(&quot;id&#58; $this-&gt;id&quot;)

y a veces:
find(&quot;conditions&#58; id='$this-&gt;id'&quot;)

Esto no me parece razonable, y no encuentro la razón de que no me funcione a la primera.

Cuando haya acabado el proyecto os lo dejaré ver junto el código, tal vez estos problemas los tenga por falta de experiencia.

Creo que una crítica no viene mal, si me ha pasado a mi seguro que le ha pasado a más de uno, y os aseguro que ha habido varias veces que pensé dejar Kumbia y buscar otra manera de hacerlo, porque he llegado a desesperar varias veces. Espero que estas palabras (que son muchas) sean bienvenidas por la comunidad, mi ánimo es constructivo, este proyecto, Kumbia, me encanta y deseo colaborar para que sea un referente en los frameworks php.

Un saludo <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->

Comentarios

  • edited 11:40
    Me parece interesante lo que comentas.

    Con respecto a lo que indicas de que los datos se carguen automaticamente en un formulario, ayer estaba extendiendo y mejorando unos helpers y me percate de que internamente kumbia maneja un helper llamado get_value_from_action en la mayoria de los helpers para tags html, esta funcion obtiene el valor para el campo a partir del nombre que colocas en el campo y lo toma del controlador.

    Ejemplo:
    <?= text_field_tag('nombre') ?>

    En tu controlador debes colocar:
    $this->nombre = 'Emilio';

    Y este se auto cargara.

    Tambien me parece un poco incomodo lo que indicas de pasar cada atributo del modelo obtenido de una consulta, al controlador. Para solucionar esto voy a desarrollar un metodo en activerecord que se incorporara en la 0.5
  • edited 11:40
    Lo del helper que dices, voy a hacer la prueba, porque creo que lo probé y no me lo cargaba. De todas formas, si tenemos el objeto ActiveRecord, lo ideal sería no tener que poner $this->nombre='Emilio' en el controller, sino que se cargara "automágicamente" desde la base de datos.

    Si quieres me gustaría colaborar contigo en lo del form_save(), tengo algunas ideas y en mi trabajo utilizo algo por el estilo que nos podría ir la mar de bien. Creo que mi correo está en mi perfil, sino, lo pongo ahora.
  • edited 11:40
    Si comprendo algo de lo que indicas la idea seria incluir un metodo en el controlador (me parece mejor incluirlo aqui que en activerecord) que autocargue los atributos.

    Ejemplo:
    En el controlador
    $persona = $this-&gt;Persona-&gt;find(2);
    $this-&gt;load_from_model($persona);
    

    Y asi automagicamente se cargan los atributos del modelo en el controlador.

    Con respecto al form_save, es muy seguro que para lograr ese cometido sea necesario desarrollar un controlador parecido a StandardForm (solo que sin scaffold), de cualquier forma esta en proyecto desarrollar scaffold estatico y un nuevo scaffold dinamico (probablemente basado en StandardForm).
  • edited 11:40
    Interesante. ¿qué es un standardform dinámico o estático? El scaffold supongo que es que te construya el formulario, ¿verdad?
  • exacto el scaffold es quien dice si se construye el formulario
  • edited 11:40
    Hola, he estado pensando en otra cosa.

    En el archivo de configuración "config.ini" tenemos la opción de trabajar con una BD de desarrollo (development) y otra de explotación (production). Pues bien, si estamos en el modo development, se debería notar.

    Quiero decir, que el framework trabaje en modo development, sin caché en las vistas, generando logs automáticamente, etc. Al cambiar de modo, se activaría la caché de las vistas, desaparecerían los mensajes de error que hasta te enseñan la contraseña de la BD algunas veces (vamos, que sólo se viera un error mínimo junto a un código de error), que cuando no se encuentre un controlador o un modelo, Kumbia te redirigiera a la página 404 que hayas indicado en config.ini, etc.

    Supongo que se entiende la idea. Si estamos en modo de desarrollo, el framework nos facilitaría la vida a los desarrolladores. En el otro modo, se pensaría más en los usuarios.

    Otra idea que no se si implementa ya Kumbia es el cacheo de consultas SQL. No se si es muy viable, pero hay muchísimas consultas que se repiten en una aplicación o en una misma página. Pues bien, que esas tablas sean almacenadas en un directorio temporal y que Kumbia vaya allí a buscar la información. De esta manera se podría rebajar el trabajo de la BD.
  • edited 11:40
    Emilio, he estado trabajando sobre lo de la autocarga en un formulario, pero no lo he hecho para Kumbia, sino para un trabajo que va a ir en un servidor que corre php4.

    Os pongo el código para que os hagáis una idea. Uso Mootools y JSON, pero esto no es mayor problema que escribir un poco más de código javascript si hiciera falta:

    conectar.php
    $host = &quot;localhost&quot;;
    $user = &quot;user&quot;;
    $pswd = &quot;password&quot;;
    $db = &quot;db&quot;;
    
    $link=mysql_connect($host,$user,$pswd) or die ('I cannot connect to the database because&#58; '&#46;mysql_error());
    
    mysql_select_db($db,$link);
    

    index.php
    &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4&#46;01 Transitional//EN&quot; &quot;http&#58;//www&#46;w3&#46;org/TR/html4/loose&#46;dtd&quot;&gt;
    &lt;form xmlns=&quot;http&#58;//www&#46;w3&#46;org/1999/xhtml&quot; /&gt;
    &lt;html&gt;
      &lt;head&gt;
        &lt;title&gt;Prueba tienda&lt;/title&gt;
        &lt;script src=&quot;scripts/mootools&#46;v1&#46;11&#46;js&quot;&gt;&lt;/script&gt;
        &lt;script src=&quot;scripts/cargar&#46;js&quot;&gt;&lt;/script&gt;
      &lt;/head&gt;
      &lt;body&gt;
    
        &lt;input type=&quot;hidden&quot; id=&quot;oculto&quot; /&gt;
        Nombre&#58; &lt;input type=&quot;text&quot; id=&quot;nombre&quot; name=&quot;nombre&quot; /&gt;&lt;br&gt;
        Referencia&#58; &lt;input type=&quot;text&quot; id=&quot;referencia&quot; /&gt; &lt;br&gt;&lt;br&gt;
        &lt;input type='text' id='txtId' /&gt;
        &lt;input type=&quot;button&quot; id=&quot;btn&quot; value=&quot;Traer valores&quot; /&gt;
        
        &lt;div id=&quot;capa&quot; /&gt;
      &lt;/body&gt;
    &lt;/html&gt;
    

    cargar.php
    &lt;?php
    	require_once(&quot;conectar&#46;php&quot;);
    	require_once(&quot;JSON&#46;php&quot;);
    
    	 $json = new Services_JSON(); //en php5 no hace falta esta linea
     
    	// metadata
    	$resultados = array();
    	$meta = array();
    
    	$result = mysql_query(&quot;SHOW COLUMNS FROM &quot;&#46;$_POST&#91;&quot;tabla&quot;&#93;);
    	if (!$result) {
    	     echo 'Could not run query&#58; ' &#46; mysql_error();
    	     exit;
    	}
    	if (mysql_num_rows($result) &gt; 0) {
    	     while ($row = mysql_fetch_assoc($result)) {
    		$meta&#91;&#93;=$row&#91;&quot;Field&quot;&#93;;
    	    }
    	}
     
     
    	$sql=&quot;SELECT * FROM &quot;&#46;$_POST&#91;&quot;tabla&quot;&#93;&#46;&quot; WHERE id='&quot;&#46;$_POST&#91;&quot;json&quot;&#93;&#46;&quot;'&quot;;
    
    	$result = @mysql_query($sql, $link);
    	
    	$datos = array();
    	
    	if (mysql_num_rows($result) &gt; 0) {
    	    while ($row= @mysql_fetch_array($result, MYSQL_ASSOC)){
    		$datos&#91;&#93; = $row;
    	    }	
    	}
    	
    	if (mysql_num_rows($result) &gt; 0){
    	    $resultados&#91;0&#93; = $meta;
    	    $resultados&#91;1&#93; = $datos;
    
               // en php5 echo '{&quot;sample&quot;&#58;'&#46;json_encode($resultados)&#46;'}';
    	    echo '{&quot;sample&quot;&#58;'&#46;$json-&gt;encode($resultados)&#46;'}';
    	}
    	 else{
    	    echo &quot;0&quot;;
            }
    	
    ?&gt;
    
    window&#46;addEvent('domready', function(){
        $('btn')&#46;addEvent('click', function(){
    	new Ajax('cargar&#46;php',{
    	    method&#58; 'post',
    	    data&#58; &quot;tabla=productos&amp;json=&quot; + $('txtId')&#46;getValue(),
    	    update&#58; $('oculto'),
    	    onComplete&#58; function(){
    		var response=Json&#46;evaluate($('oculto')&#46;getText());
    		if(response!=&quot;0&quot;){
    		    var valor=response&#46;sample&#91;1&#93;&#91;0&#93;;  // los datos
    		    var w = response&#46;sample&#91;0&#93;;  // los metadata
    
    		    for(i=0; i&lt;w&#46;length;i++){
    			var campo = w&#91;i&#93;;
    			if($(campo)) $(campo)&#46;value = valor&#91;campo&#93;;
    		    }
    		}
    		else {
    		    $$('input')&#46;each(function(el){
    			if(el&#46;type=='text') el&#46;value=''; 
    		    });
    		    $('capa')&#46;innerHTML=&quot;No hay resultados&quot;;
    		}
    	    }   
    	})&#46;request();  
        });
     });
    

    Para buscar un id, se escribe en la caja de texto al lado del botón y se pulsa "Traer valores". Los valores se cargan automágicamente, listos para ser editados. Probadlo, veréis que es muy rápido el proceso.

    Lo interesante de esta prueba es que no están todos los campos de la tabla en formulario. Lo he probado con una tabla con 9 campos y aquí se han cargado perfectamente los dos que necesitaba.

    Creo que la idea se entiende, cualquier duda aqui me tenéis. Pienso que en Kumbia es todavía más fácil de implementar, ya que los metadata ya están cargados, y a la hora de guardar los cambios no hay que implementar nada nuevo, con un update() ya estaría (en mi caso me tengo implementar un javascript y un php para esto).

    Por cierto, ¿habéis pensado en JSON para Kumbia? ¿Y al final qué framework javascript será ? ¿jquery, mootools, extj?
  • Si hemos pensado en JSON...

    En cuanto a los framework de javascript el candidato es JQuery lo que nos frena es que somos dos personas y para implementar este Framework en lo que hace actualmente kumbia con sus formularios remotos y todo lo que tiene que ver con AJAX generaria un trabajo extra bastante grande que ahorita no tenemos tiempo para asumir sin embargo esta en el RoadMap del Kumbia hacer este trabajo ahorita las prioridades están focalizadas en la Docs, Bugs, mejoras de ActiveRecord y otras...

    Exitos...
  • edited 11:40
    Bueno, cuando acabe un par de cosillas que tengo qeu hacer podría ponerme a aprender JQuery y colaborar en este proyecto.

    ¿Y lo que he he colgado que os parece?
  • edited 11:40
    Bien, he acabado el ejemplo anterior y ahora ya tengo un CRUD completo sin scalffold (repito: para PHP 4):

    index.php
    &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4&#46;01 Transitional//EN&quot; &quot;http&#58;//www&#46;w3&#46;org/TR/html4/loose&#46;dtd&quot;&gt;
    &lt;form xmlns=&quot;http&#58;//www&#46;w3&#46;org/1999/xhtml&quot; /&gt;
    &lt;html&gt;
      &lt;head&gt;
        &lt;title&gt;Prueba tienda&lt;/title&gt;
        &lt;script src=&quot;scripts/mootools&#46;v1&#46;11&#46;js&quot;&gt;&lt;/script&gt;
        &lt;script src=&quot;CRUD&#46;js&quot;&gt;&lt;/script&gt;
      &lt;/head&gt;
      &lt;body&gt;
    
        &lt;input type=&quot;hidden&quot; id=&quot;oculto&quot; /&gt;
        Id&#58; &lt;input type=&quot;text&quot; id=&quot;id&quot; /&gt;
        Nombre&#58; &lt;input type=&quot;text&quot; id=&quot;nombre&quot; name=&quot;nombre&quot; /&gt;&lt;br&gt;
        Referencia&#58; &lt;input type=&quot;text&quot; id=&quot;referencia&quot; /&gt; &lt;br&gt;&lt;br&gt;
        Id a buscar&#58; &lt;input type='text' id='txtId' /&gt;
        &lt;input type=&quot;button&quot; id=&quot;btncargar&quot; value=&quot;Traer valores&quot; /&gt;
        &lt;input type=&quot;button&quot; id=&quot;btnnew&quot; value=&quot;Nuevo&quot; /&gt;
        &lt;input type=&quot;button&quot; id=&quot;btndelete&quot; value=&quot;Eliminar&quot; /&gt;
        &lt;input type=&quot;button&quot; id=&quot;btnedit&quot; value=&quot;Actualizar&quot; /&gt;
        &lt;div id=&quot;capa&quot; /&gt;
      &lt;/body&gt;
    &lt;/html&gt;
    

    cargar.php
    &lt;?php
    	require_once(&quot;panel/conectar&#46;php&quot;);
    	require_once(&quot;panel/JSON&#46;php&quot;);
    
    	$json = new Services_JSON();
    
    	$modo = $_POST&#91;&quot;modo&quot;&#93;;
    	$tabla = $_POST&#91;&quot;tabla&quot;&#93;;
    	if(isset($_POST&#91;&quot;val&quot;&#93;)) $val = $_POST&#91;&quot;val&quot;&#93;;
    	 
    	// metadata
    	$resultados = array();
    	$meta = array();
    
    	$result = mysql_query(&quot;SHOW COLUMNS FROM &quot;&#46;$tabla);
    	if (!$result) {
    	     echo 'Could not run query&#58; ' &#46; mysql_error();
    	     exit;
    	}
    	if (mysql_num_rows($result) &gt; 0) {
    	     while ($row = mysql_fetch_assoc($result)) {
    		$meta&#91;&#93;=$row&#91;&quot;Field&quot;&#93;;
    	    }
    	}
    
        switch($modo){
    	case &quot;cargar&quot;&#58;
    	    $sql=&quot;SELECT * FROM &quot;&#46;$tabla&#46;&quot; WHERE id='&quot;&#46;$_POST&#91;&quot;id&quot;&#93;&#46;&quot;'&quot;;
    
    	    $result = @mysql_query($sql, $link);
    	
    	    $datos = array();
    
    	    if (mysql_num_rows($result) &gt; 0) {
    		while ($row= @mysql_fetch_array($result, MYSQL_ASSOC)){
    		    $datos&#91;&#93; = $row;
    		}	
    	    }
    
    	    if (mysql_num_rows($result) &gt; 0){
    		$resultados&#91;0&#93; = $meta;
    		$resultados&#91;1&#93; = $datos;
    
    		echo '{&quot;sample&quot;&#58;'&#46;$json-&gt;encode($resultados)&#46;'}';
    	    }
    	     else{
    		echo &quot;0&quot;;
    	    }
    	    break;
    	case &quot;new&quot;&#58;
    	    $claves = array();
    	    $values = array();
    
    	    $claves = $json-&gt;decode(stripslashes($val),true);
    
    	    foreach($meta as $m){
    		array_push($values,$claves-&gt;$m);
    	    }
    	    
    	    $values&#91;0&#93; = '0';
    	    $sql=&quot;INSERT INTO &quot;&#46;$tabla&#46;&quot; VALUES ('&quot;;
    
    	    $sql &#46;= implode(&quot;','&quot;, $values);
    
    	    $sql &#46;= &quot;')&quot;;
    
    	    $result = @mysql_query($sql, $link);
    	    echo $result;
    	    break;
    	case &quot;edit&quot;&#58;
    	    $claves = array();
    	    $values = array();
    	    $keys = array();
    	    $arr = array();
    	    $valores = array();
    
    	    $claves = $json-&gt;decode(stripslashes($val),true);
    	    $arr = get_object_vars($claves);
    
    	    foreach($meta as $m){
    		if(key_exists($m, $arr)){
    		    array_push($keys,$m);
    		    array_push($values, $claves-&gt;$m);
    		}
    	    }
    
    	    $sql=&quot;UPDATE &quot;&#46;$tabla&#46;&quot; SET &quot;;
    
    	    $length = count($keys);
    	    
    	    for($i=0; $i &lt; $length; $i++){
    		$key = $keys&#91;$i&#93;;
    		$tmp = &quot;$key='{$values&#91;$i&#93;}'&quot;;
    		array_push($valores, $tmp);
    	    }   
    	    
    	    $tmp = array_shift($valores);
    	    
    	    $sql &#46;= implode(&quot;,&quot;, $valores);
    
    	    $sql &#46;= &quot; WHERE id='&quot;&#46;$_POST&#91;&quot;id&quot;&#93;&#46;&quot;'&quot;;
    
    	    $result = @mysql_query($sql, $link);
    	    echo $result;
    	    break;
    	case &quot;delete&quot;&#58;
    	    $sql=&quot;DELETE FROM &quot;&#46;$tabla&#46;&quot; WHERE id='&quot;&#46;$_POST&#91;&quot;id&quot;&#93;&#46;&quot;'&quot;;
    	    $result = @mysql_query($sql, $link);
    	    echo $result;
    	    break;
    	default&#58;
    	    echo &quot;Sin datos&quot;;
    	    break;
        }  
    
    ?&gt;
    

    CRUD.js
        function cargar(table){
    	var result='';
    	new Ajax('cargar&#46;php',{
    	    method&#58; 'post',
    	    data&#58; &quot;tabla=&quot; + table + &quot;&amp;modo=cargar&amp;id=&quot; + $('txtId')&#46;getValue(),
    	    onComplete&#58; function(request){
    		var response=Json&#46;evaluate(request); 
    		if(response!=&quot;0&quot;){
    		    var valor=response&#46;sample&#91;1&#93;&#91;0&#93;;
    		    var w = response&#46;sample&#91;0&#93;;
    
    		    for(i=0; i&lt;w&#46;length;i++){
    			var campo = w&#91;i&#93;;
    			if($(campo)) $(campo)&#46;value = valor&#91;campo&#93;;
    		    }
    		    result=&quot;&quot;;
    		}
    		else {
    		    $$('input')&#46;each(function(el){
    			if(el&#46;type=='text') el&#46;value='';
    		    });
    
    		    $('capa')&#46;innerHTML=&quot;No hay resultados&quot;;
    		}
    	    },
    	    evalScripts&#58; true
    	})&#46;request();  
        }    
        
        function nuevo(table){
    	var val = {};
    
    	$$('input')&#46;each(function(el){
    	    if(el&#46;type=='text'){
    		clave = el&#46;getProperty(&quot;id&quot;);
    		valor = el&#46;getValue();
    		val&#91;clave&#93;=valor;
    	    } 
    	});
    
    	val = Json&#46;toString(val);
    
    	new Ajax('cargar&#46;php',{
    	    method&#58; 'post',
    	    data&#58; &quot;tabla=&quot; + table +&quot;&amp;modo=new&amp;val=&quot; + val,
    	    onComplete&#58; function(request){
    		return(request);
    	    },
    	    evalScripts&#58; true
    	})&#46;request();
        }    
       
        function editar(table){
    	var val = {};
    
    	$$('input')&#46;each(function(el){
    	    if(el&#46;type=='text'){
    		clave = el&#46;getProperty(&quot;id&quot;);
    		valor = el&#46;getValue();
    		val&#91;clave&#93;=valor;
    	    } 
    	});
    
    	val = Json&#46;toString(val);
    
    	new Ajax('cargar&#46;php',{
    	    method&#58; 'post',
    	    data&#58; &quot;tabla=&quot; + table + &quot;&amp;modo=edit&amp;id=&quot;+ $('id')&#46;getValue() + &quot;&amp;val=&quot; + val,
    	    onComplete&#58; function(request){
    		return(request);
    	    },
    	    evalScripts&#58; true
    	})&#46;request();
        }
        
        function eliminar(table){
        
    	new Ajax('cargar&#46;php',{
    	    method&#58; 'post',
    	    data&#58; &quot;tabla=&quot; + table + &quot;&amp;modo=delete&amp;id=&quot; + $('id')&#46;getValue(),
    	    onComplete&#58; function(request){
    		return(request);
    	    },
    	    evalScripts&#58; true
    	})&#46;request();
        }
        
        $('btncargar')&#46;addEvent('click', function(){ cargar(&quot;proveedores&quot;);});
        $('btnnew')&#46;addEvent('click', function(){ nuevo(&quot;proveedores&quot;);});
        $('btnedit')&#46;addEvent('click', function(){ editar(&quot;proveedores&quot;);});
        $('btndelete')&#46;addEvent('click', function(){ eliminar(&quot;proveedores&quot;);});
    
    

    En este ejemplo trabajo contra una tabla llamada "proveedores", pero sirve con cualquiera. Ahora sólo falta, a la hora de cargar datos, distinguir si el control es un input text, textarea, un checkbox, etc.

    Sólo pongo esto para dar una idea de lo que se podría hacer en Kumbia sin tener que recargar la página, o sea, Ajax. El archivo cargar.php sería o bien una clase, o bien unos métodos de, por ejemplo, StandardForm.

    Espero que a alguien le sirva.
Sign In or Register to comment.