Sunteți pe pagina 1din 38

COMUNIDAD SIU-TOBA RESOLUCION DE DUDAS Y PROBLEMAS

Este manual solo intenta ser una recopilacin de lo obtenido como respuesta en la Comunidad SIU-Toba. Las consultas realizas son de muchos de los desarrolladores que trabajamos sobre la herramienta. Las respuestas son de unos pocos a los que le debemos su tiempo y esfuerzo.
Sin duda estar sujeto a revisin, y las mismas sern bienvenidas! La fecha de resolucin de los problemas se ha puesto en todos los casos para referenciar la posible versin en curso y quiz indicar que dichar manera de resolucin o problema presentado, ya puede haber sido resuelto de esa o de otra forma.

TABLA DE CONTENIDOS
ADMINISTRACIN DE PROYECTOS......................................................................................................................5 SINCRONIZACIN DE DISTINTOS PUESTOS DE TRABAJO....................................................................................................................5 ELIMINAR PROYECTO.................................................................................................................................................................5 RENOMBRAR PROYECTO.............................................................................................................................................................5 COMO CLONAR UN PROYECTO.....................................................................................................................................................6 FORMATEO....................................................................................................................................................................7 MAYSCULAS/MINSCULAS EN EFS..............................................................................................................................................7 MAYSCULAS EN FORMA GLOBAL.................................................................................................................................................7 MINSCULAS PARA UN EF EN PARTICULAR.....................................................................................................................................7 ANCHO DE UNA ETIQUETA EN PARTICULAR...................................................................................................................................7 VIA CSS.................................................................................................................................................................................7 REDEFINIENDO EL LAYOUT..........................................................................................................................................................8 EF......................................................................................................................................................................................9 VALIDACIN DE VALORES INGRESADOS EN JS...............................................................................................................................9 CAMBIAR DE LA UNIDAD DINAMICAMENTE EN UN EF_EDITABLE_NUMERO.........................................................................................9 ACCEDER A LA DESCRIPCIN SELECCIONADA DE UN COMBO..........................................................................................................10 CAMBIAR LA ETIQUETA DE UN EF..............................................................................................................................................10 CAMBIAR ESTILO DE EFS SOLO LECTURA....................................................................................................................................11 EI_FORMULARIO.......................................................................................................................................................12 DETECTAR TIPO DE EF ............................................................................................................................................................12 LIMITAR FILAS EN ML...........................................................................................................................................................12 CONFIGURAR FILAS DE UN FORMULARIO_ML..............................................................................................................................13 COLAPSAR/DESCOLAPSAR FORMULARIOS CON JS........................................................................................................................13 CAMBIAR IMAGEN DE EVENTO DE FILA DE EN FORMULARIO_ML....................................................................................................14 EI_FILTRO....................................................................................................................................................................15 FIJAR LA CONDICIN DE UN ELEMENTO DE UN FILTRO..................................................................................................................15 EI_CUADRO..................................................................................................................................................................16 FORMATEAR/SUMARIZAR COLUMNA EN CUADROS.......................................................................................................................16 TIEMPOS (HORAS)....................................................................................................................................................................16 DISTINTAS MONEDAS................................................................................................................................................................16 COLAPSAR CORTES DE CONTROL POR CDIGO.............................................................................................................................17 PROBLEMA.............................................................................................................................................................................17 SOLUCIN...............................................................................................................................................................................18 SANEAMIENTO DE CAMPO CON HTML EN CUADRO........................................................................................................................18

EVENTOS Y VNCULOS.............................................................................................................................................19 COMO DISPARAR EVENTO DE UN CI CONTROLADOR DESDE UN CI INTERNO....................................................................................19 PASAR PARMETROS A UN POP-UP / VNCULOS EN GENERAL..........................................................................................................19 MANIPULACIN DE DATOS....................................................................................................................................21 INCORPORAR IMAGEN COMO DATO BLOB...................................................................................................................................21 PLANTEO................................................................................................................................................................................21 SOLUCIN...............................................................................................................................................................................21 CDIGO.................................................................................................................................................................................21 PDFS....................................................................................................................................................................................22 CHAR O VARCHAR.................................................................................................................................................................22 PERFILES DE DATOS.................................................................................................................................................................23 PROBLEMA.............................................................................................................................................................................23 SOLUCIN...............................................................................................................................................................................23 CN.......................................................................................................................................................................................24 COMO SABER SI UNA CONSULTA EST CARGADA AL INGRESAR A UN FORMULARIO........................................................................25 VARIAS BD - UN SOLO PROYECTO..........................................................................................................................................25 TRANSACCIONAR MODIFICACIONES SIMULTNEAS DE N DATOS_TABLAS.........................................................................................26 EXPORTACIN............................................................................................................................................................28 ARMAR PDF CON ENCABEZADO Y PIE DE PGINA....................................................................................................................28 ARMAR ENCABEZADOS DINMICOS EN PDF...............................................................................................................................28 ARCHIVOS....................................................................................................................................................................30 DESCARGAR ARCHIVOS............................................................................................................................................................30 IMPORTAR ARCHIVOS DE TEXTO................................................................................................................................................30 SKINS ............................................................................................................................................................................33 DEFINIR EL SKIN A UTILIZAR....................................................................................................................................................33 EXTENSIN DE UN SKIN EXISTENTE ...........................................................................................................................................33 CREACIN DE UN SKIN PROPIO DEL PROYECTO............................................................................................................................33 TOBA.CSS................................................................................................................................................................................33 IMGENES..............................................................................................................................................................................34 CHARTDIRECTOR......................................................................................................................................................35 GRFICAS CON CHARTDIRECTOR MOSTRADAS EN UN EF_FIJO......................................................................................................35 GENERAL......................................................................................................................................................................36 FIJAR LA BARRA DE MEN........................................................................................................................................................36 SALTO DE LNEA EN ARCHIVOS DE TEXTO...................................................................................................................................36

ORDENAR ARRAY SOBRE LOS DATOS DE UNA COLUMNA................................................................................................................36 ACCEDER AL SISTEMA DE USUARIOS DESDE MI PROYECTO.............................................................................................................36 CARTEL DE ESPERA.................................................................................................................................................................37 FUNCTION`S CYCLOMATIC COMPLEXITY (N) EXCEEDS ALLOWED MAXIMUM.....................................................................................37 PHP.................................................................................................................................................................................38 FATAL ERROR: ALLOWED MEMORY SIZE OF...............................................................................................................................38 PHP 5.3.0............................................................................................................................................................................38

Administracin de proyectos
Sincronizacin de distintos puestos de trabajo
23/11/2009

En el equipo que origina el cambio hacer (N de desarrollado X): toba proyecto exportar -p {proyecto} cometer los cambios en svn En el equipo destino (N de desarrollador <> X): actualizar a travs del svn toba proyecto regenerar -p {proyecto} Lo ideal sera realizar este proceso antes de modificar algo. Es decir, siempre al inicio de la sesin de trabajo. Caso contrario, convendra como paso inicial, para preservar los cambios realizados en el equipo destino ejecutar: toba proyecto exportar p {proyecto}

Eliminar proyecto
24/11/2009

toba proyecto eliminar -p proyecto -i instancia

Vale aclarar que este comando borra el proyecto de la base de datos de toba, no as la carpeta dentro de proyectos que debe ser borrada manualmente.

Renombrar proyecto
03/08/2010

exportar el proyecto AAAA copiar la carpeta AAAA como BBBB hacer un busqueda reemplazando en todos los php y sql de la carpeta metadados y php del proyecto BBBB, toda aparicin de la cadena AAAA por BBBB (en mi caso utilic la aplicacin grep). cargar el proyecto BBBB y manualmente tuve que hacer algunos ajustes: en toba.conf modifiqu el alias para el nuevo proyecto ya que no se pblico automticamente (tampoco funcion haciendo toba proyecto publicar)... en instalacion/instancia.ini, renombre tambin los accesos al otro proyecto en bases.ini, renombr tambin el nombre de la fuente (ya que al llamarse igual que el proyecto, fue renombrada, y prefer seguir esa lnea, en lugar de renombrarla en el proyecto). dentro del proyecto tena un datos tabla apuntando a una tabla con el mismo nombre del proyecto original, que fue renombrada automticamente.

y finalmente tuve algn problema con los perfiles ya que la operacin de inicio qued sin accesos permitidos, excepto por el administrador.

Como clonar un proyecto


15/30/2010

Actualmente no existe tal comando, se me ocurre la siguiente forma 'artesanal' de hacerlo. Por ejemplo clonar el proyecto toba_referencia a referencia_mio Exportar el proyecto. Copiar recursivamente la carpeta del proyecto. Buscar y reemplazar todas las ocurrencias de toba_referencia por referencia_mio, el id del nuevo proyecto puede tener hasta 15 caracteres.*** Para cargar el nuevo proyecto en la instancia ejecutar

***

Tener en cuenta de no modificar los archivos dentro de las carpetas ocultas .svn.

Formateo
Maysculas/minsculas en efs
Maysculas en forma global
17/11/2009

Realizarlo a travs del estilo global del sistema, modificando el toba.css del proyecto:
.ef-input { text-transform: uppercase; }

Esto es solo visual, pero igualmente, antes de enviar las cadenas a la bdd, las estaba pasando a maysculas, as que sigo hacindolo.

Minsculas para un ef en particular


26/11/2009

Tiene prioridad con respecto al css global del proyecto. El generar_layout debe incluir todos los ef utilizados. El ef en cuestin debe generarse previamente y luego ejecutar el style.
class ci_paises_formulario extends toba_ei_formulario { function generar_layout() { $this->generar_html_ef('ef1'); ... $this->generar_html_ef('nombre'); $id_ef = '#'.$this->ef('nombre')->get_id_form(); echo "<style type='text/css'> $id_ef.ef-input {text-transform: lowercase;} </style>"; ... $this->generar_html_ef('efN'); } }

Ancho de una etiqueta en particular


10/03/2010

Via CSS
#cuerpo_js_form_1000175_form .ei-form-etiq { width: 300px; }

Este el ejemplo afecta a todos los efs de ese formulario en particular. En CSS existe una forma de apuntar a toda una clase (.algo, en este caso .ei-form-etiq), a un id particular (#id) o a 'hijos de'. Entonces la regla,
'#cuerpo_js_form_1000175_form .ei-form-etiq'

se lee como: 'Los tag que tienen como clase a ei-form-etiq que se encuentran dentro de un tag que tiene como id a cuerpo_js_form_1000175_form' Como obtengo cuerpo_js_form_1000175_form? Mirando el cdigo fuente y buscando un tag con id que englobe a lo que quers modificar, usando el inspect de FireBug o similar. En este caso el tag en cuestin es el comienzo del cuerpo de ese formulario puntual, con lo que la regla solo afecta a los efs de ese formulario. Si en cambio se desea apuntar a un ef particular sera, teniendo en cuenta que el id vara segun el form/ef:
#nodo_ef_form_1561_formularioarchivo .ei-form-etiq { .... }

Redefiniendo el layout
Si se redefine el layout se puede utilizar toba_ei_formulario::set_ancho_etiqueta(). Con este metodo se puede setear el ancho de la etiqueta justo antes de hacer la llamada a
$this->generar_html_ef('ef_que_se_desea_modificar');

de esa forma solo afectarias a ese EF y no al resto.***

***

En la prctica, solo se pudo afectando al ef final. Si se realiza en el medio, todos los que siguen quedaban modificados.

ef
Validacin de valores ingresados en JS
21/10/2010

Este cdigo de ejemplo verifica que solo haya un checkbox de nombre principal tildado entre todas las filas.
{$this->objeto_js}.evt__validar__datos = function() { var contador = 0; var hay_varias_principales = false; for(var i in this.filas) { if (this.ef('principal').ir_a_fila(this.filas[i]).chequeado()) { contador++; } } hay_varias_principales = (contador > 1); if (hay_varias_principales) { notificacion.agregar('Solo puede existir un principal.... one ring to rule them all.... muhahahahahaha'); } return (! hay_varias_principales); }

Este control puede realizarse en PHP tambin, en el evt__fomulario_ml__modificacion.

Cambiar de la unidad dinamicamente en un ef_editable_numero


23/02/2010

var nodomuestra = this.ef('cantidad_muestra').get_contenedor(); var nodoregistro = this.ef('valor_reg').get_contenedor(); if (navigator.appName.indexOf('Explorer') != -1) { var nodomuestra = nodomuestra.firstChild.lastChild; var nodoregistro = nodoregistro.firstChild.lastChild; } else { var nodomuestra = nodomuestra.firstChild.nextSibling.firstChild.nextSibling; var nodoregistro = nodoregistro.firstChild.nextSibling.firstChild.nextSibling; } nodomuestra.nodeValue = ' ' + datos['muestra']['unidad_medida']; nodoregistro.nodeValue = ' ' + datos['variable']['unidad_medida'];

Se puede cambiar la expresion del if, en basicos.js existen una serie de variables JS que indican de que browser se trata y que version (para el caso de versiones incompatibles entre si).

Acceder a la descripcin seleccionada de un combo


17/03/2011

Un ejemplo: la idea es tomar la descripcin de la moneda y colocarlo como unidad del saldo.
{$this->objeto_js}.evt__id_moneda__procesar = function(es_inicial) { if (!es_inicial) { var nodosaldo = this.ef('saldo').nodo().childNodes[3].childNodes[1].childNodes[1]; var nodomoneda = this.ef('id_moneda').input(); var indice = nodomoneda.selectedIndex; if (indice) { nodosaldo.textContent = ' ' + nodomoneda.options[indice].text; } else { nodosaldo.textContent = ''; } } }

nodomoneda es apunta al combo de monedas, de donde saco la descripcin de la moneda....nodomoneda.options[indice].text es la descripcin de la moneda... nodosaldo apunta a un ef_editable que al lado tiene un punto como unidad (esto se define en toba_editor) Otro ejemplo: la idea en este caso es que aparezca un ef_editable dependiendo del valor descripcion que venia en la seleccion de un combo.
if (!es_inicial) { var nodoid_subdiscp = this.ef('id_subdiscp').input(); var indice = nodoid_subdiscp.selectedIndex; var valor=''; if (indice) { valor = nodoid_subdiscp.options[indice].text; } var resultado = valor.substring(0,3); if(resultado=='OTR'){ this.ef('otra_disciplina_aplicacion').mostrar(); }else{ this.ef('otra_disciplina_aplicacion').ocultar(); } }else{ this.ef('otra_disciplina_aplicacion').ocultar(); }

Cambiar la etiqueta de un ef
13/05/2010 Hay alguna forma de modificar la etiqueta de un ef? El asunto parte de que segn el valor de un campo otro campo puede etiquetarse de forma distinta. Se va a necesitar obtener el elemento del formulario donde se encuentran tanto el ef como su etiqueta. Se debera obtener los datos del TAG HTML que contiene tanto la etiqueta como el

elemento que se busca y de ahi en mas navegar por el DOM y acceder al elemento correspondiente para cambiarle su contenido.
var element = this.dep('form_instrumento').ef('ISIN').nodo(); ... element.childNodes[1].innerHTML = 'Denominacin'; ... element.childNodes[1].innerHTML = 'Cdigo ISIN';

Cambiar estilo de efs solo lectura


16/07/2010

Se puede definir en el toba.css del proyecto algo como lo siguiente:


input[disabled], input[readonly], select[disabled], select[readonly], checkbox[disabled], checkbox[readonly], textarea[disabled], textarea[readonly] { background-color: #FF0000; border: #3532ff 1px solid; color: #000000; cursor: default; }

ei_formulario
Detectar tipo de ef
13/11/2009

Otra posiblidad que tens es aprovecharte de que el dato del tipo ya se conoce estticamente en php, probablemente esta sea la solucin mas robusta aunque no se si se entiende la mezcla php/javascript
class form_x extends toba_ei_formulario { function extender_objeto_js() { echo "{$this->objeto_js}.ini = function () {\n"; foreach ($this->get_efs_activos() as $id_ef) { if (get_class($this->ef($id_ef)) == 'toba_ef_editable') { echo "alert('$id_ef es un editable');\n"; } } echo "}"; } }

Limitar filas en ML
22/01/2010

<?php class formulario_emails extends toba_ei_formulario_ml { function extender_objeto_js() { $limite_filas = $this->controlador()->get_relacion()->tabla('emails')>get_tope_max_filas(); if ($limite_filas == 0) { $limite_filas = 3; } echo " cantidad_filas = {$this->objeto_js}.filas().length; limite_filas = $limite_filas; {$this->objeto_js}.crear_fila_orig = {$this->objeto_js}.crear_fila; {$this->objeto_js}.crear_fila = function() { cantidad_filas++; if (cantidad_filas > limite_filas) { notificacion.agregar('No pueden ingresarse ms de $limite_filas emails', 'error'); notificacion.ventana_modal(); notificacion.limpiar(); cantidad_filas--; return false; } id_fila = this.crear_fila_orig(); }

{$this->objeto_js}.eliminar_fila_orig = {$this->objeto_js}.eliminar_fila; {$this->objeto_js}.eliminar_fila = function(fila) { cantidad_filas--; return this.eliminar_fila_orig(fila); } {$this->objeto_js}.deshacer_orig = {$this->objeto_js}.deshacer; {$this->objeto_js}.deshacer = function() { cantidad_filas++; if (cantidad_filas > limite_filas) { notificacion.agregar('No pueden ingresarse ms de $limite_filas emails', 'error'); notificacion.ventana_modal(); notificacion.limpiar(); cantidad_filas--; return false; } this.deshacer_orig(); } "; } } ?>

Configurar filas de un formulario_ml


14/12/2010

Esto puede realizarse a travs del mtodo conf_fila__nombre_componente que recibe como parmetro la fila del formulario_ml. Ese metodo se va a disparar mientras se este sacando el layout del formulario y asi puedas configurar algo de ultimo momento. Por ejemplo:
function conf_fila__renglones($fila) { if (($this->s__datos[$fila]['columna_condicion'] == true) ) { $this->dep('renglones')->ef('descripcion')->set_solo_lectura(true); }else{ $this->dep('renglones')->ef('descripcion')->set_solo_lectura(false); } }

Colapsar/descolapsar formularios con JS


07/04/2010

Tengo una pantalla que consta de varios formularios. Segn el valor que asume un ef_combo en el formulario "A" debo descolapsar uno de ellos (arrancan todos colapsados) y quiero hacerlo mediante javascript en lugar de poner un botn de aceptar para usar php.
function js_campo_tipo_nov()

{ echo " {$this->objeto_js}.evt__p09tipo_nov__procesar = function() { var tipo_nov = this.ef('p09tipo_nov').get_estado(); switch(tipo_nov) { case 'TBN00': this.controlador.dep('frm_tbn00').descolapsar(); break; } } "; }

Cambiar imagen de evento de fila de en formulario_ml


14/06/2010

Este cdigo permite cambiar la imagen del evento de cada fila de acuerdo al valor de alguno de los datos contenidos en el formulario (incluso, puede ser un ef_oculto).
function conf_evt__alta_baja($evento, $fila) { if ($this->datos[$fila]['vigente'] == true) { $evento->set_imagen('baja.png', 'proyecto'); } else { $evento->set_imagen('alta.png', 'proyecto'); } }

ei_filtro
Fijar la condicin de un elemento de un filtro
17/06/2010

$filtro->columna('id_cooperativa')->set_condicion_fija('es_igual_a');

ei_cuadro
Formatear/Sumarizar columna en Cuadros
Tiempos (horas)
17/06/2009

La idea es armar un nuevo tipo de formato que convierta un entero en H:M:S y usarlo en esa columna, asi lo que sume el cuadro en definitiva sean enteros y el formateo lo pase al formato indicado:
class formateo_proyecto extends toba_formateo *** { /** * @param integer $valor Cantidad total de segundos * @return cadena en formato H:M:S */ function formato_hora($valor) { $segundos = str_pad($valor % 60, 2, 0, STR_PAD_LEFT); $minutos = floor($valor / 60); $horas = floor($minutos / 60); $minutos = str_pad($minutos % 60, 2, 0, STR_PAD_LEFT); return "$horas:$minutos:$segundos"; } } class ci_mio extends toba_ci { function conf__mi_cuadro(toba_ei_cuadro $cuadro) { $cuadro->set_formateo_columna('columna_hora', 'hora', 'formateo_proyecto'); //Recorda siempre pasarle los datos como enteros, si ya lo tenes en //formato hora tendras que aplicar la funcion inversa a formato_hora $datos = array('columna_hora' => 300 'columna_hora' => 5000 ); $cuadro->set_datos($datos); } }

Distintas monedas
19/001/2010

Si cada moneda tiene su columna se puede totalizar usando el tilde "total" en la definicin de la columna. Los importes se pueden enviar como floats y definir un formateo para cada columna para que muestre la moneda en cuestin, por ejemplo:

***

Revisar funcin pasar segundos a horas porque se hizo sin mucha prueba.

class formateo_proyecto extends toba_formateo { function formato_dolar($valor) { return 'U$S '.$valor; } function formato_euro($valor) { return 'E '.$valor; } } class ci_x extends toba_ci { function conf__cuadro(toba_ei_cuadro $cuadro) { $cuadro->set_formateo_columna('importe_dolares', 'dolar', 'formateo_proyecto'); $cuadro->set_formateo_columna('importe_euros', 'euro', 'formateo_proyecto'); } }

Si en cambio hay una nica columna con diferentes formatos (distintas monedas) y se quiere totalizar por moneda usando un <div> o <table> lo que se puede hacer es totalizar a mano en el conf (recorriendo las filas) y sacar un html debajo del cuadro. Por ejemplo pods extender el mtodo generar_html del cuadro:
function generar_html() { parent::generar_html(); $totales = $this->controlador()->get_totales_por_moneda(); echo "<div>"; foreach ($totales as $moneda => $valor) { echo "$moneda: $valor, "; } echo "</div>" }

Colapsar cortes de control por cdigo


14/06/2010

Problema
Hay forma de colapsar todos los cortes de control excepto aquel que tiene la fila seleccionada ($cuadro->seleccionar($clave))? En php pude tomar cual es la fila que se selecciona, eso me mueve a otra pantalla... a la vuelta, pude seleccionar la fila indicada, pero quisiera cerrar todos los cortes, excepto el que contiene a la fila seleccionada.

Solucin
A partir de la version 1.5 se incluye la posibilidad de colapsar o no un corte mediante el uso de una callback. Lo que deberias hacer es definir un metodo conf__cc_inicio_colapsado en el ci controlador que recibe la clave de la fila y te permite colapsar o no dicho corte.

Saneamiento de campo con html en cuadro


15/06/2010

$datos = $this->dep('tabla')->get_listado(); foreach ($datos['valor'] as &$valor) { $valor = texto_plano($valor); } $cuadro->set_datos($datos);

Eventos y vnculos
Como disparar evento de un CI controlador desde un CI interno
01/12/2009

El boton procesar queda en el CI del nivel superior, si necesitas disparar algun metodo particular en un CI interno podrias hacer algo asi:
function evt__procesar() { $this->dep('ci_pestanias')->disparar_metodo_particular(); parent::evt__procesar(); }

Pasar parmetros a un pop-up / vnculos en general


09/12/2009

Hay un ejemplo de esto en el proyecto toba_referencia, operacin "Componentes > Formularios > ef_popup". En ese ejemplo agrega un parmetro al popup desde javascript. http://toba.siu.edu.ar/trac/toba/browser/trunk_versiones/1.3/proyectos/toba_referencia/php/compon entes/efs/ef_popup/form_ef_popup.php Si el valor a enviar se conoce estaticamente en php, la alternativa es hacerlo en la configuracin del formulario.
function conf__form(toba_ei_formulario $form) { $parametros = array('parametro_nuevo' => 'valor'); $form->ef('popup')->vinculo()->set_parametros($parametros); ... }

La forma de atrapar el valor es en el mtodo ini del ci del popup


function ini() { $parametro = toba::memoria()->get_parametro('parametro_nuevo'); if (isset($parametro)) { ... } }

Manipulacin de Datos
Incorporar imagen como dato Blob
14/04/2010

Planteo
Lo que necesitara hacer es algo similar al proyecto referencia, en el ABM de Personas. He logrado cargar y guardar fotos para cada persona, pero me pregunto si hay forma de agregar 2 botones al ef_fijo. El primero para refrescar la imagen a voluntad (es decir, reproducir lo que hace el botn del ef_captcha, o incluso lo que logro al cambiar de pestaa al ser un ci con varias pestaas... al salir y volver, se hace el set_blob y luego el get_blob, por lo que obtengo lo requerido). Sin embargo un requisito ms seria que si es un alta y no se hizo un set an del array porque faltan datos, entonces, no podra forzar el set_blob/get_blob (ya que el registro an no existe), pero supongo que recuperando el archivo, guardandolo en forma temporal, y mostrndolo tiene que funcionar (algo similar a lo que se hace al cargar la imagen de la base de datos, pero desde el sistema de archivos). El segundo para eliminar la imagen, limpiando el ef_fijo y seteando $datos[imagen] en null.

Solucin
En principio me imagino asi la cosa: Los botones los deberias agregar al formulario que contiene la foto y luego sacarlos a mano cuando redefinis el layout por si los queres en una posicion particular. La modificacion te la va a disparar tanto el evento implicito como el boton de refrescar. Luego: La imagen debe estar en un lugar que sea navegable. Para el alta podrias en principio mover el archivo a un lugar seguro y luego con una variable de clase donde tengas los datos(s__nombre_var) ir copiandolo con un nombre random en el directorio navegable y asignandolo al ef_fijo. Al momento de sincronizar vas a tener que agregar los datos del archivo que mantenias en la variable del punto anterior. Para la eliminacion tendrias que eliminar el archivo navegable, limpiar la variable de clase y finalmente limpiar el valor del ef_upload.

Cdigo
function conf__formulario_docente(toba_ei_formulario $form) { $cant_datos = $this->get_relacion()->tabla('docentes')->get_cantidad_filas(); if ($cant_datos > 0) { $datos = $this->get_relacion()->tabla('docentes')->get(); $imagen = $this->get_relacion()->tabla('docentes')->get_blob('foto'); if (isset($imagen)) { $temp_nombre = md5(uniqid(time())); $s__temp_archivo = toba::proyecto()->get_www_temp($temp_nombre); $temp_imagen = fopen($s__temp_archivo['path'], 'w'); stream_copy_to_stream($imagen, $temp_imagen);

fclose($temp_imagen); $tamano = round(filesize($s__temp_archivo['path']) / 1024); $datos['foto_vista_preliminar'] = "<img src='{$s__temp_archivo['url']}' alt=''>"; $datos['foto'] = 'Tamao foto actual: '.$tamano.' kb'; }else { $datos['foto'] = null; //Agrego esto para cuando no existe imagen pero si registro } $form->set_datos($datos); } else { $cfg = dt_cfg_valores_por_defecto::get_configuracion(); $datos['foto'] = null; $form->set_datos_defecto($datos); } } function evt__formulario_docente__imagen_eliminar($datos) { unlink($s__temp_archivo); unset($s__temp_archivo); $this->get_relacion()->tabla('docentes')->set_blob('foto', null); } function evt__formulario_docente__imagen_refrescar($datos) { if (!empty($datos['foto']['name'])) { $this->get_relacion()->tabla('docentes')->set($datos); if (is_array($datos['foto'])) { //Se subio una imagen $s__temp_archivo = $datos['foto']['tmp_name']; $imagen = fopen($s__temp_archivo, 'rb'); $this->get_relacion()->tabla('docentes')->set_blob('foto', $imagen); } } } function evt__formulario_docente__modificacion($datos) { $this->get_relacion()->tabla('docentes')->set($datos); if (is_array($datos['foto'])) { $s__temp_archivo = $datos['foto']['tmp_name']; $imagen = fopen($s__temp_archivo, 'rb'); $this->get_relacion()->tabla('docentes')->set_blob('foto', $imagen); fclose($imagen); } }

PDFs
El cdigo es similar para los PDF, salvando que en lugar de previsualizar la imagen podemos mostrar un enlace al archivo temporal.
$datos['vinculo_certificado'] = "<a href='{$temp_archivo['url']}'>Ver certificado</a>";

Char o VarChar
15/11/2009

Si el tipo de dato que estas utilizando en la bd es CHAR(X) en lugar de VARCHAR(X), probablemente te pueda volver con espacios de relleno al final. Sin embargo al hacerle trim esos espacios deberian volar. Resolucin: Utilizar siempre VarChar y evitarse la utilizacin de Trim para poder comparar cadenas.

Perfiles de datos
04/03/2010

Problema
Hay definidos perfiles funcionales que operan sin problema, llamemoslos perfil1, y perfil2 Los permisos de perfil1 y perfil2 son idnticos, con la salvedad de alguna restriccin funcional sobre perfil2 (hay varias pantallas que no puede ver). Dos usuarios, usuario1 (perfil1) y usuario2 (perfil2) Una tabla que define tipos de un dato, llamese tabla_tipos_datos estructura: id, nombre datos ya cargados: (1, tipo1), (2, tipo2) solo se modificar en condiciones extremas, y solo por el administrador de la base de datos, pero como eventualmente puede variar, se decidi hacerlo "dinmico". Una tabla con los datos propiamente, llamese tabla_datos con la siguiente estructura: id, descripcion, id_tipo_dato

El problema es de que forma definir lo siguiente, en forma general, y que provea el mayor dinamismo posible, asociado un posible cambio de la tabla de tipos de datos: los usuarios de perfil1, e.g. usuario1, solo podr ingresar/modificar o eliminar datos de tipo1. los usuarios de perfil2, e.g. usuario2, solo podr ingresar/modificar o eliminar datos de tipo2.

Solucin
Debe crearse una Dimensin, incluyendo la tabla como Gatillo Directo. Luego un perfil de datos y asignarle esa dimensin. Luego asignar al usuario ese perfil de datos.

En el cdigo de las consultas involucradas debe modificarse la llamada incorporando los filtros de los perfiles de datos previos a la ejecucin de las mismas.
$sql = "xxxxxx"; $sql = toba::perfil_de_datos()->filtrar($sql); return toba::db('soporte')->consultar($sql);

CN
22/03/2010

Te cuento como lo veo yo, puede ser que haya sido utilizado en algn proyecto con otra filosofa. Toba requiere una divisin mnima de capas: Elementos de interface (cuadros, formularios, etc.), son widgets parametrizables que por lo general no tienen codigo del proyecto, slo definiciones. Controladores de interface (ci): dan y reciben datos a los cuadros/formularios, y reaccionan a los botones (eventos). La lgica de cmo surgen los datos y que hacer con los mismos la pods resolver directamente en los CIs. Por ejemplo al evento 'inscribir', podes hacer las validaciones, armar el comando SQL mandar un mail todo dentro del 'evt__inscribir' del CI. Esto sera la arquitectura ms basica de una aplicacin Toba. A medida que el proyecto crece, las necesidades de reuso y divisin de responsabilidades se van notando, y probablemente procesar las cosas dentro de los eventos y traer los datos dentro del conf__ ya empieze a generar ruido. Es all donde suje la necesidad de armar una capa de negocio propia del proyecto, que puede ir desde un conjunto de funciones sueltas (ej. inscribir() enviar_mail() get_inscripciones()) a un modelo de objetos mas complejo donde por ejemplo existan clases como alumno, inscripcion, mail, etc. En los CIs harias llamadas directas a estas clases. Este sera el siguiente grado de arquitectura. Los CN's son una ayuda a esta ltima arquitectura. Es practicamente un componente vaco (no tiene lgica) que podes acoplar al arbol de componentes de una operacin. Es una forma de decir "esta clase que es 100% ma la quiero ver en el arbol de la operacin", la misma es accesible por todo el arbol de la operacin. Entonces en los distintos CI's de una operacin podes hacer

llamadas a este CN y dentro del mismo hacer las llamadas al negocio puro de tu proyecto. Desde ese punto de vista funciona como un hub de las clases de negocios. Desde ya esto podras hacerlo con una clase totalmente propia, pero la idea que seduce es tenerlo catalogado dentro del editor Toba y algunas utilidades como almacenar variables en sesin automticamente (siguiendo la convencin 's__variable').

Como saber si una consulta est cargada al ingresar a un formulario.


04/04/2010

Si la operacion necesita de manera fija que un registro venga cargado entonces el esta_cargada te viene barbaro, si es una operacion en la cual no hay tabs, y se vuelve a una pantalla de seleccion al guardar entonces no te das cuenta del error. El tema surge cuando hay varios tabs y se navega libremente entre ellos, sumado a que se entra en modo 'Alta'. En particular si lo que necesitas es saber si hay datos para mostrarlos te diria que uses siempre el get_cantidad_filas(), si necesitas saber si los registros existen en bd para tomar alguna accion en base a eso ahi si utilizaria el esta_cargada, ya que es molesto elegir una tabla "testigo". Por lo pronto hay 2 opciones: En los metodos de modificacion utilizas el metodo set_cargado(true) para indicar que la relacion esta cargada, el problema de esto es que te puede traer fantasmas en alguno de los formularios ya que dicho metodo afecta toda la relacion y no individualmente a las tablas Modificar el metodo conf__ del formulario para contemplar la diferencia de interpretacion
function conf__formulario_materia_dictado(toba_ei_formulario $form) { $cant_datos = $this->get_relacion->tabla('materias_dictados')->get_cantidad_filas(); //Contamos la cantidad de filas que tiene, debe tener 1 fila si hay datos if ($cant_datos > 0) { $datos = $this->get_relacion()->tabla('materias_dictados')->get(); $form->set_datos($datos); } }

En general a nivel de Ci's se debera utilizar casi siempre la cantidad de filas como indicador.

Varias BD - Un solo Proyecto


05/04/2010

La idea es generar un nico proyecto que segn que usuario se conecte, permita el acceso a una base de datos u otra. Las bases de datos son independientes unas de otras: mas alla de que la estructura es la misma, los datos no lo son.

<?php class proyecto_fuente_datos extends toba_fuente_datos { /** * Previo a conectarse a la fuente de datos chequea en la base central */ function pre_conectar() { // si el editor esta activado, entonces la fuente funciona con los // parametros indicados en el editor (bases.ini)... if (toba_editor::activado()) { toba::logger()->debug('*** MODO EDITOR ***'); return; } $base_uacad = toba::memoria()->get_dato("base_uacad"); if (!isset($base_uacad)) { //Busca la UA del usuario actual en la base central $db_central = toba::db('central'); $datos = $db_central->consultar_fila("SELECT uacad FROM person WHERE persona = ". $db_central->quote(toba::usuario()->get_id())); if (empty($datos)) { throw new toba_error("No existe la persona ".toba::usuario()>get_id()); } $base_uacad = $datos['uacad']; toba::memoria()->set_dato("base_uacad", $base_uacad); } //Crea el id de bases.ini, por ejemplo [desarrollo toba_referencia toba_referencia] $base_id = toba::instancia()->get_id().' '.$this->definicion['proyecto'].' '.$this>definicion['fuente_datos']; //Obtiene los parametros actuales $parametros = toba_dba::get_parametros_base($base_id); //Cambia unicamente la base $parametros['base'] = $base_uacad; //Hace que el DBA recuerde los nuevos parametros por este request toba_dba::set_parametros_base($base_id, $parametros); } } ?>

Transaccionar modificaciones simultneas de N datos_tablas


11/06/2010

Para ello puede desactivarse la transaccin automtica que se genera al utilizar el mtodo sincronizar(), y manejarlo en forma manual.
function evt__guardar() { $this->dep('tabla_personas')->get_persistidor()->desactivar_transaccion(); $this->dep('tabla_funcion')->get_persistidor()->desactivar_transaccion(); $this->dep('tabla_persona_funcion')->get_persistidor()->desactivar_transaccion(); toba::db()->abrir_transaccion(); try { $this->dep('tabla_personas')->sincronizar(); $id_persona = toba::db()->recuperar_secuencia('personas_seq'); $this->dep('tabla_funcion')->sincronizar(); $id_funcion = toba::db()->recuperar_secuencia('funcion_seq');

$this->dep('tabla_persona_funcion')->nueva_fila( array('id_persona' => $id_persona, 'id_funcion' => $id_funcion)); $this->dep('tabla_persona_funcion')->sincronizar(); toba::db()->cerrar_transaccion(); }catch($e toba_error_db) { toba::db()->abortar_transaccion(); throw $e; } }

Exportacin
Armar PDF con Encabezado y Pie de Pgina
23/11/2009

function vista_pdf(toba_vista_pdf $salida) { //Cambio lo mrgenes accediendo directamente a la librera PDF $pdf = $salida->get_pdf(); $pdf->ezSetMargins(80, 50, 30, 30); //top, bottom, left, right //Pie de pgina $formato = 'Pgina {PAGENUM} de {TOTALPAGENUM}'; $pdf->ezStartPageNumbers(300, 20, 8, 'left', $formato, 1); //x, y, size, pos, texto, pagina inicio //Invoco la salida pdf original del cuadro parent::vista_pdf($salida); //Encabezado foreach ($pdf->ezPages as $pageNum=>$id){ $pdf->reopenObject($id); $imagen = toba::proyecto()->get_path().'/www/img/logo_toba_siu.jpg'; $pdf->addJpegFromFile($imagen, 50, 780, 141, 45); //imagen, x, y, ancho, alto $pdf->closeObject(); } }

La imagen solo soporta jpg y png, estos ltimos no pueden tener transparencias. Si se le da un archivo no existente o incorrecto no tira error y no se muestra. Esto lo hace dificil de debuggear. Existe una linea que enva al logger los mensajes internos de la librera, hacindolos accesibles usando $pdf->messages, de tipo string. Se est accediendo directamente a variables y mtodos de la librera ezPDF. No parece muy estable y cuidada. Tener en cuenta que cualquier cambio de versin puede llegar a romper esta extensin.

Armar encabezados dinmicos en PDF


20/01/2010

El asunto es que para un sistema de calificaciones, un estudiante puede tener de 1 a n pginas y varia para otro, pero en cada pgina por normas de certificacin debe tener el nombre del estudiante.
$paginas = array(); //A medida que saco la info de los estudiantes guardo las paginas de cada uno foreach ($estudiantes as $id_estudiante => $estudiante) { $inicio = $pdf->ezGetCurrentPageNumber(); //Aqui Agregar datos del estudiante al $pdf $fin = $pdf->ezGetCurrentPageNumber();

for (int $i = $inicio; $i <= $fin; $i++) { $paginas[$i] = $id_estudiante; } $pdf->ezNewPage(); } foreach ($pdf->ezPages as $pageNum=>$id){ $id_estudiante = $paginas[$pageNum]; $pdf->reopenObject($id); $pdf->ezSetDy(100); $pdf->ezText($estudiantes[$id_estudiante]['nombre']); $pdf->closeObject() }

Archivos
Descargar archivos
13/01/2010

Suponiendo que se tiene una operacin que lista los archivos segn el usuario actual (usando por ejemplo toba::usuario()->get_id()) una forma de descargar dicho archivo es hacer otra operacin en cuyas propiedades tenga "Solicitud PHP Plano". En la operacin que lista los archivos, hay que hacer un vinculo a esta nueva operacin y enviarle por GET el id del archivo a bajar.
$parametros = array('id_archivo' => <id_archivo); toba::vinculador()->get_url(null, <id_operacion_descarga>, $parametros);

El receptor de este vinculo debera escuchar este parametro y, validacion mediante de que puede efectivamente verlo, enviarlo al cliente:
$file = toba::memoria()->get_parametro('id_archivo'); if (file_exists($file)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; }

Si el archivo fisicamente esta en la base de datos se puede consultar con un SELECT comn, Php retorna un file pointer al archivo y con fread puede enviarse directamente al cliente.

Importar archivos de texto


17/02/2010

<?php class antiguedad { function procesar_antig() { $respuesta = ""; $archivo = "archivo.txt"; if (file_exists($archivo)) {

//verifico la fecha del archivo .txt $fecha_modif = date("d/m/Y",filemtime($archivo));; $limite1 = time() + (-7 * 24 * 60 * 60); $limite2 = time() + (-30 * 24 * 60 * 60); $semana = date('Y-m-d', $limite1); $mes = date('Y-m-d', $limite2); if ($fecha_modif < $mes) { $respuesta = "Error! Debe volver a generar el archivo"; } else { if ($fecha_modif < $semana) { $respuesta = "Advertencia! La informacin tiene mas de una semana de antigedad"; } //abro el archivo como solo lectura n("c:\\archivo.txt", "r"); $v = file($archivo); $cantidad = count($v); $dbconn2 = pg_connect("dbname=pepe user=pepe password=pepe"); $result = pg_query($dbconn2, "DELETE FROM prueba"); for ($i=0; $i<$cantidad; $i++) { $registro = $v[$i]; if ($dbconn2) { //'corto' el registro segn el largo de cada campo $var01 = substr($registro, 0, 4); $var02 = substr($registro, 4, 4); $var03 = substr($registro, 8, 4); $var04 = substr($registro, 12, 4); . . . $result = pg_query($dbconn2, "INSERT INTO prueba VALUES ('$var01' ,'$var02','$var03', '$var04'......"); $respuesta = "Actualizacin realizada"; } else { echo "No hubo conexin"; } } fclose($dh); } } else { //el archivo no existe } return $respuesta; } } ?>

Para no tener que preocuparse del tamao de los campos, ni depender de que la cantidad de caracteres sea siempre la misma es usar separadores entre cada campo que exportan/importan. Para leerlo lo pueden recuperar con la funcion fgetcsv , les paso un ejemplo del manual de PHP:
<?php $row = 1; $handle = fopen("test.csv", "r"); while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); echo "<p> $num fields in line $row: <br /></p>\n"; $row++; for ($c=0; $c < $num; $c++) {

echo $data[$c] . "<br />\n"; } } fclose($handle); ?>

Skins
(c) Alejandra Askenazi UNPSJB 21/06/2010

Un skin incluye: Una plantilla grfica CSS que determina colores, bordes y segn la circunstancia disposiciones. Para saber que clase debemos modificar dentro del archivo css podemos utilizar Firebug. Un conjunto de imgenes comunes que utilizan los componentes, la idea es que concuerden con el aspecto de la plantilla.

Definir el skin a utilizar


Cada proyecto puede definir cual es el Skin que se va a utilizar. Usando el editor ir a la Configuracin y luego a Propiedades Bsicas. All estn disponibles los skins generales y los propios del proyecto.

Extensin de un skin existente


El orden de inclusin de los estilos habilita que el toba.css del proyecto tenga prioridad en todos los estilos. Por lo que para cambiar cualquier detalle del skin o del css general de toba basta crear un archivo toba.css en la carpeta www del proyecto.

Creacin de un skin propio del proyecto


Cuando se quiere crear un estilo grfico completamente nuevo es recomendable crear un skin propio. Para ello: Usando el editor ir a la Configuracin y luego al ABM de skins Agregar un nuevo registro con el nombre del skin y luego guardarlo. Crear dentro de la carpeta www la carpeta Skins y dentro de la misma una carpeta con el nombre del skin recientemente creado, por Ej /www/skins/Skin_prueba, se puede utilizar como base alguno existente en $toba_dir/www/skins. Para comenzar se podra importar los colores de un skin existente. Por Ej. de Plastik. Luego modificar los colores que se necesiten e ir previsualizando el proyecto para ver los cambios.

Una consideracin a tener en cuenta es que no todos los colores de la interfaz grfica se pueden cambiar desde esta funcionalidad del editor del toba, algunas partes estn compuestas por imgenes que se encuentran en la carpeta del proyecto y otras secciones de modifican desde el archivo toba.css.

toba.css
Este archivo se puede copiar de otro proyecto existente, para luego realizar las modificaciones necesarias.

Imgenes
Dentro de la carpeta \www\img del proyecto se encuentran los archivos Logo.gif y logo_grande.gif los mismos se corresponden con la imagen que se muestra a la izquierda del men y la central de la operacin Inicio. Se pueden reemplazar estas dos imgenes, teniendo en cuenta que los archivos nuevos deben estar nombrados de la misma forma que los archivos a reemplazar. Otras imgenes que se deben agregar a nuestra carpeta Skin_prueba se pueden copiar de un proyecto existente, de la carpeta Plastik por ejemplo, son la carpeta tabs y la imagen barrasup.gif, esta ltima determina una parte importante de la interfaz grfica, ya que es el fondo de la barra de ttulo de las operaciones, cuadros, etc.

ChartDirector
Grficas con ChartDirector mostradas en un ef_fijo
19/04/2010

function conf__form_grafica() { $fp_imagen = ci_consolidado_indicadores::get_grafica ( ); if (isset($fp_imagen)) { //Se necesita el path fisico y la url de una archivo temporal que va a contener la imagen $temp_nombre = md5(uniqid(time())); $temp_archivo = toba::proyecto()->get_www_temp($temp_nombre); //Se pasa el contenido al archivo temporal $temp_fp = fopen($temp_archivo['path'], 'w'); //stream_copy_to_stream($fp_imagen, $temp_fp); fwrite($temp_fp, $fp_imagen); fclose($temp_fp); $tamao = round(filesize($temp_archivo['path']) / 1024); $datos['vista_previa'] = "<img src='{$temp_archivo['url']}' alt=''>"; } else { $datos['vista_previa'] = null; } return $datos; } function get_grafica() { require_once(toba_dir() . '/php/3ros/ChartDirector/lib/phpchartdir.php'); # The data for the pie chart $data = array(25, 18, 15, 12, 8, 30, 35); # The labels for the pie chart $labels = array("Labor", "Licenses", "Taxes", "Legal", "Insurance", "Facilities", "Production"); # Create a PieChart object of size 360 x 300 pixels $c = new PieChart(360, 300); # Set the center of the pie at (180, 140) and the radius to 100 pixels $c->setPieSize(180, 140, 100); # Set the pie data and the pie labels $c->setData($data, $labels); # Output the chart header("Content-type: image/png"); //print($c->makeChart2(PNG)); return ($c->makeChart2(PNG)); }

General
Fijar la barra de men
15/03/2011

Puede realizarse por CSS, editando el toba.css del proyecto aadiendo la propiedad position:fixed; a la clase .encabezado.

Salto de lnea en archivos de texto


08/06/2010

Cuando necesitas grabar algun archivo de texto e incluso en ese caso debes tener en cuenta la diferencia entre los windows y los unix like. Toba brinda, para estos casos:
toba_varios::salto_linea();

Ordenar array sobre los datos de una columna


20/11/2009

En la clase toba_varios existe la funcion rs_ordenar_por_columna la cual te permite ordenar un recordset por una columna determinada, lo que necesitarias es que el apellido este entre los datos que vas a ordenar antes de pasarselo al ML. Por ejemplo:
function conf__formulario(toba_ei_formulario_ml $form) { $datos = $this->get_filas(); $rs = rs_ordenar_por_columna ($datos, 'apellido'); $form->set_datos($rs); } function get_filas() { return array( array('id_persona' => 1, 'apellido' => 'Franco' , 'nota' => 1), array('id_persona' => 3, 'apellido' => 'Riverito' , 'nota' => 4), array('id_persona' => 134, 'apellido' => 'Pepote' , 'nota' => 7) ); }

Acceder al sistema de usuarios desde mi proyecto


28/06/2010

Si quieren acceder la operacion desde menu entonces lo que tienen que hacer es un item de tipo (PHP plano) que contenga el siguiente cdigo y luego se le asignan los permisos correspondientes para aquellos usuarios que deban verla y listo.

<?php //-- Se deja en sesion cual es la instancia que se necesita editar toba::memoria()->set_dato_instancia('instancia', toba::instancia()->get_id()); //El parametro proyecto_hint marca cual es el proyecto por defecto a utilizar toba::memoria()->set_dato_instancia('proyecto_hint', toba::proyecto()->get_id()); //-- Se pide la url de la operacin prinicipal de toba_usuarios $url = toba::vinculador()->get_url('toba_usuarios', '1000228', array(), array('celda_memoria' => 'usuarios')); if (isset($url) || $url != '') { echo toba_js::abrir(); echo " var opciones = {'width': 1000, 'scrollbars' : 1, 'height': 600, 'resizable': 1}; abrir_popup('usuarios', '$url', opciones); "; echo toba_js::cerrar(); } else { throw new toba_error('Para administrar usuarios es necesario tener cargado el '. 'proyecto toba_usuarios en la instancia junto a NOMBRE DE TU PROYECTO'); } ?>

Cartel de espera
07/04/2010

La implementacin es as A alto nivel hay una configuracin bsica del proyecto 'Demora cartel espera (ms)'. Si pones un numero distinto a cero el cartel se muestra solo superado el tiempo ingresado. A bajo nivel si vos queres que el cartel salga en un pedido de pgina puntual deberias setear la variable javascript toba_espera. Por ejemplo si en javascript pones toba_espera = 1, luego de 1ms de enviar el formulario te muestra el cartel Ms bajo nivel an, si no quers esperar a que toba muestre el cartel y lo queres mostrarlo manualmente tens que invocar la funcin javascript "mostrar_esperar()"

Function`s cyclomatic complexity (n) exceeds allowed maximum


21/05/2010

Mas alla del error puntual que entrega el editor, el cual esta relacionado al analisis que se hace para sugerir ciertas convenciones, el hecho de que tengas una complejidad semejante en una funcion es para prestarle atencion. Basicamente lo que te estaria indicando este numero es que hay 30 caminos posibles dentro de tu funcion por los cuales se puede pasar dependiendo de los valores de los datos. Si muy mal no recuerdo creo que el maximo recomendado suele andar alrededor de 7, la complejidad suele afectar tanto la legibilidad del codigo, su mantenimiento y depuracion... a mayor complejidad... menor es la calidad de todo lo que enumere antes. Generalmente este tipo de funciones tienen una cantidad de condicionales abismal.. ya sean anidados o no. Lo que podes hacer para evitar esta situacion es tratar de ir separando en distintos metodos porciones que tengan funcionalidad especifica para que el metodo principal sea mas legible y las distintas acciones vayan quedando mas encapsuladas.

PHP
Fatal error: Allowed memory size of
23/03/2010

Cuando se encuentren con un mensaje de la forma 'Fatal error: Allowed memory size of xxxx bytes exhausted (tried to allocate xxxx bytes)' no se asusten, simplemente el inconveniente se encuentra en que el script que estan ejecutando alcanzo el maximo de memoria permitido para su ejecucion. Hay dos soluciones para este problema: La mas simple es incrementar el valor de la clausula memory_limit en el archivo php.ini (tanto su version de apache como cliente de comandos) La segunda opcion implica revisar que parte del codigo esta consumiendo la memoria sin liberarla, hacer la liberacion explicita puede ralentizar un poco el proceso, pero se evita llegar al maximo de memoria permitido si el GC no entra en ejecucion Como todos se imaginaran la opcion dos es la recomendada para llevar adelante, en caso de no poder optimizar mas el script entonces por defecto terminaremos en la opcion uno pero siempre teniendo en cuenta que se trata de una solucion temporal y que en algun momento dicho limite se puede alcanzar nuevamente.

PHP 5.3.0
03/11/2009

PHP Warning: date(): It is not safe to rely on the system's timezone settings: Hay que indicar el timezone de PHP, esto se hace editando el archivo php.ini, por ejemplo
date.timezone = America/Argentina/Buenos_Aires

S-ar putea să vă placă și