Пример #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
 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
 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
 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];
 }