Ver Mensaje Individual
  #1  
Antiguo 10-01-2008
Chompiras Chompiras is offline
Miembro
 
Registrado: ene 2006
Ubicación: La plata, Argentina
Posts: 37
Reputación: 0
Chompiras Va por buen camino
Problemas con smarty al tratar consulta de base de datos access

Bueno, esta consulta es un poco complicada de hacer, pero espero que alguno que sepa de php, smarty y base de datos access me pueda entender y ayudar...
Tengo una base de datos en access, para la cual cree un DSN de sistema en mi PC. El codigo de la pagina, en php, es el siguiente:
Código PHP:
<?    
    
include 'include/clases.php';
    require_once(
'smarty/libs/Smarty.class.php');
    
$smarty = new Smarty;
    
    if ( isset( 
$_GET['tipo'] ) ){
       
        
$smarty->assign('hay_resultados',true);
        if ( 
$_GET['tipo'] == "nombres" ){
            
            
$resultados = new Nombres();
        }
        else{
            
            
$resultados = new Documentos();            
        }
        unset (
$_GET['tipo']);
    }
    else{
            
        
$smarty->assign('hay_resultados',false);
    }    
    
$smarty->assign('resultados',$resultados);
    
$smarty->display('dos.tpl');
?>
Luego, la clase "clases.php" contiene el siguiente codigo:
Código PHP:
<?
    
function conectar(){
        
//El segundo y tercer parametro son el usuario y la contraseña. 
        //Sino fueron especificados, van vacios.
        
return ($conn_access odbc_connect ("dos","",""));
        
    }    
    class 
ObjetoDeUnSoloAtributo{
        private 
$atributo;
        public function 
ObjetoDeUnSoloAtributo($valorParaElAtributo){
            
$this->atributo $valorParaElAtributo;
        }
        public function 
atributo(){
            return(
$this->atributo);
        }
    }
    class 
Documentos{
        ...
    }
    class 
Nombres{
        private 
$db;
        public function 
Nombres(){
            
$this->db conectar();
           
            
$arreglo=array();
            
            
$codigo $_GET['licenciatura'];
            
$consulta odbc_exec($this->db,"select nombre,apellido from Alumnos where codigo_carrera = $codigo ");
           
            while (
$fila odbc_fetch_object($consulta)){                
                
$objeto =  new ObjetoDeUnSoloAtributo($fila->nombre.$fila->apellido);
                
$arreglo[] = $objeto;
               
            }
            return 
$arreglo;            
        }        
    }
?>
A la clase Documentos, la deje con "..." por que es muy parecida a la clase Nombres, salvo un par de detalles.

Luego, tengo un dos.tpl, con el siguiente contenido (espero que este bien la etiquera CODE para esto):
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="es">
    <head>
        <title>dos</title>
        {literal}
        <script type="text/javascript">
            function mostrarNombres(formulario){
                
                if (document.getElementById("carreras").options[document.getElementById("carreras").selectedIndex].value == "informatica" ){
                    window.open("http://localhost/practicas/dos/dos.php?tipo=nombres&licenciatura=1","Nombres de los estudiantes","");

                }
                else{
                    window.open("http://localhost/practicas/dos/dos.php?tipo=nombres&licenciatura=2","Nombres de los estudiantes","");
                }                
            }
            function mostrarDocumentos(formulario){
                if (document.getElementById("carreras").options[document.getElementById("carreras").selectedIndex].value == "informatica" ){
                    window.open("http://localhost/practicas/dos/dos.php?tipo=documentos&licenciatura=1","Nombres de los estudiantes","");

                }
                else{
                    window.open("http://localhost/practicas/dos/dos.php?tipo=documentos&licenciatura=2","Nombres de los estudiantes","");
                }        
            }
        
        </script>
        {/literal}
    </head>
    
    <body>
        {if $hay_resultados == true}
            <tr class="encabezado"> 
                <th>DNI o NOMBRE de los alumnos:</th>                            
            </tr>
            {foreach item=alumno from=$resultados}                                    
                <tr>            
                    <td>{$alumno->atributo()}</td>            
                </tr>                                                
            {/foreach}
        {else}
            <br />
            <label class="carreras" for="carreras">Carrera:</label>
            <select id="carreras">
                <option value="informatica">Licenciatura en informatica</option>
                <option value="sistemas">Licenciatura en sistemas</option>
            </select>
            
            
            <form method="post" enctype="text/plain" onSubmit="mostrarNombres(this)">
                <label class="nombres" for="nombres">Listar:</label>
                <input id="nombres" type="submit" value="N y A de Alumnos" />
            </form>
            
            <form name="documentos" method="post" enctype="text/plain" onSubmit="mostrarDocumentos(this)">
                <input type="submit" value="DNI de alumnos" />
            </form>
        {/if}
    </body>
</html>
Ahora les explico todo en conjunto como funciona. Al ejecutar dos.php por primera vez, se ejecuta dos.tpl a traves del else, el cual permite elegir entre dos opciones de un select, y luego, al apretar uno de entre dos botones, mostrara una tabla con alumnos de la carrera elegida, y con el "nombre" o el "documento" de cada uno de los alumnos, dependiendo que boton hayamos seleccionado. El problema que tengo con este codigo, es que, una vez que el "dos.tpl" entra por el if, el foreach no funciona correctamente, ya que no imprime los datos, la pagina se muestra hasta esta parte del codigo:
Código:
<tr class="encabezado"> 
     <th>DNI o NOMBRE de los alumnos:</th>                            
</tr>
Y se detiene ahi. Es decir, no solo no imprime la informacion que deberia imprimir en pantalla el foreach, sino que tambien se detiene el procesamiento de la pagina, por lo que etiquetas "</body>" y "</html>" tampoco son mostradas...
¿Alguna idea?

PD: La verdad que no estaba seguro si este tema iba aca, o en la parte de html y javascript, asi que pido perdon si me equivoque de lugar.
__________________
El sabio no dice todo lo que piensa, pero piensa todo lo que dice...
Responder Con Cita