예제 #1
0
 /**
  * Retorna una fuente de datos
  *
  * @param string $id Id. de la fuente
  * @param string $proyecto Proyecto al que pertenece la fuente
  * @return toba_fuente_datos
  */
 function get_fuente($id, $proyecto = null)
 {
     if (!isset($proyecto)) {
         $proyecto = toba::proyecto()->get_id();
     }
     if (!isset($id)) {
         $id = $this->get_fuente_predeterminada(true, $proyecto);
     }
     if (!isset($this->fuentes[$id])) {
         $parametros = toba::proyecto()->get_info_fuente_datos($id, $proyecto);
         $clase = isset($parametros['subclase_nombre']) ? $parametros['subclase_nombre'] : 'toba_fuente_datos';
         if (isset($parametros['subclase_archivo'])) {
             $pm = $parametros['punto_montaje'];
             if (toba::proyecto()->get_id() != $proyecto) {
                 //Si la fuente esta extendida, puede necesitar otros archivos del proyecto, agregar el include path
                 $path_proyecto = toba::instancia()->get_path_proyecto($proyecto) . '/php';
                 agregar_dir_include_path($path_proyecto);
             }
             $archivo = $parametros['subclase_archivo'];
             toba_cargador::cargar_clase_archivo($pm, $archivo, $proyecto);
         }
         $this->fuentes[$id] = new $clase($parametros);
     }
     return $this->fuentes[$id];
 }
예제 #2
0
 function evt__borrar()
 {
     $schema_logs = toba::instancia()->get_db()->get_schema() . '_logs';
     $sql = "DELETE FROM {$schema_logs}.apex_solicitud_cronometro";
     toba::instancia()->get_db()->ejecutar($sql);
     $this->s__solicitud = null;
 }
예제 #3
0
 protected static function get_modelo_proyecto($proyecto_id)
 {
     if (!isset(self::$modelo_proyecto)) {
         $modelo = toba_modelo_catalogo::instanciacion();
         $modelo->set_db(toba::db());
         self::$modelo_proyecto = $modelo->get_proyecto(toba::instancia()->get_id(), $proyecto_id);
     }
 }
예제 #4
0
 protected static function get_instancia()
 {
     if (PHP_SAPI != 'cli') {
         return toba::instancia();
     }
     return toba_modelo_catalogo::instanciacion()->get_instancia(toba_instancia::get_id());
     //Por si en algun momento se llega a usar desde el modelo
 }
예제 #5
0
 /**
  * 	Guardar el la base las marcas del CRONOMETRO
  */
 function registrar($proyecto, $solicitud)
 {
     $this->marcar("Fin medición");
     //dump_arbol($this->marcas);
     for ($f = 0; $f < count($this->marcas); $f++) {
         toba::instancia()->registrar_marca_cronometro($proyecto, $solicitud, $f, $this->marcas[$f]['niv'], $this->marcas[$f]['n'], $this->marcas[$f]['t']);
     }
 }
예제 #6
0
 function conf__datos()
 {
     $parametros = toba_editor::get_parametros_previsualizacion();
     if (!isset($parametros)) {
         $parametros['punto_acceso'] = toba::instancia()->get_url_proyecto(toba_editor::get_proyecto_cargado());
     }
     return $parametros;
 }
예제 #7
0
 function conf__listado()
 {
     $inicial = toba::memoria()->get_parametro('ef_popup_valor');
     $absoluto = toba::instancia()->get_path_proyecto(toba_editor::get_proyecto_cargado()) . '/php/';
     $this->dependencia('listado')->set_path_absoluto($absoluto);
     if ($inicial != null) {
         $this->dependencia('listado')->set_path(dirname($inicial));
     }
 }
예제 #8
0
 function get_modelo_proyecto()
 {
     if (!isset($this->modelo_proyecto)) {
         $modelo = toba_modelo_catalogo::instanciacion();
         $modelo->set_db(toba::db());
         $this->modelo_proyecto = $modelo->get_proyecto(toba::instancia()->get_id(), $this->s__datos_proyecto['proyecto']);
     }
     return $this->modelo_proyecto;
 }
예제 #9
0
파일: casos_web.php 프로젝트: emma5021/toba
 function ini()
 {
     $proyecto = toba_editor::activado() ? toba_editor::get_proyecto_cargado() : toba::proyecto()->get_id();
     $path = toba::instancia()->get_path_proyecto($proyecto);
     if (file_exists($path . self::$path_autoload_sel)) {
         require_once $path . self::$path_autoload_sel;
         spl_autoload_register(array('test_selenium_autoload', 'cargar'));
     }
 }
예제 #10
0
 protected static function cargar_ini($id)
 {
     if (!isset(self::$ini)) {
         $modelo = toba_modelo_catalogo::instanciacion();
         $modelo->set_db(toba::db());
         $proyecto = $modelo->get_proyecto(toba::instancia()->get_id(), toba::proyecto()->get_id());
         self::$ini = toba_modelo_servicio_web::get_ini_server($proyecto, $id);
     }
 }
예제 #11
0
 function conf__form_opciones(toba_ei_formulario $form)
 {
     $proyecto = toba_editor::get_proyecto_cargado();
     $datos_defecto = array('host' => 'http://localhost', 'url' => toba::instancia()->get_url_proyecto($proyecto), 'path' => toba::instancia()->get_path_proyecto($proyecto) . '/testing/selenium', 'archivo' => 'cobertura.html');
     $form->set_datos_defecto($datos_defecto);
     if (isset($this->s__opciones)) {
         $form->set_datos($this->s__opciones);
     }
 }
예제 #12
0
파일: ci_jasper.php 프로젝트: emma5021/toba
 function vista_jasperreports(toba_vista_jasperreports $report)
 {
     $path = toba::memoria()->get_parametro('path');
     if (!isset($path) || !is_numeric($path) || !isset($this->s__paths[$path])) {
         throw new toba_error_def("Parámetro no definido");
     }
     $report->set_path_reporte($this->s__paths[$path]);
     $db = toba::instancia()->get_db();
     $report->set_conexion($db);
 }
예제 #13
0
 function mostrar_solicitud($id_solicitud, $ancho = "100%")
 {
     $schema_logs = toba::instancia()->get_db()->get_schema() . '_logs';
     $id_solicitud = addslashes($id_solicitud);
     $sql = "SELECT marca, nivel_ejecucion as nivel, texto, tiempo FROM {$schema_logs}.apex_solicitud_cronometro\n\t\t\t\t\tWHERE solicitud = " . quote($id_solicitud) . ' ORDER BY marca';
     $rs = toba::instancia()->get_db()->consultar($sql);
     if (empty($rs)) {
         throw new toba_error("No se encuentra la solicitud {$id_solicitud}");
     }
     $this->mostrar_cronometro($id_solicitud, $rs, $ancho);
 }
예제 #14
0
 function conf__inicial($datos = null)
 {
     if (!isset($datos)) {
         throw new toba_error('ERROR: El editor no se cargo correctamente.');
     }
     $instancia = toba::instancia()->get_id();
     toba_editor::iniciar($instancia, $datos['proyecto']);
     //Seteo el valor en la memoria global para toba_usuarios
     toba::memoria()->set_dato_instancia('instancia', $instancia);
     toba::memoria()->set_dato_instancia('proyecto', $datos['proyecto']);
 }
예제 #15
0
 static function get_personalizacion_iniciada($proyecto)
 {
     $path_proyecto = toba::instancia()->get_path_proyecto($proyecto);
     $path_pers = $path_proyecto . '/' . toba_personalizacion::dir_personalizacion;
     $ini_path = $path_pers . '/personalizacion.ini';
     if (is_file($ini_path)) {
         $ini = new toba_ini($ini_path);
         return $ini->get_datos_entrada('iniciada') == 'si';
     } else {
         return false;
     }
 }
예제 #16
0
 public static function log($message)
 {
     if (self::ENABLE_LOGGING) {
         $dir_base = toba::instancia()->get_path_instalacion_proyecto(toba::proyecto()->get_id()) . '/logs/';
         if (self::$fh == null) {
             self::$fh = fopen($dir_base . self::LOGGING_FILENAME, 'a');
         }
         $args = func_get_args();
         $arg = call_user_func_array('sprintf', $args);
         fputs(self::$fh, sprintf("[%s] %s: %s\n", date('r'), self::getCaller(), $arg));
     }
 }
예제 #17
0
 function registrar($llamada = null)
 {
     if (isset($llamada)) {
         $str_llamada = addslashes(implode(" ", $llamada));
         echo $str_llamada;
     } else {
         $str_llamada = "";
     }
     parent::registrar();
     if ($this->registrar_db) {
         toba::instancia()->registrar_solicitud_consola($this->info['basica']['item_proyecto'], $this->id, $this->usuario, $str_llamada);
     }
 }
예제 #18
0
 protected function get_path_clonacion($id_punto, $proyecto, $path_default = '')
 {
     $path_final = $path_default;
     $pm = toba_pms::instancia()->get_instancia_pm_proyecto($proyecto, $id_punto);
     //Instancio el pm para el proyecto
     if (!is_null($pm)) {
         $path_final = $pm->get_path_absoluto() . '/';
         //Si existe recupero el path al punto, sino uso el generico del proyecto
     } elseif (isset($proyecto)) {
         $path_final = toba::instancia()->get_path_proyecto($proyecto) . '/php/';
     }
     return $path_final;
 }
예제 #19
0
 function get_path()
 {
     if (empty($this->path)) {
         $path_instancia_ini = toba::instancia()->get_path_ini();
         $instancia_ini = new toba_ini($path_instancia_ini);
         $datos = $instancia_ini->get($this->get_proyecto());
         $nombre = toba_modelo_pms::prefijo_ini . $this->get_etiqueta();
         if (!isset($datos[$nombre])) {
             throw new toba_error("Punto de montaje: el punto de montaje\n\t\t\t\t\t'{$this->get_etiqueta()}' no existe en {$path_instancia_ini}.\n\t\t\t\t\tDebe agregar en instancia.ini la entrada\n\t\t\t\t\t'pm_{$this->get_etiqueta()} = path' donde path es la ubicación\n\t\t\t\t\tabsoluta en el sistema de archivos. Esta entrada debe ir en\n\t\t\t\t\tla sección [{$this->get_proyecto()}]");
         }
         $this->path = $datos[$nombre];
     }
     return $this->path;
 }
예제 #20
0
 function get_lista_proyectos()
 {
     $instancia_id = toba::instancia()->get_id();
     $instancia = toba_modelo_catalogo::instanciacion()->get_instancia($instancia_id, new toba_mock_proceso_gui());
     $proyectos = $instancia->get_lista_proyectos_vinculados();
     $datos = array();
     $a = 0;
     foreach ($proyectos as $x) {
         $datos[$a]['id'] = $x;
         $datos[$a]['desc'] = $x;
         $a++;
     }
     return $datos;
 }
예제 #21
0
 function conf__cuadro(toba_ei_cuadro $cuadro)
 {
     $archivos = toba::memoria()->get_dato_instancia('previsualizacion_archivos');
     if (!isset($archivos)) {
         throw new toba_error('No se encontraron los archivos a mostrar');
     }
     $path_proyecto = toba_manejador_archivos::path_a_unix(toba::instancia()->get_path_proyecto(toba_editor::get_proyecto_cargado()));
     $path_php = $path_proyecto . '/php/';
     $cuadro->set_formateo_columna('tamano', 'tamano', 'formateo_tamano');
     $datos = array();
     foreach ($archivos as $i => $archivo) {
         $datos[$i]['path'] = substr($archivo, strlen($path_proyecto) + 1);
         $datos[$i]['tamano'] = filesize($archivo);
     }
     $cuadro->set_datos($datos);
 }
예제 #22
0
    function generar_layout()
    {
        $codigo_ej = '
<?php 
	class ci_pago extends toba_ci
	{		
			/**
			 * Atención de un evento "pagar" de un formulario
			 */
		    function evt__form_pago__pagar($datos)
		    {
		    	$this->s__pago = $datos;
		    	$this->set_pantalla("pant_ubicacion");
		    }

		    /**
		     * Redefinición de un método
		     */
			function ini()
			{
				$this->valor_defecto = 0;
			}		    
		    
			/**
			 * Redefinición de un método para extender el componente en Javascript
			 */
		    function extender_objeto_js()
		    {
		    	echo "
		    		/**
		    		 * Atención del evento procesar de este componente
		    		 */
		    		{$this->objeto_js}.evt__procesar = function() {
		    			return prompt(\\"Desea Procesar?\\");
		    		}
		    	";
		    }
	}
?>
		';
        $ventana = toba::instancia()->get_url_proyecto('toba_editor') . "/doc/api/media/ventana.png";
        $api = toba_parser_ayuda::parsear_api('li_Componentes', 'documentación API', 'toba_editor');
        echo "\n\t\t\t<p>\n\t\t\tEl comportamiento de un componente se basa en su definición y,\n\t\t\ten distinta medida según el tipo, su extensión en código.\n\t\t\t</p>\n\t\t\t<p>\n\t\t\tLa extensión en código se da a través de la <strong>herencia</strong>, creando una subclase del componente en cuestión \n\t\t\ty seleccionandola durante la definición del componente en el editor. Se podrían definir tres objetivos distintos a la hora de hacer una extensión\n\t\t\tde un componente:\n\t\t\t<ul>\n\t\t\t\t<li><strong>Atender eventos</strong>: El componente notifica <em>sucesos</em>\n\t\t\t\t\ty en la extensión se escuchan. A esta comunicación se la denomina <em>eventos</em> y sa la ve\n\t\t\t\t\tmás adelante en el tutorial.\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t<li><strong>Redefinir métodos</strong>: En la {$api} los métodos recomendados para \n\t\t\t\t\textender llevan a su lado un ícono de ventana\n\t\t\t\t\t<img src='{$ventana}'>. \n\t\t\t\t\tOtros métodos protegidos son extensibles también, pero si no poseen la ventana \n\t\t\t\t\tno se asegura que en futura versiones del framework serán soportados, ya que lo que \n\t\t\t\t\tse está extendiendo es un método interno.\n\t\t\t\t\n\t\t\t\t<li><strong>Extender el componente en Javascript</strong>: Cada componente en PHP tiene su par en Javascript, \n\t\t\t\tpor lo que en la extensión también es posible variar el comportamiento del componente en el cliente.\n\t\t\t</ul>\n\t\t\t</p>\n\t\t\t<h3>Ejemplo</h3>\t\t\t\n\t\t\t<p>\n\t\t\tPara tener una idea de como 'luce' una extensión, se presenta una extensión típica de un componente controlador. La idea no es entender en profundidad esta extensión sino es para \n\t\t\ttomar un primer contacto. Como se ve en los comentarios del código, en este caso se consumieron las formas de extensión vistas:\n\t\t\t</p>\n\t\t";
        echo "<div class='codigo'>";
        highlight_string($codigo_ej);
        echo "</div>";
    }
예제 #23
0
 function conf__inicial()
 {
     require_once 'admin_util.php';
     //*********  FRAMES entorno EDICION ************
     //-- FRAME control
     define('apex_frame_control', 'frame_control');
     //-- FRAME lista
     define('apex_frame_lista', 'frame_lista');
     //-- FRAME central
     define('apex_frame_centro', 'frame_centro');
     // Emular el contexto en el consumo por consola.
     if (php_sapi_name() === 'cli') {
         toba_editor::iniciar(toba::instancia()->get_id(), toba_editor::get_id());
         toba_editor::referenciar_memoria();
     }
     toba_zona::set_modo_url(true);
     $clases = array('ci_editores_toba');
     toba_modelo_proyecto::set_clases_excluidas_autoload($clases);
 }
예제 #24
0
 function conf__cuadro(toba_ei_cuadro $cuadro)
 {
     if (!isset($this->s__datos) || $this->filtrar) {
         $carpeta = toba::instancia()->get_path_proyecto(toba_editor::get_proyecto_cargado()) . '/php';
         $carpeta = toba_manejador_archivos::path_a_plataforma($carpeta);
         $extra = '';
         if (isset($this->s__filtro['nombre'])) {
             $extra = "{$this->s__filtro['nombre']}.*";
         }
         $archivos = toba_manejador_archivos::get_archivos_directorio($carpeta, "/{$extra}\\.php\$/", true);
         $modelo = toba_editor::get_modelo_proyecto();
         $estandar = $modelo->get_estandar_convenciones();
         $datos = array();
         foreach ($archivos as $archivo) {
             $path_relativo = substr($archivo, strlen($carpeta) + 1);
             $nombre = basename($archivo);
             if (strlen($nombre) > 30) {
                 $nombre = substr($nombre, 0, 30) . '...';
             }
             $info = array('archivo' => $nombre, 'path' => $path_relativo);
             if (isset($this->s__filtro['convenciones']) && $this->s__filtro['convenciones']) {
                 $errores = $estandar->validar(array($archivo));
                 $info['errores'] = $errores['totals']['errors'];
                 $info['warnings'] = $errores['totals']['warnings'];
             }
             $datos[] = $info;
         }
         $this->s__datos = rs_ordenar_por_columna($datos, 'archivo');
     }
     if (isset($this->s__filtro['convenciones']) && $this->s__filtro['convenciones']) {
         $columnas = array();
         $columnas[0]['clave'] = 'errores';
         $columnas[0]['titulo'] = toba_recurso::imagen_toba('error.gif', true);
         $columnas[0]['estilo'] = 'col-num-p1';
         $columnas[1]['clave'] = 'warnings';
         $columnas[1]['titulo'] = toba_recurso::imagen_toba('warning.gif', true);
         $columnas[1]['estilo'] = 'col-num-p1';
         $cuadro->agregar_columnas($columnas);
     }
     $cuadro->desactivar_modo_clave_segura();
     $cuadro->set_datos($this->s__datos);
 }
예제 #25
0
 function conf__listado(toba_ei_archivos $ei)
 {
     $ei->set_solo_carpetas(true);
     $inicial = toba::memoria()->get_parametro('ef_popup_valor');
     if (!isset($this->s__dir_absoluto)) {
         //Si no hay valor previo de la instancia esta
         $id_pm = toba::memoria()->get_parametro('punto_montaje');
         if (!is_null($id_pm)) {
             //Si existe PM cargo ese dir, sino el defecto del proyecto
             $punto = toba_modelo_pms::get_pm($id_pm, toba_editor::get_proyecto_cargado());
             $this->s__dir_absoluto = $punto->get_path_absoluto() . '/';
         } else {
             $this->s__dir_absoluto = toba::instancia()->get_path_proyecto(toba_editor::get_proyecto_cargado()) . '/php/';
         }
     }
     $ei->set_path_absoluto($this->s__dir_absoluto);
     if ($inicial != null) {
         $ei->set_path(dirname($inicial));
     }
 }
예제 #26
0
 function actualizar_script_roles($eliminados = array())
 {
     $usa_permisos_por_tabla = false;
     foreach (toba_info_editores::get_fuentes_datos($this->dep('editor_perfiles')->get_proyecto()) as $fuente) {
         //Miro si al menos una fuente usa permisos por tablas.
         $usa_permisos_por_tabla = $usa_permisos_por_tabla || $fuente['permisos_por_tabla'] == '1';
     }
     if ($usa_permisos_por_tabla) {
         $modelo = toba_modelo_catalogo::instanciacion();
         $modelo->set_db(toba::db());
         $proyecto = $modelo->get_proyecto(toba::instancia()->get_id(), $this->s__filtro['proyecto']);
         $dir = $proyecto->get_dir() . '/';
         try {
             $proyecto->crear_script_generacion_roles_db($dir, $eliminados);
             toba::notificacion()->agregar('Se han generado los scripts de actualización de roles de base de datos.\\n Los mismos se encuentran en el directorio raiz del proyecto, recuerde ejecutarlos', 'info');
         } catch (toba_error $e) {
             toba::logger()->debug('Falló la generacion del script' . $e->getMessage());
             toba::notificacion()->agregar('No se ha podido generar los scripts de actualización de roles de base de datos, por favor utilice el comando toba proyecto roles_script', 'error');
         }
     }
 }
예제 #27
0
파일: skins_ci.php 프로젝트: emma5021/toba
 function evt__form_paleta__generar($datos)
 {
     $this->evt__form_paleta__modificacion($datos);
     $datos = $this->dep('datos')->get();
     $paleta = unserialize($datos['paleta']);
     $template = file_get_contents($this->template);
     if ($datos['proyecto'] == 'toba') {
         $dir_salida = toba_dir();
     } else {
         $dir_salida = toba::instancia()->get_path_proyecto($datos['proyecto']);
     }
     $dir_salida = $dir_salida . '/www/skins/' . $datos['estilo'];
     if (!file_exists($dir_salida)) {
         toba_manejador_archivos::crear_arbol_directorios($dir_salida);
     }
     $archivo_salida = $dir_salida . '/toba.css';
     foreach ($paleta as $clave => $valor) {
         $template = str_replace('{$' . $clave . '}', $valor, $template);
     }
     file_put_contents($archivo_salida, $template);
     $this->pantalla()->set_descripcion('Plantilla css generada. Recuerde generar una imagen <b>barra-sup.gif</b> (o copiarlo de un skin existente) ' . "y guardarla en <b>{$dir_salida}</b>", 'warning');
     $this->dep('datos')->sincronizar();
 }
예제 #28
0
 function test_item_con_dependencias_con_subclases()
 {
     //$path_relativo = toba_dir()."/proyectos/".toba_editor::get_proyecto_cargado()."/php/";
     $path_relativo = toba::instancia()->get_path_proyecto(toba_editor::get_proyecto_cargado()) . '/php';
     $anexo = "Clon - ";
     $nuevos_datos = array('anexo_nombre' => $anexo);
     $meta_item = $this->probar_item('1000034', $nuevos_datos, 'nuevo_dir');
     $this->assertEqual($anexo . "Clonador - Item con dependencias", $meta_item->get_nombre());
     //--- CI
     $subclase = 'nuevo_dir/subclase_ci.php';
     $ci = $meta_item->get_hijos();
     $ci = current($ci);
     $this->assertEqual($ci->get_subclase_archivo(), $subclase);
     $this->assertTrue(file_exists($path_relativo . '/' . $subclase));
     unlink($path_relativo . '/' . $subclase);
     //--- Pantallas
     $subclase = 'nuevo_dir/subclase_pantalla.php';
     $pantallas = $ci->get_hijos();
     $this->assertEqual($pantallas[0]->get_subclase_archivo(), $subclase);
     $this->assertTrue(file_exists($path_relativo . '/' . $subclase));
     unlink($path_relativo . '/' . $subclase);
     //--- Form
     $subclase = 'nuevo_dir/subclase_form.php';
     $form = $pantallas[0]->get_hijos();
     $form = current($form);
     $this->assertEqual($form->get_subclase_archivo(), $subclase);
     $this->assertTrue(file_exists($path_relativo . '/' . $subclase));
     unlink($path_relativo . '/' . $subclase);
     //--- Cuadro
     $subclase = 'nuevo_dir/subclase_cuadro.php';
     $cuadro = $pantallas[1]->get_hijos();
     $cuadro = current($cuadro);
     $this->assertEqual($cuadro->get_subclase_archivo(), $subclase);
     $this->assertTrue(file_exists($path_relativo . '/' . $subclase));
     unlink($path_relativo . '/' . $subclase);
     rmdir($path_relativo . "/nuevo_dir");
 }
예제 #29
0
 static function parsear_wiki($id, $nombre, $proyecto = null, $resumido = false)
 {
     // Busco la base de la URL
     $url_base = '';
     if (isset($proyecto)) {
         $url_base .= toba::instancia()->get_url_proyecto($proyecto) . '/';
         if ($proyecto == 'toba_editor') {
             $url_base .= 'doc/wiki/trac/toba/wiki/';
             //Hack para evitar tener que armar un esquema mucho mas complicado para manejar el caso de usar doc toba desde distintos lados
         }
     } else {
         $url_base .= toba::proyecto()->get_parametro('proyecto', 'url_ayuda');
     }
     // Armo la URL
     $agregar_extension = toba::proyecto()->get_parametro('proyecto', 'url_ayuda_agregar_extension', false);
     if (!isset($agregar_extension) || $agregar_extension) {
         $anchor = '';
         if (strpos($id, '#') !== false) {
             $anchor = substr($id, strpos($id, '#') + 1);
             $id = substr($id, 0, strpos($id, '#'));
             $url = $url_base . "{$id}.html#{$anchor}";
         } else {
             $url = $url_base . "{$id}.html";
         }
     } else {
         $url = $url_base . "{$id}";
     }
     // Genero la salida
     if ($resumido) {
         return $url;
     } else {
         $img = toba_recurso::imagen_toba("wiki.gif", true);
         $tag = "<a href={$url} target=wiki>{$nombre}</a>{$img}";
         return str_replace("'", "\\'", $tag);
     }
 }
예제 #30
0
 function get_contenido($estilo)
 {
     if (!isset($this->contenidos[$estilo])) {
         $candidato = toba::instalacion()->get_path() . "/www/css/{$estilo}.css";
         if (file_exists($candidato)) {
             $archivo = $candidato;
         } else {
             //Si el archivo no esta en toba, esta en algun proyecto
             $proyectos = toba_info_instancia::get_proyectos_con_estilo($estilo);
             foreach ($proyectos as $proyecto) {
                 $pro = $proyecto['proyecto'];
                 $candidato = toba::instancia()->get_path_proyecto($pro) . "/www/css/{$estilo}.css";
                 if (file_exists($candidato)) {
                     $archivo = $candidato;
                 }
             }
         }
         if (!isset($archivo)) {
             throw new toba_error("No se encuentra el archivo del estilo {$estilo}");
         }
         $this->contenidos[$estilo] = file_get_contents($archivo);
     }
     return $this->contenidos[$estilo];
 }