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.