Foros del Web » Programando para Internet » PHP »

Estancado (de nuevo) con NokTemplate

Estas en el tema de Estancado (de nuevo) con NokTemplate en el foro de PHP en Foros del Web. Estoy reprogramando una página para que trabaje con el motor de templates de Nok y no logro generar bien el html. Antes tenía una estructura ...
  #1 (permalink)  
Antiguo 24/05/2003, 14:52
 
Fecha de Ingreso: agosto-2002
Ubicación: Aragón
Mensajes: 254
Antigüedad: 15 años, 4 meses
Puntos: 0
Estancado (de nuevo) con NokTemplate

Estoy reprogramando una página para que trabaje con el motor de templates de Nok y no logro generar bien el html.

Antes tenía una estructura de este tipo que funcionaba bien...(solo muestro la zona de conflicto...)
Código PHP:
$ind1=0;
   while (
$array1[$ind1])
   {
         
$listado=listado("*","".$autores_en_secciones[$indtab]."","where id_autor=".$id." and activar='si'"); //array de resultados extraidos de la bd
         
$ind=0;
         if (
$listado[$ind])
         {
             echo
"             <tr>\n";
             echo
"                <td colspan=\"2\">Sus ".$array1[$ind1]."...</td>\n";
             echo
"             </tr>\n";
         }
         while (
$listado[$ind])
         {
             echo
"             <tr>\n";
             echo
"                <td width=\"50%\"><a href=\"escritos.php?seccion=".$array1[$ind1]."&id=".$listado[$ind]["id_".$array1[$1].""]."\">
             <font color=\"#006699\">\""
.$listado[$ind]["titulo"]."\"</font></a></td>\n";
             echo
"                <td width=\"50%\" align=\"center\">".$redir_genero."</td>\n";
             echo
"             </tr>\n";
             
$ind++;
         }
         
$ind1++;
   } 
... y funcionaba a la perfección. Intento hacerlo mediante templates y hago esto...
autores.html
Código PHP:
<!-- inicioBloqueAutores -->
...
...
<
table align="center" width="100%" background="imagenes/contenidos_fondo.gif" class="contenidos">
                   {
Escritos_autor}
                <!-- 
inicioBloqueRelatos_autor -->        
                <
tr>
                    <
td colspan="2" >Sus {Seccion}...</td>
                </
tr>
                    {
Listado_escritos}
                    <!-- 
inicioBloqueList_escr -->
                <
tr>
                    <
td width="50%"><a href="escritos.php?seccion={Sec}&id={Id_escrito}" class="azul">
                        {
Titulo_escrito}</a></td>
                    <
td width="50%" align="center">{Genero}</td>
                </
tr>
                    <!-- 
finBloqueList_escr -->
                <!-- 
finBloqueRelatos_autor -->
....
...
           </
table>
<!-- 
finBloqueAutores --> 
y doy valores a las variables template así...
Código PHP:
$html->cargar('bAutor','autores.html');
...
...
$html->definirBloque('Autores','bAutor');
$html->definirBloque('Relatos_autor','bAutor');
$html->definirBloque('List_escr','bAutor');
// Generando el listado de los escritos del autor.
$ind1=0;
while (
$array1[$ind1])
{
    
$listado=listado("*","".$array1[$ind1]."","where id_autor=".$_GET['id']." and activar='si'");
    
$ind=0;
    if (
$listado[$ind])
         {
             
$html->asignar('Seccion',$array1[$ind1]);
         }
    while (
$listado[$ind])
    {
        
$html->asignar('Genero',$redir_genero);
        
$html->asignar('Sec',$array1[$ind1]);
        
$html->asignar('Id_escrito',$listado[$ind]["id_".$array1[$ind1]]);
        
$html->asignar('Titulo_escrito',$listado[$ind]["titulo"]);
        
$html->expandir('Listado_escritos','+List_escr');        
        
$ind++;
    }
    
$html->expandir('Escritos_autor','+Relatos_autor');
    
$ind1++;
}
$html->expandir('Total_contenido','Autores'); 
A ver si hay alguien que me pueda echar una mano. Decir también que como última medida, descargé la version corregida de NokTemplate y sigue sin funcionar.

Gracias anticipadas,
Ababol.

Última edición por Ababol; 24/05/2003 a las 15:19
  #2 (permalink)  
Antiguo 24/05/2003, 15:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Y que es lo que obtienes ..? .. A ver si ve esto Nok (o lo contactas en privado o por su e-mail .. ) para ver si el error sigue siendo a raiz del "bug" o no ...

(por cierto . aunque parezca obvio .. ¿Los bloques los defines en el script .php que carga la(s) template(s)...?

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 24/05/2003 a las 15:04
  #3 (permalink)  
Antiguo 24/05/2003, 15:08
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Hola, a simple vista no se ven errores, explica un poco mejor cual es el problema, es decir que es lo que no te anda realmente.
Algo para revisar, pero no creo que sea el problema, es la definicion de bloques, no lo incluyes en tu codigo, pero asumo que lo estas haciendo. Igual que la impresion final de la pagina.

Saludos.
Nok
__________________
La casa de Noktemplate.
Zonaphp.com - Php en español.

¿Que esperas de NokTpl 2? Deja tu comentario.

Blog
Mas o menos asi .
  #4 (permalink)  
Antiguo 24/05/2003, 15:18
 
Fecha de Ingreso: agosto-2002
Ubicación: Aragón
Mensajes: 254
Antigüedad: 15 años, 4 meses
Puntos: 0
Perdón Cluster, se me olvidaron los resultados...

Basicamente lo que tendría que hacer el script es desplegar los relatos de los autores separados por secciones. Ejemplo:

Su SECCION1
relato1----------categoria
relato2----------categoria
Su SECCION2
relato3----------categoria
relato4----------categoria
relato5----------categoria
relato6----------categoria
etc.

Pero lo que extraigo es algo muy raro. Algo así
Su
Su SECCION1
relato1----------categoria
relato2----------categoria
Su SECCION2
relato1----------categoria
relato2----------categoria
relato3----------categoria
relato4----------categoria
relato5----------categoria
relato6----------categoria
Su SECCION2
relato1----------categoria
relato2----------categoria
relato3----------categoria
relato4----------categoria
relato5----------categoria
relato6----------categoria

Dudo que sea problema de la estructura de control, pues si antes funcionaba, debería seguir funcionando. Más bien diría que es un problema de definicion de bloques (o expansión) o bien de la propia clase.

Añadir también que esta estructura está incluída dentro de otras estructuras de template. Me he remitido a poner solo la porción de código que me genera error, poner aquí todo el código sería tedioso, pero si alguien se ve capaz de ayudarme no tengo problemas en enviar por e-mail los archivos que se necesiten para aclarar el tema.

Por hoy lo dejo, llevo cerca de 2 horas con esto y estoy saturado.

Saludos,
Ababol.

Ostia que rápidez!!!!

Si defino los bloques. Intentaré editar el post inicial para que se vea como lo hago...

Gracias por contestar,
Ababol.
  #5 (permalink)  
Antiguo 24/05/2003, 22:06
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Hola, creo que he encontrado cual es el inconveniente. El problema es que no estas "reseteando" las variables despues del bucle. Esto ocasiona que se concatene indefinidamente el contenido de la variable y por eso es acumulativo.
Para solucionarlo tendrias que agregar la siguiente linea:

$html->asignar('Listado_escritos','');

en tu codigo, despues de haber expandido con esto reseteas la variable a nulo y vuelves a empezar.
Creo que con eso estaria solucionado, fijate si no hace falta en otro lugar. El codigo quedaria algo asi:


Código PHP:
$ind1=0;
while (
$array1[$ind1])
{
    
$listado=listado("*","".$array1[$ind1]."","where id_autor=".$_GET['id']." and activar='si'");
    
$ind=0;
    if (
$listado[$ind])
         {
             
$html->asignar('Seccion',$array1[$ind1]);
         }
    while (
$listado[$ind])
    {
        
$html->asignar('Genero',$redir_genero);
        
$html->asignar('Sec',$array1[$ind1]);
        
$html->asignar('Id_escrito',$listado[$ind]["id_".$array1[$ind1]]);
        
$html->asignar('Titulo_escrito',$listado[$ind]["titulo"]);
        
$html->expandir('Listado_escritos','+List_escr');        
        
$ind++;
    }
    
$html->expandir('Escritos_autor','+Relatos_autor');

    
// Aqui es donde cambiamos y reseteamos.    
    
$html->asignar('Listado_escritos','');

    
$ind1++;
}
$html->expandir('Total_contenido','Autores'); 

Saludos
Nok.
  #6 (permalink)  
Antiguo 25/05/2003, 03:37
 
Fecha de Ingreso: agosto-2002
Ubicación: Aragón
Mensajes: 254
Antigüedad: 15 años, 4 meses
Puntos: 0
Exacto Nok, ese era el problema de la acumulacion de los valores del bucle anidado.

Y ya he solucionado también el otro error. También era un problema relativo a la asignacion de valores nulos y su posterior expansión.

Tal vez no sirva de ayuda a nadie, pero pongo el código corregido...
Código PHP:
$ind1=0;
while (
$array1[$ind1])
{
    
$listado=listado("*","".$array1[$ind1]."","where id_autor=".$_GET['id']." and activar='si'");
    
$ind=0;
    if (
$listado[$ind])
         {
             
$html->asignar('Seccion',$array1[$ind1]);
         }else 
$html->asignar('Seccion',''); //Nos aseguramos que la variable template no quede 
                                             //sin asignación cuando la consulta a la bd no genera resultados.
    
while ($listado[$ind])
    {
        
$html->asignar('Genero',$redir_genero);
        
$html->asignar('Sec',$array1[$ind1]);
        
$html->asignar('Id_escrito',$listado[$ind]["id_".$array1[$ind1]]);
        
$html->asignar('Titulo_escrito',$listado[$ind]["titulo"]);
        
$html->expandir('Listado_escritos','+List_escr');        
        
$ind++;
    }
    
$html->expandir('Escritos_autor','+Relatos_autor');

    
// Aqui es donde cambiamos y reseteamos.    
    
$html->asignar('Listado_escritos','');

    
$ind1++;
}
$html->expandir('Total_contenido','Autores'); 
Muchas gracias por tu ayuda Nok. Al final acabaré dominando tu clase...

Saludos,
Ababol.
  #7 (permalink)  
Antiguo 25/05/2003, 12:50
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm Ahora que entendí el problema cual era .... Yo para esa situación hago:

Código PHP:
$html->expandir(''Listado_escritos','-Relatos_autor); 
(antes del bucle)

No sé si eso es del todo "ortodoxo" o ¿ tengo que usar el "resetear" via el método asignar() según el ejemplo que dió Nok?

Un saludo,

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 25/05/2003, 14:22
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Cluster, en realidad lo que tu haces es equivalente al "reseteo" de la variable, ya que hacer:
Código PHP:
$html->expandir(''Listado_escritos','-Relatos_autor); 
le estas asignando nulo a {Listado_escritos}
porque '-Relatos_autor' es un template que no existe, el menos (-) no esta contemplado internamente por la clase, pero sirve para lo que tu haces, el problema que es menos eficiente, ya que le aplicas expresiones regulares a un cadena nula. Por eso es mas eficiente hacer esto:
Código PHP:
$html->asignar(''Listado_escritos','); 
talves se podria implementar en la clase como un pequeña mejora, ya que el usar el menos (-) tiene un valor semantico, o sea de significado en el codigo, lo cual lo hace mas entendible.

Bueno, en un ratito lo implemente, y ahora tambien funciona de manera mas eficiente lo que tu haces.

Se puede bajar desde:
http://www.jpw.com.ar/noktemplate/NokTemplate.zip

Saludos.
Nok.
  #9 (permalink)  
Antiguo 25/05/2003, 18:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Grácias Nok.

La verdá que o me confundí al leer la documentación de NokTemplate (de la primera versión) y entendí que si + era para expadir un bloque .. (pensaba yo sin mirar el código de la classe donde ubiera visto que no era correcto mi pensar) que el - era para eso mismo ..

Me "funcionaba" por lo que comentas de que el bloque no está definido .. (un nombre -NombreBloque).

Ahora quedó mas optimo el código y en cuanto a "semantica" es mas entendible.

Un saludo,

Pd: Grácias por los créditos .. jeje .. no hacia falta xD.
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 24/03/2004, 13:22
Avatar de zarate  
Fecha de Ingreso: septiembre-2001
Ubicación: Madrid
Mensajes: 164
Antigüedad: 16 años, 3 meses
Puntos: 0
Bueno, lo primero es que Nok ha conseguido que me sienta un inútil... es broma, pero es que realmente estoy atrapado con esto y parezco tonto.

Tengo el mismo problema que el autor original del post, pero a pesar de habermelo leido unas cuantas veces, no doy con la respuesta.

Despues de probarlo con una página más compleja, me he decidido a probar con el típico "Nok template for dummies", y ni esas, aquí va el código:

El template:

Código PHP:
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
{
total}
<!-- 
inicioBloquefila -->
  <
tr>
    <
td>{a}</td>
  </
tr>
<!-- 
finBloquefila -->
</
table
El PHP:

Código PHP:
    // incluimos clase de las plantillas
    
include ('../../comunes/class.NokTemplate.php');

    
// definimos el directorio de las plantillas
    
$html = new NokTemplate('../templates');
    
    
// cargamos las plantillas necesarias
    
$html->cargar('test','test.tpl');
    
$html->definirBloque('fila','test'); 

    
$pedro = array("uno","dos","tres","cuatro","cinco");

    for(
$a=0;$a<sizeof($pedro);$a++){
        
$html->asignar('a',$pedro[$a]);
        
$html->expandir('total','+fila');
    }

    
$html->asignar('total','');

    
$html->expandir('res','test');
    
$html->imprimir('res'); 
He intentado poner la línea de código que "resetea" el total en todos los sitios imaginables, pero al final siempre me repite la última fila.

Por favor, estoy desesperado con esto, ya que me impide avanzar en cosas "serias".

Muchas gracias.
__________________
Zárate
  #11 (permalink)  
Antiguo 24/03/2004, 23:20
 
Fecha de Ingreso: julio-2003
Ubicación: No hay destino
Mensajes: 31
Antigüedad: 14 años, 5 meses
Puntos: 0
Hola, según veo el problema esque estas reiniciando la variable equivocada, la que debes reiniciar en cada ciclo del for es la variable "a" que es la que toma nuevo valor en cada vuelta, al menos asi lo hago yo y no tengo problemas.

Código PHP:
for($a=0;$a<=sizeof($pedro);$a++){
        
$html->asignar('a',$pedro[$a]);
        
$html->expandir('total','+fila');
       
$html->asignar('a',' ');
    } 
Saludos.
  #12 (permalink)  
Antiguo 25/03/2004, 01:37
Avatar de zarate  
Fecha de Ingreso: septiembre-2001
Ubicación: Madrid
Mensajes: 164
Antigüedad: 16 años, 3 meses
Puntos: 0
Ya, pero es que esa no es mi intención...

Si reseteo a, efectivamente parece que se soluciona el problema, pero si ves el código fuente HTML que se genera, te segirá apareciendo al final:

Código PHP:
<!-- inicioBloquefila -->

  <
tr>
    <
td></td>
  </
tr>
<!-- 
finBloquefila --> 
Solo que en este caso, irá vacío el td. Algo es algo, pero me parece una solución muy "sucia".

¿No hay forma de que se elimine del código fuente la definición del bloque?

Para eso a lo mejor haría algo como:

Código PHP:
    for($a=0;$a<sizeof($pedro);$a++){
        
        
$html->asignar('a',$pedro[$a]);
        
        if((
$a+1) != (sizeof($pedro))){
            
$html->expandir('total','+fila');
        } 
// end if
        
    
}

Puede que en términos de rendimiento la cosa empeore un poco, pero por lo menos no tengo código redundante...

Escribir un <tr> vacío no es un problema grave, pero no sé si alguna vez sí que lo será escribir un ciclo de más....

Alguien se le ocurre algo más??
__________________
Zárate
  #13 (permalink)  
Antiguo 25/03/2004, 11:28
 
Fecha de Ingreso: julio-2003
Ubicación: No hay destino
Mensajes: 31
Antigüedad: 14 años, 5 meses
Puntos: 0
Hola. Zarate, tienes razón la verdad que no es una solución factible, de haberme dado cuenta de lo que sucedía no lo hubiera posteado.

Tengo poco usando Noktemplate y hasta ahora no me ha sucedido lo de las filas repetidas, la verdad es que me he apegado a los ejemplos de Nok y no he usado templates como el que usas, es decir siempre que requiero de algo parecido, lo hago definiendo dos bloques en el archivo de esta forma:

Código PHP:
<!-- inicioBloquetabla -->
<
table width="100%"  border="1" cellspacing="0" cellpadding="0">
{
total}
<!-- 
inicioBloquefila -->
  <
tr>
    <
td>{a}</td>
  </
tr>
<!-- 
finBloquefila -->
</
table>
<!-- 
finBloquetabla --> 
Solo tendrías que agregar la definición del bloque y al final en lugar de expandir "test", expandirias "tabla".

Saludos.
  #14 (permalink)  
Antiguo 25/03/2004, 13:13
Avatar de zarate  
Fecha de Ingreso: septiembre-2001
Ubicación: Madrid
Mensajes: 164
Antigüedad: 16 años, 3 meses
Puntos: 0
No se puede tampoco....

El problema es que entonces pierdes el resto de código HTML que hay en la plantilla.

En el ejemplo sólo te he puesto la parte crítica, pero esa tabla va dentro de una página HTML, si defines un bloque tabla que la englobe, y luego lo expandes, pierdes el resto del código HTML.

Una solución sería sacar la tabla a otro archivo de template, pero es que entonces puede ser un caos sacar cada tabla que se repite a un archivo....

¿No hay nadie que haya trabajado con Nok Template que se haya encontrado ya con este problema?

Mil gracias
__________________
Zárate
  #15 (permalink)  
Antiguo 25/03/2004, 15:19
Avatar de zarate  
Fecha de Ingreso: septiembre-2001
Ubicación: Madrid
Mensajes: 164
Antigüedad: 16 años, 3 meses
Puntos: 0
Bueno, solución de las que funciona aunque seguramente no la más eficaz:

Definir un bloque que englobe TODO el HTML de la página y expandir ese bloque. Lo mismo que propone Durán pero englobando todo el código HTML.

¿Alguien puede confirmarnos que este es un método cuando menos decente? quiero decir que no estamos haciendo una burrada que se coma los recursos del servidor.

Gracias.

PD: Sé que no tengo derecho a quejarme y que todas las ayudas del foro son volutarias (yo mismo soy moderador de uno fuera de Foros del Web), pero con las plantillas me ha pasado lo que no me había pasado nunca aquí:

Estos son los siguientes post que he puesto:

En Zonaphp:

http://zonaphp.com/index.php?modulo=...ntario&cid=234

En Foros del web:

http://www.forosdelweb.com/s/msg185634.html

http://www.forosdelweb.com/s/msg187209.html

Y este mismo. Quitando las respuestas de Durán (muchas gracias, de verdad) NADIE ha contestado. Ni siquiera un "no sé de qué hablas"

A veces es frustrante pedir ayuda a gritos y tener la sensación de que o nadie te escucha o nadie te quiere ayudar.

Digo esto porque si véis a alguien en esta situación, le digáis por lo menos: "tio es que no se me ocurre nada".

ESTO TAMBIÉN VA POR MÍ. Que nadie se tome esto como un ataque personal, foros del web me ha ayudado muchas veces y no se va a caer el foro porque una persona quede sin respuesta.

Bueno, no me enrollo más. Muchas gracias a todos.
__________________
Zárate
  #16 (permalink)  
Antiguo 24/06/2004, 22:59
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Hola zarate, como andas?
Ante todo disculpa la tardanza (o falta de soporte). Lamentablemente ultimamente no frecuento demasiado los foros por cuestiones de tiempo.
Respecto a tu consulta, si la forma de hacer lo qeu pretendes es la "correcta" (la ultima que propones). El tema es que cuando defines bloque en Noktpl no quita el bloque en si mismo del template de referencia, por lo cual todo deberia ser un bloque con bloques anidados. Esto se produce porque en un principio los bloques se pensaron como parte de una libreria de templates (un template contiene varios templates). En la version 1.3 pretendo agregar la posibilidad de hacerlo de la manera que tu pretendes, junto con otras funcionalidades que me han solicitado. Espero poder dispoder de un tiempo para publicarla y ampliar la documentacion del proyecto, asi como tambien publicar nuevos proyectos en los que estoy trabajando.

Espero a ver evacuado tu duda, y disculpas nuevamente.
Saludos
Nok.
__________________
La casa de Noktemplate.
Zonaphp.com - Php en español.

¿Que esperas de NokTpl 2? Deja tu comentario.

Blog
Mas o menos asi .
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:25.