Foros del Web » Programando para Internet » PHP »

Expandir bloques con NokTemplate

Estas en el tema de Expandir bloques con NokTemplate en el foro de PHP en Foros del Web. Seguro que será una tonteria pero llevo una hora y media y no encuentro el error, así que os pido un poco de ayuda. Trabajo ...
  #1 (permalink)  
Antiguo 17/05/2003, 05:44
 
Fecha de Ingreso: agosto-2002
Ubicación: Aragón
Mensajes: 254
Antigüedad: 15 años, 4 meses
Puntos: 0
Expandir bloques con NokTemplate

Seguro que será una tonteria pero llevo una hora y media y no encuentro el error, así que os pido un poco de ayuda.

Trabajo con las NokTemplate y tengo un bloque de este modo...
Código:
<table>
...
...
...
{Ultimos_publicados}
    <!-- inicioBloque: Tabla_ultimos -->
    <tr>
        <td width="40%" style="padding-left:20"><a href={URL_1} class="azul">
            "{Campo_1}"</a></td>
        <td width="30%"><a href={URL_2} class="pie"><b>( </b>
            {Campo_2}<b>) </b></a></td>
        <td width="30%"><a href={URL_3} class="azul">
            {Campo_3}</a></td>
   </tr>
   <!-- finBloque: Tabla_ultimos -->
</table>
y el siguiente código que genera los valores a las variables template...
Código PHP:
$html->cargar('tContenido',$area['plantilla']);
$html->definirBloque('Tabla_ultimos','tContenido');
...
...
...

$ind=0;
while (
$ultimos_escritos[$ind])
{
    
// Asignando valor a las variables template
    
$html->asignar('Campo_1',$ultimos_escritos[$ind]['titulo']);
    
$html->asignar('URL_1',"index.php?accion=leer&seccion=relatos&id=".$ultimos_escritos[$ind]['id_relatos']."");
    
// Buscando el nombre del autor...    
    
$html->asignar('Campo_2',$nombre_autor);
    
$html->asignar('URL_2',"index.php?accion=leer&seccion=autores&id=".$ultimos_escritos[$ind]['id_autor']."");
    
//Buscando el nombre de la subcategoría...
    
$html->asignar('Campo_3',$nombre_subcategoria);
    
$html->asignar('URL_3',"index.php?accion=listar&seccion=relatos&id=".$ultimos_escritos[$ind]['id_subseccion']."");
    
//Expandiendo la fila de los últimos escritos publicados...
    
$html->expandir('Ultimos_publicados','+Tabla_ultimos');
    
$ind++;
}
$html->expandir('Contenido','tContenido'); 
Y genera bien las filas, pero el problema es que me duplica la última. Seguro que será un error correspondiente al uso de los métodos de la NokTemplate, pues he probado a variar el numero de filas a mostrar y ponga el que ponga, siempre me duplica el último.

Lo más curioso es que en este mismo script utilizo una estructura similar y no me ha dado problemas.

Gracias anticipadas,
Ababol.

.................................................. .................................................. ...

Ya lo he solucionado. Me he limitado a guardar los bloques reutilizables en un template aparte y ya funciona bien.

De todos modos no entiendo como no me soporta los bloques anidados. Uso la versión 1.1.0 y en la documentación dice que sí lo hace. Tal vez no la haya sabido usar...

Saludos,
Ababol.

Última edición por Ababol; 17/05/2003 a las 05:11
  #2 (permalink)  
Antiguo 17/05/2003, 09:49
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Hola Ababol,

En realidad estaba casi bien lo que estabas haciendo, el problema era la definicion de los bloques, o sea, si en tu template tiene definido un bloque este no es "eliminado" del template, por lo cual cuando expandias el template completo te seguia incluyendo el bloque que habias definido.
Veamos tu ejemplo.

tContenido tiene lo siguiente:
Código PHP:
<table>
...
...
...
{
Ultimos_publicados}
    <!-- 
inicioBloqueTabla_ultimos -->
    <
tr>
        <
td width="40%" style="padding-left:20"><a href={URL_1} class="azul">
            
"{Campo_1}"</a></td>
        <
td width="30%"><a href={URL_2} class="pie"><b>( </b>
            {
Campo_2}<b> ) </b></a></td>
        <
td width="30%"><a href={URL_3} class="azul">
            {
Campo_3}</a></td>
   </
tr>
   <!-- 
finBloqueTabla_ultimos -->
</
table
y Tabla_ultimos esto:
Código PHP:
    <tr>
        <
td width="40%" style="padding-left:20"><a href={URL_1} class="azul">
            
"{Campo_1}"</a></td>
        <
td width="30%"><a href={URL_2} class="pie"><b>( </b>
            {
Campo_2}<b> ) </b></a></td>
        <
td width="30%"><a href={URL_3} class="azul">
            {
Campo_3}</a></td>
   </
tr
Cuando expandes al final tContenido, te daras cuenta de que la ultima fila se repetira, ya que tambien forma parte del template.
Para evitar este problema, lo que debes hacer es lo siguiente:

tu template deberia tener lo siguiente:
Código PHP:
<!-- inicioBloquetContenido -->
<
table>
...
...
...
{
Ultimos_publicados}
    <!-- 
inicioBloqueTabla_ultimos -->
    <
tr>
        <
td width="40%" style="padding-left:20"><a href={URL_1} class="azul">
            
"{Campo_1}"</a></td>
        <
td width="30%"><a href={URL_2} class="pie"><b>( </b>
            {
Campo_2}<b> ) </b></a></td>
        <
td width="30%"><a href={URL_3} class="azul">
            {
Campo_3}</a></td>
   </
tr>
   <!-- 
finBloqueTabla_ultimos -->
</
table>
<!-- 
finBloquetContenido --> 
Como vez estamos definiendo dos bloques anidados dentro de un template (aclaremos que un template no es necesariamente un bloque) y ahora lo unico que resta es cambiar un poco el codigo:

Código PHP:
$html->cargar('miTemplate',$area['plantilla']);
$html->definirBloque('Tabla_ultimos','miTemplate');
$html->definirBloque('tContenido','miTemplate');
...
...
...

$ind=0;
while (
$ultimos_escritos[$ind])
{
    
// Asignando valor a las variables template
    
$html-> asignar('Campo_1',$ultimos_escritos[$ind]['titulo']);
    
$html->asignar('URL_1',"index.php?accion=leer&seccion=relatos&id=".$ultimos_escritos[$ind]['id_relatos']."");
    
// Buscando el nombre del autor...    
    
$html->asignar('Campo_2',$nombre_autor);
    
$html->asignar('URL_2',"index.php?accion=leer&seccion=autores&id=".$ultimos_escritos[$ind]['id_autor']."");
    
//Buscando el nombre de la subcategoría...
    
$html->asignar('Campo_3',$nombre_subcategoria);
    
$html->asignar('URL_3',"index.php?accion=listar&seccion=relatos&id=".$ultimos_escritos[$ind]['id_subseccion']."");
    
//Expandiendo la fila de los últimos escritos publicados...
    
$html->expandir('Ultimos_publicados','+Tabla_ultimos');
    
$ind++;
}
$html->expandir('Contenido','tContenido'); 
ahora si funcionará como esperas, ya que tContenido ya no incluye al bloque, pues cuando defines el bloque automaticamente se quitan los sub-bloques.

Bueno, espero que te haya aclarado la duda.
Saludos.
Nok!
  #3 (permalink)  
Antiguo 17/05/2003, 11:44
 
Fecha de Ingreso: agosto-2002
Ubicación: Aragón
Mensajes: 254
Antigüedad: 15 años, 4 meses
Puntos: 0
Gracias Nok por tu aclaración. Creo entender tus explicaciones pero...

Resulta que la estructura del template es esta...
miTemplate
Código PHP:
<!-- inicioBloqueContenido -->
...
   {
Tabla_1}
   <!-- 
inicioBloqueBloque_1 -->
   ... 
   <!-- 
finBloqueBloque_1 -->
...
...
...
   {
Tabla_2}
   <!-- 
inicioBloqueBloque_2 -->
   ...
   <!-- 
finBloqueBloque_2 -->
...
<!-- 
finBloqueContenido --> 
Y si no he entenido mal he de definir los bloques así...
Código PHP:
$html->cargar('Total','miTemplate.html');
$html->definirBloque('Bloque_1','Total');
$html->definirBloque('Bloque_2','Total');
$html->definirBloque('Contenido','Total');

// Genero los valores para las variables template del Bloque_1 y las expando en Tabla_1
$html->expandir('Tabla_1','+Bloque_1');

// La misma operación para las variables del Bloque_2
$html->expandir('Tabla_2','+Bloque_2');

// finalmente expando el bloque-padre 
$html->expandir('Var_contenido','Contenido'); 
Ahora lo que pasa es me "corta" el template. Es decir solo genera el html del Bloque_1 y ahí se queda. He estado haciendo pruebas, pero la única que ha funcionado es anidar Bloque_1 en Contenido_1 y Bloque_2 en Contenido_2 y expandirlas en dos variables distintas en lugar de hacerlo en una sola.

Supongo que hay algo que se me pasa, pero si solo fuera posible tal y como lo he explicado en el último párrafo, no creo que sea muy estiloso, estructuralmente hablando.

Saludos,
Ababol.

Última edición por Ababol; 17/05/2003 a las 11:46
  #4 (permalink)  
Antiguo 17/05/2003, 15:14
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Ababol,

Has encontrado un bug en Noktemplate. Nunca lo habia detectado. Prometo que para mas tarde, publicare nuevamente la clase con el bug corregido.

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

¿Que esperas de NokTpl 2? Deja tu comentario.

Blog
Mas o menos asi .
  #5 (permalink)  
Antiguo 17/05/2003, 19:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Nok . .cuando tengas el "bug" corregido avisas.

Por cierto .. el "bug" sólo afecta a bloques anidados .. ¿es cierto?

Yo hasta la fecha estoy usando tus Nok templates .. pero tenía cosas hechas ya para la versión ataterior que no soporta anidamiento de bloques .. y .. los anidamientos de bloques que hice creo recordar que eran muy básicos .. así no me he percatado de este "bug" ..

Lo que si que hacia es usar
$html->expandir('Tabla_1','-Bloque_1');

si repetia el mismo bloque en un bucle por ejemplo (no sé si esto ya es otro téma y la estoy liando .. ¬¬ ..)

Bueno, esperamos noticias Nok.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 18/05/2003, 00:38
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Cluster, el bug afecta a los bloques anidados de la siguiente manera:
Código PHP:
<!-- inicioBloqueContenido -->
...
   {
Tabla_1}
   <!-- 
inicioBloqueBloque_1 -->
   ... 
   <!-- 
finBloqueBloque_1 -->
...
...
...
   {
Tabla_2}
   <!-- 
inicioBloqueBloque_2 -->
   ...
   <!-- 
finBloqueBloque_2 -->
...
<!-- 
finBloqueContenido --> 
Es decir, dos bloques al mismo nivel dentro de otro.

Hoy me fue imposible sacar el fix del bug, espero poder mañana.

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 .
  #7 (permalink)  
Antiguo 18/05/2003, 04:46
 
Fecha de Ingreso: agosto-2002
Ubicación: Aragón
Mensajes: 254
Antigüedad: 15 años, 4 meses
Puntos: 0
Gracias a ti, Nok por atender mis dudas. Me alegra que hayas descubierto el bug (lo cierto es que no se me ocurrió mirar el código fuente de la NokTemplate).

Permaneceré atento a la nueva versión.

Saludos,
Ababol.
  #8 (permalink)  
Antiguo 18/05/2003, 18:28
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, Esperaremos el "bug-fix".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 20/05/2003, 00:51
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Bueno ante todo perdon por la demora.
Ya esta disponible la version 1.1.2 de Noktemplate con el bug corregido.
Gracias por detectarlo. Ademas se agrega un pequeño pero util metodo, cargarVirtual(), que lo que hace es generar un "manejador de template" a partir de un string, es decir:

$html->cargarVirtual('miTemplate','Este es un texto que sera tomado como templates. Ademas puede contener {variables}');

de esta manera, se puede guardar los templates en una base de datos, por ejemplo, sin necesidad de ser archivos reales.

La version actualizada esta disponible en http://www.jpw.com.ar/noktemplate/NokTemplate.zip

Saludos
Nok
  #10 (permalink)  
Antiguo 20/05/2003, 00:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ya las bajé .. Grácias Nok.

El método cargarVirtual() vendría a ser como generar una template en el própio código PHP (para no andar cargandola de un archivo externo ...)?

Jeje .. ahora leí el "change log xD":
Cita:
Cambios desde 1.1.0
* - Se agrega el método cargarVirtual que toma el contenido de una variable (String)
* Y la maneja como un si fuera un template, sin tener que obtenerlo desde un archivo.
* Util cuando los templates estan almacenados en una base de datos y no son archivos reales.
*
Y ahora entiendo su uso. Perfecto.

¿Lo que no indicas es el "small bug fix" .. ?

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; 20/05/2003 a las 01:01
  #11 (permalink)  
Antiguo 20/05/2003, 01:09
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 16 años, 7 meses
Puntos: 0
Exactamente cluster, en el change log dentro de la clase esta descripto cual es la funcion del metodo.
Si no esta claro, me avisas.

Saludos.
Nok

Jeje, que vivo que soy (se nota que son las 2:30am) subi una previa. Ahora si esta la definitiva con el reporte del Small fix. Aunque la anterior lo corregia pero no estaba especificado.

Saludos.
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 15:26.