[SOLUCIONADO]acceso a campos de formularios

Hola disculpen, me podrían decir como accedo a los campos de un formulario, necesito modificar el insert y no se como hacerlo.
Desde ya muchas gracias

Bueno, la manipulación de un campo para modificar su contenido depende de donde estás parado.
En el caso de que te encuentres en el método de configuración del formulario, que recibe como parámetro el objeto ei_formulario con el nombre $form, el método a utilizar sería el siguiente:
$form->ef(‘mi_identificador_de_ef’)->set_estado(valor_deseado);

Si estás en la extensión Js del formulario sería:
this.ef(‘mi_id_ef’).set_estado(valor_deseado);

Esto sería para un ef editable común. Los ef_popup tienen un tratamiento levemente diferente.

Todos los métodos disponibles para manipulación de efs, tanto los propios como los heredados de cada tipo de ef, los vas a encontrar en las respectivas APIs de Toba, tanto php cmo Js.

Espero haberte orientado.
Saludos.

Estimado Claudio, estoy parado sobre el evento evt__guardar(), ya que necesito modificar el insert.
Como accedo a los campos desde esta posición? o existe otro forma de hacer lo que necesito?

Si estás parado en el evento guardar, entonces no sería necesario que modifiques los ef del formulario ya que a esa altura lo que te importa es lo que figura en el datos_tabla.
Dicho objeto posee métodos que te permiten ubicar el cursor en el registro que necesites modificar y cambiar el valor de una columna.
La verdad es que la información que brindas es muy escasa como para estar seguro de cual sería el método correcto.
No se si estás usando un datos_tabla, ni si este está dentro de un datos_relación, ni si el mismo tiene un solo registro o varios, ni si necesitas modificar una sola columna o varias.

En el caso trivial de que tuvieras un datos tabla con un solo registro, para que los cambios impacten en la tabla, antes de sincronizar deberías usar alguno de los siguientes métodos:

modificar_fila( mixed $id, array $fila, [array $nuevos_padres = null] )
Modifica los valores de una fila de la tabla en memoria Solo se modifican los valores de las columnas enviadas y que realmente cambien el valor de la fila.
Parámetros:
mixed $id: Id. interno de la fila a modificar
array $fila: Contenido de la fila, en formato columna=>valor, puede ser incompleto
array $nuevos_padres:

o bien
set_fila_columna_valor( mixed $id, string $columna, mixed $valor )
Cambia el valor de una columna de una fila especifica
Parámetros:
mixed $id: Id. interno de la fila de la tabla en memoria
string $columna: Columna o campo de la fila
mixed $valor: Nuevo valor

Te aconsejo estudiar la API php a los efectos de ver cual se adapta mejor a tus necesidades… Podés llegar a lso métodos del DT accediendo a través del menú superior con la opción “componentes” y luego en el menú que está a la izquierda de la pantalla busca “Datos Tabla” dentro de los objetos de persistencia.

Si no estás usando Datos Tabla y estás haciendo los inserts sin utilizar los métodos de persistencia, habría que ver cómo definiste tu evento guardar y dónde.
En el caso de que no hayas arrastrado los datos y estos estén solo en el form y este objeto esté visible, podrías alcanzar la información con:

$this->dep(‘nombre_del_form’)->ef(‘nombre_del_ef’)->get_estado();

Saludos

Yo pienso que lo mejor es tomarlo desde el DT directamente, ya que en definitiva este es el que contiene el CRUD respectivo,

por lo tanto si son campos que se encuentran en la BD, los mismos deben estar en el DT, y si no se muestran en el formulario, podrías aprovechar en el momento del alta o actualización, para actualizarlo

$datos = $this->get_relacion()->tabla(‘my_tabla’)->get();
$datos[‘campo_n’] = ‘nuevo valor’;
$this->get_relacion()->tabla(‘my_tabla’)->set($datos);

Espero te sirva

Un saludo

Hola Cristian,

estas usando componentes de persistencia para ir contra la bd?.. estas haciendo directamente las consultas?. El cambio a provocar en la sentencia seria por un valor dependiente de otro?, es algo que puedas resolver con un default en base?

Saludos

Gracias por las respuestas, lo que quiero hacer es almacenar documentos en la base de datos y luego al recuperar los datos que se muestre un link de descarga.
Lo que había pensado es capturar los datos del control de upload y almacenar el archivo. He visto en el documento, que se presenta como recopilación de ejemplos, un caso con imágenes pero no me esta tomando los datos correctamente.
Adjunto el código donde estoy trabajando:
01 <?php 02 class ci_gestion_de_archivos extends legajo_ci 03 { 04 protected $s__datos_filtro; 05 06 07 //---- Filtro ----------------------------------------------------------------------- 08 09 function conf__filtro(toba_ei_formulario $filtro) 10 { 11 if (isset($this->s__datos_filtro)) { 12 $filtro->set_datos($this->s__datos_filtro); 13 } 14 } 15 16 function evt__filtro__filtrar($datos) 17 { 18 $this->s__datos_filtro = $datos; 19 } 20 21 function evt__filtro__cancelar() 22 { 23 unset($this->s__datos_filtro); 24 } 25 26 //---- Cuadro ----------------------------------------------------------------------- 27 28 function conf__cuadro(toba_ei_cuadro $cuadro) 29 { 30 if (isset($this->s__datos_filtro)) { 31 $cuadro->set_datos($this->dep('datos')->tabla('leg_archivo')->get_listado($this->s__datos_filtro)); 32 } else { 33 $cuadro->set_datos($this->dep('datos')->tabla('leg_archivo')->get_listado()); 34 } 35 } 36 37 function evt__cuadro__seleccion($datos) 38 { 39 $this->dep('datos')->cargar($datos); 40 $this->set_pantalla('pant_edicion'); 41 } 42 43 //---- Formulario ------------------------------------------------------------------- 44 45 function conf__formulario(toba_ei_formulario $form) 46 { 47 $cant_datos = $this->dep('datos')->tabla('leg_archivo')->get_cantidad_filas(); 48 if ($cant_datos > 0) { 49 echo 'Cantidad de Datos:'.$cant_datos; 50 $datos = $this->dep('datos')->tabla('leg_archivo')->get(); 51 $imagen = $this->dep('datos')->tabla('leg_archivo')->get_blob('arch_documento'); 52 echo $imagen; 53 if (isset($imagen)) { 54 $temp_nombre = md5(uniqid(time())); 55 $s__temp_archivo = toba::proyecto()->get_www_temp($temp_nombre); 56 $temp_imagen = fopen('C:\\Users\\csflc\\Downloads\\leg_csf.pdf', 'w'); 57 stream_copy_to_stream($imagen, $temp_imagen); 58 fclose($temp_imagen); 59 $tamano = round(filesize('C:\\Users\\csflc\\Downloads\\leg_csf.pdf') / 1024); 60 //$datos['foto_vista_preliminar'] = ""; 61 echo .$tamano.' kb'; 62 } else { 63 echo ' null'; 64 //Agrego esto para cuando no existe imagen pero si registro 65 } 66 $form->set_datos($datos); 67 } else { 68 $cfg = dt_cfg_valores_por_defecto::get_configuracion(); 69 $datos['foto'] = null; 70 $form->set_datos_defecto($datos); 71 } 72 if ($this->dep('datos')->esta_cargada()) { 73 $form->set_datos($this->dep('datos')->tabla('leg_archivo')->get()); 74 } else { 75 $this->pantalla()->eliminar_evento('eliminar'); 76 } 77 } 78 79 function evt__formulario__modificacion($datos) 80 { 81 $this->dep('datos')->tabla('leg_archivo')->set($datos); 82 if (is_array($datos['arch_documento'])) { 83 echo '-if-mod'; 84 // 85 $s__temp_archivo = $datos['arch_documento']['tmp_name']; 86 echo '-nombre:'.$s__temp_archivo; 87 $imagen = fopen($s__temp_archivo, 'rb'); 88 echo '-imagen'.$imagen; 89 $this->dep('datos')->tabla('leg_archivo')->set_blob('arch_documento', $imagen); 90 fclose($imagen); 91 } 92 // $this->dep('datos')->tabla('leg_archivo')->set($datos); 93 } 94 95 function resetear() 96 { 97 $this->dep('datos')->resetear(); 98 $this->set_pantalla('pant_seleccion'); 99 } 100 101 //---- EVENTOS CI ------------------------------------------------------------------- 102 103 function evt__agregar() 104 { 105 $this->set_pantalla('pant_edicion'); 106 } 107 108 function evt__volver() 109 { 110 $this->resetear(); 111 } 112 113 function evt__eliminar() 114 { 115 $this->dep('datos')->eliminar_todo(); 116 $this->resetear(); 117 } 118 119 function evt__guardar() 120 { 121 $this->dep('datos')->sincronizar(); 122 $this->resetear(); 123 } 124 125 } 126 ?>

por favor denme una ayuda con esto, desde ya muchas gracias.

Hola Cristian,

creo que tu inconveniente puede venir de esta funcion, tene en cuenta que el archivo que Apache recibe desde el cliente solamente lo mantiene por ese pedido de pagina, por lo cual si el mismo no se guarda en la base todo en el mismo pedido, no te va a funcionar.

La opcion mas sencilla para este caso, es mover el archivo subido con la funcion move_uploaded_file a un directorio propio, de manera que puedas mantenerlo existiendo por mas de un pedido de pagina, luego de ello abris el archivo y le pasas el handler al set_blob.

En el caso de usar DT, existen un par de metodos en el persistidor, en los cuales podes interceptar los datos justo en el momento previo a que se ejecute la sentencia en el motor. Para ello vas a necesitar extender el administrador de persistencia del DT.

Saludos

muchas gracias por responder, le di solución borrando la operación y volviendo a crearla, parece que no me tomaba los campos