<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pragone.com &#187; Proyectos</title>
	<atom:link href="http://pragone.com/category/proyectos/feed" rel="self" type="application/rss+xml" />
	<link>http://pragone.com</link>
	<description>desarrollo, comunidad y monetización</description>
	<lastBuildDate>Fri, 15 May 2009 16:11:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>eBay Anuncios&#8230;. it&#8217;s live!</title>
		<link>http://pragone.com/proyectos/ebay-anuncios-its-live/78</link>
		<comments>http://pragone.com/proyectos/ebay-anuncios-its-live/78#comments</comments>
		<pubDate>Sun, 08 Mar 2009 20:37:28 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=78</guid>
		<description><![CDATA[Finalmente, luego de un par de meses de arduo trabajo los nuevos sitios de eBay Anuncios, eBay Pisos y de eBay Coches están al aire y funcionando&#8230; todavía quedan algunos pequeños detalles que resolver, pero nada que sea demasiado impactante para la experiencia del usuario en las nuevas páginas. Ha sido un proyecto como ninguno [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente, luego de un par de meses de arduo trabajo los nuevos sitios de <a title="eBay Anuncios. Compra y venta de artículos nuevos y de segunda mano" href="http://www.ebayanuncios.es" target="_blank">eBay Anuncios</a>, <a title="eBay Pisos, alquiler y compra de pisos, chalets y otros" href="http://www.ebaypisos.es" target="_blank">eBay Pisos</a> y de <a title="eBay Coches. Coches y motos, nuevos y de segunda mano" href="http://www.ebaycoches.es" target="_blank">eBay Coches</a> están al aire y funcionando&#8230; todavía quedan algunos pequeños detalles que resolver, pero nada que sea demasiado impactante para la experiencia del usuario en las nuevas páginas.</p>
<p>Ha sido un proyecto como ninguno en mi carrera profesional. El día 2 de Enero de este año empezó su vida como proyecto y cerca del 14 de Enero empezó de forma oficial su desarrollo. En poco menos de dos meses hemos construido una nueva plataforma desde cero (pues no hemos podido aprovechar prácticamente nada del código de Loquo).</p>
<p>Esta nueva plataforma resuelve la mayoría de las limitaciones que Loquo tiene: Un excelente motor de búsquedas; Soporte para atributos flexibles; Mejor soporte para I18N y muchos más.</p>
<p>De aquí mis felicitaciones, no sólo a mi equipo de desarrollo que ha respondido de una forma excelente frente a la presión con un constante buen ánimo y energía, sino a todos los integrantes del equipo: CS, OM/DM, SEO/SEM, al equipo de Liderago  y al equipo de Site Operations de Marktplaats.</p>
<p>Todas las partes han desempeñado su papel de forma magistral&#8230; y, debo decirlo, haber tenido una team-meeting el 3 de Marzo a las 2:00 (a.m.) cuando el sitio empezó a estar &#8220;live&#8221;, y que prácticamente todo el equipo estuviera ahí asegurándose de que su parte estuviera bien ha sido una experiencia genial de integración <img src='http://pragone.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Me siento honrado de trabajar con este equipo.</p>
<p>Es un momento excelente y un proyecto muy especial.</p>
<p>Gracias a todos <img src='http://pragone.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/ebay-anuncios-its-live/78/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>SVD e Indices para búsquedas en espacios de altas dimensiones</title>
		<link>http://pragone.com/proyectos/svd-e-indices-para-busquedas-en-espacios-de-altas-dimensiones/55</link>
		<comments>http://pragone.com/proyectos/svd-e-indices-para-busquedas-en-espacios-de-altas-dimensiones/55#comments</comments>
		<pubDate>Wed, 13 Aug 2008 23:17:42 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[delta-tree]]></category>
		<category><![CDATA[detección spam]]></category>
		<category><![CDATA[imágenes]]></category>
		<category><![CDATA[reducción dimensional]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[SVD]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=55</guid>
		<description><![CDATA[Como comenté en un articulo anterior sobre la detección de Spam en Imágenes, uno de los métodos es la identificación de imágenes duplicadas o casi duplicadas (Near-duplicate detection). Este proceso consiste de dos partes: La creación de un LSH (Locality Sensitive Hash), es decir, crear una especie de &#8220;firma&#8221; que tenga la propiedad de que [...]]]></description>
			<content:encoded><![CDATA[<p>Como comenté en un articulo anterior sobre la <a title="Detección de Spam en Imágenes" href="http://pragone.com/proyectos/deteccion-de-spam-en-imagenes/54" target="_blank">detección de Spam en Imágenes</a>, uno de los métodos es la identificación de imágenes duplicadas o casi duplicadas (Near-duplicate detection).</p>
<p>Este proceso consiste de dos partes:</p>
<ol>
<li>La creación de un LSH (Locality Sensitive Hash), es decir, crear una especie de &#8220;firma&#8221; que tenga la propiedad de que dos imágenes que se parezcan tengan dos firmas parecidas y que dos imágenes que no se parezcan tengan firmas diferentes.</li>
<li>Tener estas firmas en una base de datos para dada una &#8220;firma&#8221; buscar si hay alguna otra imagen cuya firma se parezca lo suficiente.</li>
</ol>
<p>Existen muchas formas de crear la firma, por ejemplo con el uso de <a title="Haar Wavelet" href="http://en.wikipedia.org/wiki/Haar_wavelet" target="_blank">Haar Wavelet</a>, Histogramas de colores, etc. Sin embargo, la parte de la búsqueda es la realmente complicada.</p>
<p>Una firma, puede consistir de 128, 200 o más números enteros. Estas firmas pueden ser vistas como un vector de tantas dimensiones como números la compongan, y de ahí que el título del artículo se refiera a espacios de alta dimensionalidad.</p>
<p>Debido a que buscar los duplicados de una imagen particular (imagen query) es encontrar algún otro &#8220;vector&#8221; en una base de datos cuya distancia a la imagen query sea menor a cierto umbral, estas búsquedas no son manejables con un sistema de base de datos convencional (No sin recorrer toda la base de datos a cada consulta y calcular la distancia de la imagen query con todas las imágenes de la BBDD).</p>
<p>Sin embargo, hay alternativas. La mayoría de ellas tienen que ver con reducciones dimensionales, es decir tratar de representar en menos dimensiones (con menos números) los mismos datos. Esto resulta bastante bien cuando la data es dispersa, ya que probablemente muchas dimensiones no aporten casi información (por ejemplo, en las estructuras de datos utilizadas para la detección de Spam con SVM (Support Vector Machines) en la que cada palabra es una dimensión y el valor de esa dimensión es la cantidad de veces que aparece la palabra en el texto.</p>
<p>Pero cuando la data no es esparcida, los métodos que se basan exclusivamente en reducciones dimensionales no son tan atractivos.</p>
<p>Es por esto que la propuesta descrita en: <a title="Indexing high-dimensional data for efficient in-memory similarity search" href="http://ieeexplore.ieee.org/Xplore/login.jsp?url=/iel5/69/30208/01388245.pdf?temp=x" target="_blank">Indexing High-Dimensional Data for Efficient In-Memory Similarity Search</a> resulta muy interesante.</p>
<p>En este paper se propone la creación de una estructura llamada un delta-tree, en el que los niveles superiores (más cercanos a la raíz) son de dimensiones menores que los inferiores (de hecho las &#8220;hojas&#8221; del árbol son los datos sin ninguna reducción dimensional).</p>
<p>Lo que más me llamó la atención fue la forma en la que se realiza la reducción dimensional: <a title="SVD: Singula Value Decomposition" href="http://http://en.wikipedia.org/wiki/Singular_value_decomposition" target="_blank">SVD:  Singular Value Decomposition</a>. Esta técnica te permite reducir la dimensionalidad de la data con una propiedad interesante:</p>
<p>Dados dos puntos x1 y x2 en el espacio m-dimensional de origen, y dados y1 y y2 sus &#8220;versiones reducidas&#8221;  en el espacio n-dimensional (con n &lt; m),</p>
<p>d(x1,x2) ≤ d(y1,y2), donde d(a,b) es la distancia que hay entre a y b.</p>
<p>De esta forma se puede recorrer el árbol, descartando las ramas que ya se encuentran muy lejos (por encima del umbral) con menos dimensiones (y por lo tanto menos cálculos) y centrar la búsqueda en las dimensiones superiores en un espacio mucho menor.</p>
<p>Esto me parecía muy bueno para ser verdad, así que me instalé <a title="Scilab: Open Source MatLab" href="http://www.scilab.org" target="_blank">SciLab</a> que es un excelente reemplazo gratis  de Matlab (as in beer and in speech), hice una prueba de esta reducción dimensional y comprobé la regla de las distancias empíricamente.</p>
<p>Creé de forma aleatoria una matriz de datos (50 puntos), cada uno de ellos en un espacio de 20 dimensiones, la reduje a 15, 10 y 5 dimensiones y comparé las distancias entre los puntos entre las distintas dimensiones y obtuve gráficos como este:</p>
<div id="attachment_60" class="wp-caption aligncenter" style="width: 510px"><a href="http://pragone.com/wp-content/uploads/2008/08/corr15.gif"><img class="size-full wp-image-60" title="Correlación con una reducción a 15 dimensiones" src="http://pragone.com/wp-content/uploads/2008/08/corr15.gif" alt="Correlación con una reducción a 15 dimensiones" width="500" height="333" /></a><p class="wp-caption-text">Correlación con una reducción a 15 dimensiones</p></div>
<p>Un punto de este gráfico se obtiene de la siguiente forma:</p>
<p>Coordenada x = distancia entre los puntos xi y xj en el espacio original (20 dimensiones)</p>
<p>Coordenada y = distancia entre los puntos xi y xj en el espacio reducido (15 dimensiones en este caso)</p>
<p>Como se puede ver existe una gran cercanía de estos puntos a la recta y=x (la correlación de los puntos en la gráfica de 15 dimensiones es de 0.95), con lo que se puede ver que hay una correlación entre las distancias en el espacio original y el espacio reducido.</p>
<p>Haciendo lo mismo con 10 y luego 5 dimensiones obtuve:</p>
<div id="attachment_61" class="wp-caption aligncenter" style="width: 510px"><a href="http://pragone.com/wp-content/uploads/2008/08/comp10.gif"><img class="size-full wp-image-61" title="Correlación con una reducción a 10 dimensiones" src="http://pragone.com/wp-content/uploads/2008/08/comp10.gif" alt="Correlación con una reducción a 10 dimensiones" width="500" height="333" /></a><p class="wp-caption-text">Correlación con una reducción a 10 dimensiones</p></div>
<p>Como es lógico se redujo más la correlación pues se pierde más información en la reducción dimensional, pero sigue habiendo una fuerte relación entre las distancias en ambos espacios.</p>
<p>Y, finalmente, con una reducción a 5 dimensiones obtuve:</p>
<div id="attachment_62" class="wp-caption aligncenter" style="width: 510px"><a href="http://pragone.com/wp-content/uploads/2008/08/comp5.gif"><img class="size-full wp-image-62" title="Correlación con una reducción a 5 dimensiones" src="http://pragone.com/wp-content/uploads/2008/08/comp5.gif" alt="Correlación con una reducción a 5 dimensiones" width="500" height="333" /></a><p class="wp-caption-text">Correlación con una reducción a 5 dimensiones</p></div>
<p>En el que la correlación si bien existe es bastante débil.</p>
<p>Sin embargo, incluso en este escenario en el que se pierde tanta información por la reducción dimensional, logré verificar que se mantiene la asumpción sobre que las distancias en menores dimensiones son menores que en mayores dimensiones, y por lo tanto el esquema propuesto sirve.</p>
<p>No conozco ningún manejador de base de datos que pudiere utilizar para representar esto&#8230; así que supongo que tendré que crear uno <img src='http://pragone.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/svd-e-indices-para-busquedas-en-espacios-de-altas-dimensiones/55/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Detección de Spam en imágenes</title>
		<link>http://pragone.com/proyectos/deteccion-de-spam-en-imagenes/54</link>
		<comments>http://pragone.com/proyectos/deteccion-de-spam-en-imagenes/54#comments</comments>
		<pubDate>Sat, 09 Aug 2008 14:18:01 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[detección de duplicados]]></category>
		<category><![CDATA[image spam]]></category>
		<category><![CDATA[investigación]]></category>
		<category><![CDATA[loquo]]></category>
		<category><![CDATA[LSH]]></category>
		<category><![CDATA[near-duplicate]]></category>
		<category><![CDATA[OCR]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[spam imágenes]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=54</guid>
		<description><![CDATA[Aprovecho mientras tengo al SciLab entrenando una ANN (Artificial Neural Network) para contarles sobre las últimas investigaciones que estoy haciendo. En Loquo, buena parte de mi labor se centra no solo en el desarrollo de producto, sino en la investigación e innovación en la plataforma. El primer fruto que logramos fue la creación del sistema [...]]]></description>
			<content:encoded><![CDATA[<p>Aprovecho mientras tengo al <a title="Scilab: Open Source MatLab" href="http://www.scilab.org" target="_blank">SciLab</a> entrenando una <a title="ANN: Artificial Neural Network [EN]" href="http://en.wikipedia.org/wiki/Artificial_neural_network" target="_blank">ANN (Artificial Neural Network)</a> para contarles sobre las últimas investigaciones que estoy haciendo.</p>
<p>En Loquo, buena parte de mi labor se centra no solo en el desarrollo de producto, sino en la investigación e innovación en la plataforma.</p>
<p>El primer fruto que logramos fue la creación del sistema de detección de duplicados. Este sistema ha tenido un impacto muy positivo en el sitio, logrando mejorar la calidad del contenido y por lo tanto la experiencia del usuario.</p>
<p>Claro está, los spammers no se iban a quedar de brazos cruzados y, como era lógico, han evolucionado sus técnicas.</p>
<p>Primero, se fueron por la ruta de colocar texto oculto (cuyo color se parece mucho al color de fondo), así que sacamos un sistema que elimina el texto oculto (utilizando un cálculo que toma en consideración la percepción de los colores para el ojo humano). Luego, colocaron texto muy pequeño&#8230; y también lo eliminamos.</p>
<p>Ahora, simplemente colocan textos aleatorios de forma visible y colocan toda la información &#8220;de verdad&#8221; en imágenes.</p>
<p>Por supuesto, colocar esta información en las imágenes las hace prácticamente indetectables&#8230; ¿o no? <img src='http://pragone.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Pues es en eso en lo que estoy trabajando ahora. En luchar contra el Spam en Imágenes.</p>
<h3>Problemas para la detección de Spam en Imágenes</h3>
<p>La detección de Spam en imágenes es particularmente retadora porque una imágen no es más que un conjunto de pixels, cada uno de un color. A diferencia del texto en el que cada palabra tiene un sentido particular, un pixel o linea no tiene ningún significado como tal.Además, las imágenes son información bidimensional, mientras que el texto es de una sola dimensión&#8230;</p>
<p>En fin, es un problema mucho más complicado, así que..</p>
<h3>¿Cómo afrontar el problema de detección de Spam en Imágenes?</h3>
<p>Como siempre, en problemas complejos, no hay una solución sencilla. El sistema que tengo en mente tiene dos módulos principales:</p>
<ul>
<li>Análisis de la imagen: En este se busca extraer información de la imagen para tratar de reconocer si una imágen particular es Spam o no.</li>
<li>Detección de imágenes duplicadas: En este otro, lo que se busca es saber si una imagen se parece a otra que ya se encuentre en el sistema y que haya sido identificada como Spam.</li>
</ul>
<p>Cada una de estas tareas es todo un reto pues consisten de procesamientos altamente complicados, con lo cual escalarlo a una plataforma con tantos visitantes como lo es Loquo (más de 5.5 millones de Usuarios únicos al mes) es un problema doblemente complicado.</p>
<h3>Análisis de la Imagen</h3>
<p>Este sistema consiste en la extracción de información a partir de una imágen.</p>
<p>Evidentemente, la información más &#8220;sencilla&#8221; de extraer son los textos que se encuentren embebidos en la imágen a través de uso de un software <a title="OCR: Optical Character Recognition [EN]" href="http://en.wikipedia.org/wiki/Optical_character_recognition" target="_blank">OCR (Optical Character Recognition)</a>.</p>
<p>Para esto se deben hacer dos pasos:</p>
<ol>
<li><strong>Document Layout Analysis:</strong> Este primer paso consiste en identificar en una imagen las áreas que probablemente contienen texto.</li>
<li><strong>OCR:</strong> Luego, las áreas con alta probabilidad de contener texto son pasadas al software OCR para ver qué es capaz de reconocer.</li>
</ol>
<p>Otra forma de analizar la imagen sería intentar extraer información sobre los objetos que componen la imagen. Este es un proceso aún más complicado, pero podría servir, para, por ejemplo, reconocer si en una imagen hay una pistola o algún otro elemento prohibido.</p>
<h3>Detección de imágenes duplicadas</h3>
<p>Este sistema busca identificar si una imagen dada se parece lo suficiente a alguna otra imagen de una base de datos.</p>
<p>Evidentemente la forma trivial es simplemente compara los hashes de los archivos (MD5 o SHA1). Pero esto sólo sirve para reconocer que se trata del mismo archivo. Basta cambiar un pixel en la imagen y este sistema sería inválido. Por esto, la forma correcta de atajar este problema es con &#8220;Near-Duplicate Image Detection&#8221;.</p>
<p>El sistema de Near-Duplicate Image Detection consiste en crear una especie de Hash a partir de la imagen, pero de tal forma que si dos imágenes se parecen, sus respectivos Hashes también se parezcan. (Esto se conoce como <a title="LSH: Locality Sensitive Hashing [EN]" href="http://en.wikipedia.org/wiki/Locality_sensitive_hashing" target="_blank">LSH: Locality Sensitive Hashing</a>.</p>
<p>En próximos artículos comentaré un poco sobre los avances logrados en cada una de estas áreas.</p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/deteccion-de-spam-en-imagenes/54/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Integrar phpBB3 con tu sitio. (2da integración, 1ra parte)</title>
		<link>http://pragone.com/proyectos/integrar-phpbb3-con-tu-sitio-2da-integracion-1ra-parte/52</link>
		<comments>http://pragone.com/proyectos/integrar-phpbb3-con-tu-sitio-2da-integracion-1ra-parte/52#comments</comments>
		<pubDate>Tue, 10 Jun 2008 21:22:33 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[integración]]></category>
		<category><![CDATA[integrar]]></category>
		<category><![CDATA[interfaz]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpbb]]></category>
		<category><![CDATA[phpbb3]]></category>
		<category><![CDATA[registro]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[usuario]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=52</guid>
		<description><![CDATA[Este artículo es parte de un conjunto de artículos/tutoriales sobre cómo integrar phpBB3 con otro sistema. Puedes ir al artículo principal sobre cómo integrar phpBB3 con tu sitio para ver las distintas formas de integración Este es el segundo artículo o tutorial de la serie sobre cómo integrar phpBB3 con tu sitio. phpBB3 es un [...]]]></description>
			<content:encoded><![CDATA[<div style="border:1px solid darkgray; width:95%; margin: 10px; padding: 6px; background-color:#ddddaa">Este artículo es parte de un conjunto de artículos/tutoriales sobre cómo integrar phpBB3 con otro sistema.<br />
Puedes ir al artículo principal sobre <a style="text-decoration:underline; font-weight:bold" title="tutoriales para integrar phpBB3 con tu sitio" href="http://pragone.com/proyectos/integracion-de-phpbb3-con-tu-sitio/47">cómo integrar phpBB3 con tu sitio</a> para ver las distintas formas de integración</div>
<p>Este es el segundo artículo o tutorial de la serie sobre cómo <a title="Tutorial sobre cómo integrar phpBB3 con tu sitio" href="http://pragone.com/proyectos/integracion-de-phpbb3-con-tu-sitio/47" target="_blank">integrar phpBB3</a> con tu sitio.</p>
<p><a title="phpBB un software de foro gratuito" href="http://www.phpbb.com" target="_blank">phpBB3</a> es un excelente paquete de foros gratuito, escrito en PHP+MySQL. Debido a su gran utilidad y al hecho de que es de código abierto (free as in beer and speech), una de las cosas que muchos queremos hacer es integrarlo con algún otro sistema que tengamos, para poder ofrecer la excelente funcionalidad del foro, sin que esto complique la experiencia del usuario en el sitio.</p>
<p>En este artículo se trata la segunda integración descrita en el artículo: <a title="tutoriales para integrar phpBB3 con tu sitio" href="http://pragone.com/proyectos/integracion-de-phpbb3-con-tu-sitio/47">cómo integrar phpBB3 con tu sitio</a>:</p>
<h3>Al crear un usuario en el otro sistema, automáticamente se crea un usuario en phpBB3 y hacer login en uno de ellos automáticamente te loguea en el otro.</h3>
<p>Esta es una integración un poco más compleja que la anterior y por lo tanto la divido en dos partes. En esta hablo sobre cómo hacer para que al registrar a un usuario en &#8220;el otro sistema&#8221; (el que no es phpBB3), automáticamente quede registrado en el foro. La segunda parte la dejo para otro artículo por ser un poco más compleja y depender de la configuración de los dos sitios (si están o no en el mismo dominio o subdominio).</p>
<h3>La idea básica</h3>
<p>phpBB3 está muy bien hecho, el código es muy modular y es fácil de navegar. Por esto, cuando estudiamos cómo hace phpBB3 la creación de un nuevo usuario nos encontramos con lo que buscamos en el archivo includes/ucp/ucp_register.php [<a title="Source code at code.phpbb.com" href="http://code.phpbb.com/repositories/entry/5/tags/release_3_0_1/phpBB/includes/ucp/ucp_register.php?rev=8499" target="_blank">code</a>] (luego de sortear mucho código de validación).</p>
<p>Para crear un nuevo usuario nos bastaría con este código:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">/* GetUserIp: 
	 *
	 * Taken from: http://forums.whirlpool.net.au/forum-replies-archive.cfm/976380.html
	 *
	 */</span>
&nbsp;
	<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'IN_PHPBB'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$phpbb_root_path</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'PHPBB_ROOT_PATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? PHPBB_ROOT_PATH <span style="color: #339933;">:</span> <span style="color: #0000ff;">'./'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$phpEx</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strrchr</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpbb_root_path</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'common.'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$phpEx</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpbb_root_path</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'includes/functions_user.'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$phpEx</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpbb_root_path</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'includes/functions_module.'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$phpEx</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> GetUserIP<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_X_FORWARDED_FOR'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_X_FORWARDED_FOR'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_CLIENT_IP'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_CLIENT_IP'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">getenv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTTP_X_FORWARDED_FOR'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #990000;">getenv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTTP_X_FORWARDED_FOR'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">getenv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTTP_CLIENT_IP'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #990000;">getenv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'HTTP_CLIENT_IP'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">getenv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$user_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'paolo123'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$user_pass</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'shh123'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$user_email</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'usuario@servidor.de.correo'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$user_lang</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'es'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$user_ip</span> <span style="color: #339933;">=</span> GetUserIP<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'SELECT group_id
		FROM '</span> <span style="color: #339933;">.</span> GROUPS_TABLE <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;
		WHERE group_name = 'REGISTERED'
			AND group_type = &quot;</span> <span style="color: #339933;">.</span> GROUP_SPECIAL<span style="color: #339933;">;</span>
	<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_fetchrow</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_freeresult</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NO_GROUP'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$group_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'group_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Utilizamos el uso horario del foro</span>
	<span style="color: #000088;">$is_dst</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'board_dst'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>	
	<span style="color: #000088;">$timezone</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'board_timezone'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Reunimos toda la data del nuevo usuario</span>
	<span style="color: #000088;">$user_row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'username'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user_name</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_password'</span>		<span style="color: #339933;">=&gt;</span> phpbb_hash<span style="color: #009900;">&#40;</span><span style="color: #000088;">$user_pass</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_email'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user_email</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'group_id'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$group_id</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_timezone'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span>float<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$timezone</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_dst'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$is_dst</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_lang'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user_lang</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_type'</span>		<span style="color: #339933;">=&gt;</span> USER_NORMAL<span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_actkey'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_ip'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user_ip</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_regdate'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_inactive_reason'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_inactive_time'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Register user...</span>
	<span style="color: #000088;">$user_id</span> <span style="color: #339933;">=</span> user_add<span style="color: #009900;">&#40;</span><span style="color: #000088;">$user_row</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cp_data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// This should not happen, because the required variables are listed above...</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$user_id</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NO_USER'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Este código crea un usuario con nombre &#8216;paolo123&#8242; y clave &#8216;shh123&#8242;. Este será un usuario idéntico a cualquier otro usuario que se haya registrado siguiendo el proceso normal del foro. </p>
<h3>Consideraciones finales</h3>
<p>Importante indicar que este código está pensado para ejecutar en un archivo que estuviera en la carpeta raíz del foro, por lo que si no es este el caso, habría que modificar la declaración del principio que dice: <code>$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';</code> cambiando el &#8216;./&#8217; por la ruta relativa o absoluta de la carpeta raíz del foro.</p>
<p><strong>Importante:</strong> Crear el usuario de esta forma, salta todas las verificaciones que hay normalmente en el foro, por lo que es importante asegurarse de que todos los datos son válidos.</p>
<p>La forma de integrar este código con tu sistema la dejo a discreción del usuario, ya que variaría mucho dependiendo del sistema desde el que se invoque&#8230; lo único que hay que tener presente son los datos que necesita este código para ejecutar: <code>$user_name, $user_pass, $user_email, $user_lang</code> y <code>$user_ip</code>.</p>
<p>En el próximo artículo de esta &#8220;serie&#8221; trataré el tema de la segunda parte de esta integración: el manejo de sesiones&#8230; Cómo hacer que cuando un usuario se identifique en uno de los sistemas, quede identificado en el otro también.</p>
<p>Espero les sirva.</p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/integrar-phpbb3-con-tu-sitio-2da-integracion-1ra-parte/52/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Integración de phpBB3 con tu sitio</title>
		<link>http://pragone.com/proyectos/integracion-de-phpbb3-con-tu-sitio/47</link>
		<comments>http://pragone.com/proyectos/integracion-de-phpbb3-con-tu-sitio/47#comments</comments>
		<pubDate>Sun, 08 Jun 2008 12:43:42 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[integración]]></category>
		<category><![CDATA[integrar]]></category>
		<category><![CDATA[interfaz]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpbb3]]></category>
		<category><![CDATA[registro]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[usuario]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=47</guid>
		<description><![CDATA[Hace un tiempo, escribí un artículo sobre cómo integrar phpBB3 con tu sitio. Este post ha tenido bastantes visitas, lo que me lleva a pensar que no hay mucha literatura en español al respecto y que sí hay mucho interés&#8230;. por lo que he decidido que escribiré un conjunto de artículos sobre cómo hacer las [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo, escribí un artículo sobre <a title="¿Cómo integrar phpBB3 con tu sitio?" href="http://pragone.com/proyectos/como-integrar-phpbb3-con-tu-sitio/38" target="_blank">cómo integrar phpBB3 con tu sitio</a>.</p>
<p>Este post ha tenido bastantes visitas, lo que me lleva a pensar que no hay mucha literatura en español al respecto y que sí hay mucho interés&#8230;. por lo que he decidido que escribiré un conjunto de artículos sobre cómo hacer las integraciones.</p>
<p>Lo primero, es que hay muchas formas de integrar phpBB3 con otro sitio web. Las cosas que necesitas hacer dependen de cómo desees que sea esa integración, y por eso el primer paso es tener claro cómo quieres integrar phpBB3 a tu sitio.</p>
<p>Primero que nada, definamos una &#8220;nomenclatura&#8221; para entender bien las distintas formas de integración:</p>
<h2>Partes de los sistemas</h2>
<h3>Registro de usuarios</h3>
<p>Es el conjunto de páginas y el código que se encarga de crear un nuevo usuario en el sistema.</p>
<h3>Identificación</h3>
<p>Una vez creado el usuario, este es el conjunto de páginas y código que se encarga de verificar la información de usuario/clave contra la base de datos de usuarios y que da acceso a un usuario registrado al sitio.</p>
<h3>Manejo de sesión</h3>
<p>Son las porciones de código (nada visible para el usuario) que le indican al sistema si quien está solicitando una página específica es un usuario registrado que ya se ha identificado en la página. Por lo general se maneja a través de Cookies en el navegador del usuario.</p>
<h3>Mis Datos</h3>
<p>Son las páginas en las que el usuario puede entrar para modificar su información (cambio de clave, email, etc).</p>
<h3>Información del sistema</h3>
<p>Con información del sistema me refiero a distintos datos de uno de los sistemas que se podría querer mostrar. Por ejemplo: Número de usuarios registrados en el foro, número de hilos del foro, etc.</p>
<p>Lo mismo para el otro sistema (si por ejemplo el otro sistema es un blog, último post, número de comentarios de un post particular, etc).</p>
<p>Ya habiéndole dado nombre a todo esto, el escenario que nos encontramos al iniciar la integración es este:</p>
<p><img class="aligncenter size-full wp-image-49" title="Partes de los sistemas" src="http://pragone.com/wp-content/uploads/2008/06/parts.jpg" alt="Partes de los sistemas" width="500" height="385" /></p>
<p><strong>Leyenda:</strong></p>
<p>- Cada columna es un módulo.<br />
- La primera fila es la capa de presentación, es decir, las páginas que se le muestra al usuario.<br />
- La segunda fila es la capa de lógica o aplicación, es decir, el código que se ejecuta para realizar la acción solicitada en la página.</p>
<h2>Formas de Integración</h2>
<p>Ya teniendo un estándar para definir las distintas partes, una integración no es más que sustituir o modificar algunas de estas partes en uno de los sistemas por la misma parte en el otro (probablemente con nuevo código).</p>
<p>Algo importante al decidir cómo hacer la integración es que, por más que se deseen integrar los sistemas, siempre se deberá preservar la base de datos de usuarios de cada uno de ellos. Esto es así porque de lo contrario la cantidad de cambios sería muy grande y haría muy difícil que en el futuro se puedan actualizar los sistemas.</p>
<p>Hay muchas formas de realizar la integración entre el phpBB3 y el otro sistema. Lo que haré será escribir distintos artículos explicando cada una de las formas de integración, e iré enlazándolos desde este post a medida que vayan saliendo.</p>
<h3>Integración 1: phpBB3 usa la base de datos de usuario del otro sistema para autenticar a los usuarios. Los usuarios de phpBB3 se crean de forma pasiva.</h3>
<p>[<a title="Integrar phpBB3 con otro sistema. Modalidad 1" href="http://pragone.com/proyectos/como-integrar-phpbb3-con-tu-sitio/38" target="_blank">Ir directamente al artículo</a>]</p>
<p>Esta es la integración más sencilla (gracias a que phpBB3 implementa módulos de autenticación).</p>
<p>Estas son las características de esta integración:</p>
<ul>
<li>El registro de usuarios está completamente deshabilitado en el phpBB3</li>
<li>No se puede alterar la información del usuario en phpBB3.</li>
<li>Al realizar el login en phpBB3, la información del usuario es contrastada con la base de datos de usuario del otro sistema</li>
<li>En caso de que sea la primera vez que un usuario válido del otro sistema entra al phpBB3, un nuevo usuario es creado de forma &#8220;automágica&#8221; en el phpBB3.</li>
<li>Cada sistema maneja sus sesiones de forma independiente.</li>
<li>No se muestra información de un sistema en el otro</li>
</ul>
<p>Gráficamente sería así:</p>
<p><a href="http://pragone.com/proyectos/como-integrar-phpbb3-con-tu-sitio/38"><img class="aligncenter size-full wp-image-50" title="Integración 1: phpBB3 usa la base de datos de usuario del otro sistema para autenticar a los usuarios" src="http://pragone.com/wp-content/uploads/2008/06/integracion1.jpg" alt="Integración 1: phpBB3 usa la base de datos de usuario del otro sistema para autenticar a los usuarios" width="500" height="385" /></a></p>
<p>Aquí está el post en el que se explica <a title="Integrar phpBB3 con otro sistema. Modalidad 1" href="http://pragone.com/proyectos/como-integrar-phpbb3-con-tu-sitio/38" target="_blank">cómo hacer esta integración de phpBB3</a>.</p>
<h3>Integración 2: Al crear un usuario en el otro sistema, automáticamente se crea un usuario en phpBB3 y hacer login en uno de ellos automáticamente te loguea en el otro.</h3>
<p>[<a title="Integrar phpBB3 con otro sistema. Modalidad 2" href="http://pragone.com/proyectos/integrar-phpbb3-con-tu-sitio-2da-integracion-1ra-parte/52" target="_blank">Ir directamente a la primera parte artículo</a>]</p>
<p>Esta integración es diferente de la anterior porque los usuario son creados en phpBB3 de forma activa, es decir, aunque el usuario no haya entrado en el phpBB3 ya su usuario existe.</p>
<p>Estas son las características de esta integración:</p>
<ul>
<li>El registro de usuarios está deshabilitado en uno de los sistemas (aquí se explica con el registro de usuarios deshabilitado en el phpBB3, aunque podría ser en el otro sentido).</li>
<li>Cuando un usuario se registra en el otro sistema, se crea un nuevo usuario tanto en la base de datos del otro sistema como en la de phpBB3</li>
<li>No se puede alterar la información del usuario en el sistema en el que el registro esté deshabilitado (en este caso, no se puede alterar la información en phpBB3).</li>
<li>Al realizar el login en cualquiera de los dos sistemas, la información del usuario es contrastada con la base de datos de dicho sistema, pero se inician las sesiones en ambos, de forma de que basta un login en alguno de ellos para estar logueado en ambos.</li>
<li>No se muestra información de un sistema en el otro</li>
</ul>
<p>Gráficamente sería así:</p>
<p><img class="aligncenter size-full wp-image-51" title="Integracion 2: Creación activa de usuarios" src="http://pragone.com/wp-content/uploads/2008/06/integracion2.jpg" alt="Integracion 2: Creación activa de usuarios" width="500" height="276" /></p>
<p>He dividido este artículo en dos partes:</p>
<ol>
<li>Creación del usuario: <a title="Integrar phpBB3 con otro sistema. Modalidad 2" href="http://pragone.com/proyectos/integrar-phpbb3-con-tu-sitio-2da-integracion-1ra-parte/52" target="_blank">Ver artículo</a></li>
<li>Manejo de sesiones: <span style="color: #ff6600;"><strong>[pronto estará disponible]</strong></span></li>
</ol>
<h2>Más integraciones</h2>
<p>Hay muchas formas de hacer las integraciones. Estaré describiendo las distintas formas dependiendo de lo que sea más solicitado. Deja un comentario solicitando la explicación de una integración si no la ves aquí.</p>
<p>Algunas integraciones ya han sido solicitadas y estoy trabajando en nuevos posts para explicarlas.</p>
<p>También son bienvenidos comentarios en los que me indiques si te sirvió o no alguna integración en particular. Estos comentarios hazlos, por favor, en el post específico de esa forma de integración.</p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/integracion-de-phpbb3-con-tu-sitio/47/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>¿Cómo integrar phpBB3 con tu sitio?</title>
		<link>http://pragone.com/proyectos/como-integrar-phpbb3-con-tu-sitio/38</link>
		<comments>http://pragone.com/proyectos/como-integrar-phpbb3-con-tu-sitio/38#comments</comments>
		<pubDate>Sat, 17 May 2008 17:12:28 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[integrar]]></category>
		<category><![CDATA[interfaz]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpbb]]></category>
		<category><![CDATA[phpbb3]]></category>
		<category><![CDATA[registro]]></category>
		<category><![CDATA[usuario]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=38</guid>
		<description><![CDATA[Este artículo es parte de un conjunto de artículos/tutoriales sobre cómo integrar phpBB3 con otro sistema. Puedes ir al artículo principal sobre cómo integrar phpBB3 con tu sitio para ver las distintas formas de integración phpBB3 es un excelente paquete de foros gratuito y escrito en PHP+MySQL. Particularmente phpBB3 promete muchas mejoras interesantes sobre la [...]]]></description>
			<content:encoded><![CDATA[<div style="border:1px solid darkgray; width:100%; margin: 10px; padding: 6px; background-color:#ddddaa">Este artículo es parte de un conjunto de artículos/tutoriales sobre cómo integrar phpBB3 con otro sistema. <br />Puedes ir al artículo principal sobre <a title="tutoriales para integrar phpBB3 con tu sitio" href="http://pragone.com/proyectos/integracion-de-phpbb3-con-tu-sitio/47" style="text-decoration:underline; font-weight:bold">cómo integrar phpBB3 con tu sitio</a> para ver las distintas formas de integración</div>
<p><a title="phpBB un software de foro gratuito" href="http://www.phpbb.com" target="_blank">phpBB3</a> es un excelente paquete de foros gratuito y escrito en PHP+MySQL.</p>
<p>Particularmente phpBB3 promete muchas mejoras interesantes sobre la versión anterior, por lo que he decidido utilizarlo para el foro del nuevo proyecto en el que estoy trabajando (jugar-fútbol.com).</p>
<p>Sin embargo, ya me había currado un proceso de registro y prefería evitar que un usuario registrado tuviera que registrarse nuevamente para poder acceder a los foros&#8230; y por otro lado, la experiencia me ha dicho que permitir la publicación sin registro en un foro es invitar al desastre y a la llegada de Spambots.</p>
<p>Así que me puse a investigar y una de las cosas interesantes del phpBB3 es que tiene módulos de identificación. El phpBB viene de base con 3: DB (el módulo por defecto en el que verifica la información de los usuarios en su propia BD), Apache (con htaccess y cosas por el estilo) y LDAP (contra un directorio LDAP).</p>
<p>Basándome en el de LDAP pude construir de forma muy rápida un proceso que te permitiera identificarte en el foro. Esto es lo que hay que hacer:</p>
<p>En la carpeta phpbb/includes/auth/  creas un nuevo archivo llamado auth_&lt;algo&gt;.php donde ese &lt;algo&gt; será el nombre de tu módulo. En mi caso fue auth_jugar.php.</p>
<p>En ese archivo debes implementar una funcion llamada: login_&lt;algo&gt; que recibe como parámetros el username y el password indicados en el formulario de identificación de un usuario.</p>
<p>PHPBB espera como respuesta de esta función un arreglo asociativo con tres elementos: &#8216;status&#8217;, &#8216;error_msg&#8217; y &#8216;user_row&#8217;.</p>
<p>Los posibled valores para status (que yo haya utilizado) son:</p>
<ul>
<li>LOGIN_ERROR_PASSWORD: Error en el password (por ejemplo, el password ha venido vacío)</li>
<li>LOGIN_ERROR_USERNAME: Indica que el login o la combinación login/clave son inválidos</li>
<li>LOGIN_ERROR_ACTIVE: El usuario no se encuentra activo</li>
<li>LOGIN_SUCCESS: Todo bien&#8230; debemos dejar entrar al usuario</li>
<li>LOGIN_SUCCESS_CREATE_PROFILE: Este es muy interesante&#8230; Indica que los datos son correctos y que debemos crear al usuario en PHPBB y permitirle el acceso.</li>
</ul>
<p>Es este último status el que es más útil para la integración, pues la primera vez que un usuario ya registrado en mi sistema de registro vaya al foro, creará su usuario del foro de forma transparente.</p>
<p>Los valores de error_msg y user_row dependen del status de respuesta y me parece que lo más fácil será colocar el código que he utilizado. Siéntanse libres de hacer Copy&amp;Paste y ajustar a sus necesidades.</p>
<p>Ya para terminar recomendaría que impidieran que estos usuarios puedan modificar su información de email y clave y que lo deban hacer desde tu sistema actual de registro.</p>
<p>Espero sea de utilidad.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
*
* Jugar auth plug-in for phpBB3
*
* Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him.
*
* @package login
*
*/</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* @ignore
*/</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'IN_PHPBB'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Aquí cargo cosas que necesito para verificar los datos del usuario</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'/forum_env.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
* Login function
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> login_jugar<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span><span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$db</span><span style="color: #339933;">,</span> <span style="color: #000088;">$config</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// do not allow empty password</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'status'</span>	<span style="color: #339933;">=&gt;</span> LOGIN_ERROR_PASSWORD<span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'error_msg'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'NO_PASSWORD_SUPPLIED'</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'user_row'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user_id'</span> <span style="color: #339933;">=&gt;</span> ANONYMOUS<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$username</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'status'</span>	<span style="color: #339933;">=&gt;</span> LOGIN_ERROR_USERNAME<span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'error_msg'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'LOGIN_ERROR_USERNAME'</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'user_row'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user_id'</span> <span style="color: #339933;">=&gt;</span> ANONYMOUS<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Aquí es donde verifico los datos en mi registro existente</span>
	<span style="color: #000088;">$jugar_user</span> <span style="color: #339933;">=</span> ForumUser<span style="color: #339933;">::</span><span style="color: #004000;">validateCredentials</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$jugar_user</span> instanceOf ForumUser<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span><span style="color: #0000ff;">'SELECT user_id, username, user_password, user_passchg, user_email, user_type
			FROM '</span> <span style="color: #339933;">.</span> USERS_TABLE <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;
			WHERE username_clean = '&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_escape</span><span style="color: #009900;">&#40;</span>utf8_clean_string<span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_fetchrow</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_freeresult</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// User inactive...</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user_type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> USER_INACTIVE <span style="color: #339933;">||</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'user_type'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> USER_IGNORE<span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
					<span style="color: #0000ff;">'status'</span>		<span style="color: #339933;">=&gt;</span> LOGIN_ERROR_ACTIVE<span style="color: #339933;">,</span>
					<span style="color: #0000ff;">'error_msg'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ACTIVE_ERROR'</span><span style="color: #339933;">,</span>
					<span style="color: #0000ff;">'user_row'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #339933;">,</span>
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// Successful login... set user_login_attempts to zero...</span>
			<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'status'</span>		<span style="color: #339933;">=&gt;</span> LOGIN_SUCCESS<span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'error_msg'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'user_row'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// retrieve default group id</span>
			<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'SELECT group_id
				FROM '</span> <span style="color: #339933;">.</span> GROUPS_TABLE <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;
				WHERE group_name = '&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_escape</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'REGISTERED'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;'
					AND group_type = &quot;</span> <span style="color: #339933;">.</span> GROUP_SPECIAL<span style="color: #339933;">;</span>
			<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_fetchrow</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql_freeresult</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NO_GROUP'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// generate user account data</span>
			<span style="color: #000088;">$user_row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'username'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$username</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'user_password'</span>	<span style="color: #339933;">=&gt;</span> phpbb_hash<span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'user_email'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$jugar_user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">email</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'group_id'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'group_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'user_type'</span>		<span style="color: #339933;">=&gt;</span> USER_NORMAL<span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'user_ip'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ip</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">// this is the user's first login so create an empty profile</span>
			<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'status'</span>		<span style="color: #339933;">=&gt;</span> LOGIN_SUCCESS_CREATE_PROFILE<span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'error_msg'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'user_row'</span>		<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$user_row</span><span style="color: #339933;">,</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'status'</span>	<span style="color: #339933;">=&gt;</span> LOGIN_ERROR_USERNAME<span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'error_msg'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'LOGIN_ERROR_USERNAME'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'user_row'</span>	<span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user_id'</span> <span style="color: #339933;">=&gt;</span> ANONYMOUS<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/como-integrar-phpbb3-con-tu-sitio/38/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Detección de duplicados</title>
		<link>http://pragone.com/proyectos/deteccion-de-duplicados-2/37</link>
		<comments>http://pragone.com/proyectos/deteccion-de-duplicados-2/37#comments</comments>
		<pubDate>Tue, 06 May 2008 21:45:05 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[deteccion]]></category>
		<category><![CDATA[duplicados]]></category>
		<category><![CDATA[loquo]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=37</guid>
		<description><![CDATA[Hoy hemos lanzado en Loquo un nuevo sistema para la lucha contra el SPAM. Es un sistema avanzado de detección de duplicados. Aunque apenas ha comenzado su vida, los resultados resultan prometedores. La idea básica es que si cada anuncio &#8220;diferente&#8221; puede ser publicado sólo una vez al día (esto podría cambiar en el futuro), [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy hemos lanzado en Loquo un nuevo sistema para la lucha contra el SPAM.</p>
<p>Es un sistema avanzado de detección de duplicados. Aunque apenas ha comenzado su vida, los resultados resultan prometedores.</p>
<p>La idea básica es que si cada anuncio &#8220;diferente&#8221; puede ser publicado sólo una vez al día (esto podría cambiar en el futuro), entonces el trabajo de los Spammers se vuelve mucho más complicado pues ya no pueden depender de un &#8220;simple&#8221; sistema automátizado para la publicación masiva de anuncios.</p>
<p>Creo que todos los usuarios de <a title="Anuncios clasificados gratuitos" href="http://www.loquo.com" target="_blank">Loquo,</a> estarán de acuerdo conmigo en que la calidad de los anuncios había caído considerablemente en los últimos meses. Y en buena parte esto se debe a que no tenemos la capacidad de revisar cada uno de los anuncios que es publicado, y si bien la comunidad hace un trabajo excelente a la hora de marcar los anuncios, no resultaba suficiente.</p>
<p>El problema resulta muy complicado de atacar y estamos conscientes de que de esta forma estamos alterando todo un ecosistema que gira al rededor de la página. Sin embargo, esperamos que el cambio sea a positivo. Digo esto por varias razones:</p>
<p><strong>Revisión de todos los anuncios&#8230; ¿cómo?</strong></p>
<p>Uno de los principales problemas para garantizar la calidad de los anuncios es poder revisar la mayor cantidad posible de ellos. Sin embargo, esto es una tarea imposible. Sólo tomando Barcelona como muestra, antes de la implementación de este sistema, la media de nuevos anuncios era de más de 24 por minuto, sin embargo, no es algo estable a lo largo del día. Aproximadamente el 30% era fuera de horario de oficina, y además en horas pico, el promedio (de nuevo, sólo en Barcelona) era de 1.3 anuncios <em>por segundo</em>!!</p>
<p>No existen recursos suficientes para revisar todos estos anuncios en ninguna empresa. Claro está, portales de menor dimensión, o en los que se cobre por la publicación se pueden dar este lujo o costear la externalización&#8230; pero ese no es nuestro caso.</p>
<p><strong>La regla del 1%</strong></p>
<p>Como sucede con casi todas las cosas en Internet, Loquo también se ciñe con precisión casi matemática a esta <a title="Regla del 1%" href="http://www.microsiervos.com/archivo/internet/regla-1-por-ciento.html" target="_blank">regla de facto del 1%</a> que viene a reemplazar a la regla de Pareto del 80-20 en el mundo offline y que definen así en Microsiervos:</p>
<blockquote><p>Está empezando a hablarse de una regla que sugiere que si pones a 100 personas en línea entonces una creará contenido, 10 interactuarán con este, ya sea comentando u ofreciendo mejoras, y los otros 89 simplemente lo mirarán.</p></blockquote>
<p>Esta regla también se ajusta al comportamiento de los usuarios a la hora de publicar en una versión un tanto modificada: el 1% (o incluso menos) representa a los spammers más fuertes. un 10% serán usuarios &#8220;muy activos&#8221; que si bien publican muchos anuncios (más de los que sería ideal) por lo menos publican anuncios válidos, y el resto 89% son los usuarios como tu y yo que publican un piso en alquiler o algún producto de segunda mano para vender o fotografías para la home <img src='http://pragone.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>El principal problema con esto es que la mayor parte del tiempo del equipo de soporte se estaba dedicando a responder a las preguntas, comentarios, quejas, etc de los usuarios y a tratar de paliar el efecto destructivo de ese 1% de spammers &#8220;heavy-duty&#8221;.</p>
<p>Dicho esto, con este sistema esperamos poder deshacernos lo máximo posible de ese 1% y mantener bajo control al segundo grupo del 10%. El 89% de los usuarios simplemente nunca se verán afectados por este cambio pues para ellos publicar un anuncio al día es más que suficiente para promocionar su oferta.</p>
<p>Más aún, ese 89% (e incluso el 10% de usuarios &#8220;muy activos&#8221;) se verá beneficiado por este cambio pues su anuncio tendrá más visibilidad al eliminar la basura que lo desplaza hacia abajo en el listado. Así, que el resultado esperado es: mayor satisfacción y efectividad para la mayoría de los usuarios que publican anuncios y una mejor experiencia para los visitantes que encontrarán un contenido de mayor calidad.</p>
<p><strong>¿Y qué pasa con ese 10%?</strong></p>
<p>Este es el grupo que más afectado se siente por la implantación del nuevo sistema, pero lo cierto es que el mayor cambio será en sus costumbres y no en sus resultados.</p>
<p>Por ejemplo, en las secciones de contacto de Loquo, existen sólo en Barcelona unos 472.154 anuncios activos&#8230; y esta sección tiene una duración de apenas 30 días. En esta sección (que es donde la mayor parte de ese 10% publica) se podrían reducir los anuncios a una décima parte o a un veinteavo sin afectar la experiencia del visitante. ¿Por qué?&#8230; saquemos unas cuentas: si hubiera sólo un veinteavo de los anuncios, todavía habría unos 23.600 anuncios, es decir, un promedio de casi 800 por día, a 75 anuncios por página, esto significaría que un usuario debería navegar por 11 páginas antes de llegar al siguiente día!, me parece que sigue habiendo una gran abundancia de contenido.</p>
<p>Igualmente, si un usuario que publica en esta sección se está &#8220;viendo obligado&#8221; a publicar hasta 20 veces el mismo anuncio en un día porque bajan demasiado rápido (el orden de los anuncios es cronológico), ahora su anuncio bajará a un veinteavo de la velocidad, con lo que efectivamente publicar un anuncio le bastaría para obtener la misma visibilidad y por lo tanto los mismos contactos.</p>
<p>Sin embargo, estoy seguro de que será un cambio complicado de asimilar al principio, no será sino hasta que vean que no se reduce la efectividad de sus anuncios que se sientan tranquilos con este sistema. Llevan mucho tiempo haciéndolo de la forma actual y éste como cualquier otro cambio generará incertidumbre.</p>
<p><strong>Beneficios para el equipo de Loquo (y para los usuarios)</strong></p>
<p>Lógicamente, contar con una base de anuncios menor y más limpia permitirá al equipo de soporte revisar una mayor cantidad de los anuncios y poder tomar medidas más correctivas que punitivas. Mejorando en todos los sentidos la experiencia de los usuarios</p>
<p><strong>Otros beneficios del sistema</strong></p>
<p><em>Búsquedas</em></p>
<p>La implantación de este sistema tiene otros beneficios para los visitantes, si ahora realizas una búsqueda en Loquo, es posible que consigas en algunas secciones el mismo anuncio repetido varias veces. Esto representa una pérdida de tiempo para el visitante que debe navegar e invertir más tiempo en encontrar más anuncios diferentes.</p>
<p><em>Sistemas</em></p>
<p>Se los digo por experiencia, manejar un sitio con más de 4MM de visitantes al mes no es sencillo, desde un punto de vista de sistemas es todo un reto mantener la disponibilidad del sitio en todo momento.</p>
<p>Uno de los principales inconvenientes es precisamente el crecimiento de la Base de Datos de anuncios. Contar con un sistema que permita reducir la cantidad de anuncios reales será un alivio al igual que permitirá mejorar el tiempo de respuesta de la página.</p>
<p><strong>Finalmente..</strong></p>
<p>Este es uno de los proyectos más importantes y con mayor impacto que hemos realizado en Loquo. Tenemos muchas esperanzas en él y estaremos todo lo atentos que podamos a los comentarios de los usuarios (más de lo habitual) para poder ajustarlo de la mejor forma posible.</p>
<p>Deseadnos suerte!</p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/deteccion-de-duplicados-2/37/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Nuevo proyecto: jugar-futbol.com</title>
		<link>http://pragone.com/proyectos/nuevo-proyecto-jugar-futbolcom/36</link>
		<comments>http://pragone.com/proyectos/nuevo-proyecto-jugar-futbolcom/36#comments</comments>
		<pubDate>Fri, 02 May 2008 12:57:48 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[campos]]></category>
		<category><![CDATA[futbol]]></category>
		<category><![CDATA[jugar-futbol.com]]></category>
		<category><![CDATA[proyecto]]></category>

		<guid isPermaLink="false">http://pragone.com/?p=36</guid>
		<description><![CDATA[Hola, Pues escribo luego de un extendido período de silencio para comentarles por primera vez sobre un nuevo proyecto en el que estoy trabajando: jugar-futbol.com Este proyecto busca ofrecer en un solo sitio las cosas que los entusiastas de este deporte necesitamos para poder practicarlo. Eso sí&#8230; en el mundo real&#8230; offline. No es un [...]]]></description>
			<content:encoded><![CDATA[<p>Hola,</p>
<p>Pues escribo luego de un extendido período de silencio para comentarles por primera vez sobre un nuevo proyecto en el que estoy trabajando: jugar-futbol.com</p>
<p>Este proyecto busca ofrecer en un solo sitio las cosas que los entusiastas de este deporte necesitamos para poder practicarlo. Eso sí&#8230; en el mundo real&#8230; offline.</p>
<p>No es un sitio de juego online, ni es un directorio de sitios de fútbol. Busca ser una comunidad en la que encuentres las herramientas que buscas para poder practicar este deporte.</p>
<p>El sitio todavía no se encuentra público (aunque espero poder terminar las primeras funcionalidades este puente y sacarlo a producción). La primera etapa servirá para resolver uno de los problemas que tenemos cuando queremos jugar fútbol: ¿Dónde?.</p>
<p>Esta primera etapa consta de un directorio de campos de fútbol en toda España&#8230; claro está no sería capaz de rellenar toda la información por lo que cuento con que a los visitantes le mole el sitio y ayuden agregando un par de sitios que conozcan.</p>
<p>Muy pronto estará al aire&#8230; así que si te da curiosidad espera un próximo post en el que colocaré la dirección&#8230; o déjame un comentario aquí y te mandaré un correo cuando el gran momento llegue.</p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/nuevo-proyecto-jugar-futbolcom/36/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trucos para Smarty: 3. Reducir el I/O, compiler plugins</title>
		<link>http://pragone.com/proyectos/trucos-para-smarty-3-reducir-el-io-compiler-plugins/33</link>
		<comments>http://pragone.com/proyectos/trucos-para-smarty-3-reducir-el-io-compiler-plugins/33#comments</comments>
		<pubDate>Sat, 15 Mar 2008 14:12:20 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>

		<guid isPermaLink="false">http://pragone.com/interesante/trucos-para-smarty-3-reducir-el-io-compiler-plugins/33</guid>
		<description><![CDATA[Unos de los secretos de la extensibilidad de Smarty es su sistema de Plugins. Son muy útiles en el sentido de que te permiten agregar funcionalidades de una forma simple. Sin embargo, vienen con un precio: Un archivo más a leer a la hora de procesar una petición. Esto es despreciable en el caso de [...]]]></description>
			<content:encoded><![CDATA[<p>Unos de los secretos de la extensibilidad de Smarty es su sistema de Plugins. Son muy útiles en el sentido de que te permiten agregar funcionalidades de una forma simple. Sin embargo, vienen con un precio: Un archivo más a leer a la hora de procesar una petición.</p>
<p>Esto es despreciable en el caso de los Plugins de compilación, pues sólo se utilizan una vez y luego se dejan de lado (de hecho, las funcionalidades que busques agregar a la compilación es bueno hacerlas como plugins).</p>
<p>Pero para las funciones y los modificadores pueden ser un gran problema.</p>
<p>Esto hay dos formas de resolverlo:</p>
<p><em>La forma simple</em></p>
<p>Smarty permite a través de los métodos register_function y register_modifier la inclusión de estos &#8220;plugins&#8221; sin tener que cargar un archivo adicional. Para este caso, de nuevo resulta muy útil el haber creado una función propia que extienda al Smarty, pues simplemente podemos colocar las definiciones de estas funciones en nuestra clase hija de Smarty y cargarlas en el constructor.</p>
<p><em>La forma no tan simple&#8230; pero mejor</em></p>
<p>Otra forma de lograr mejores resultados es modificar las funciones de Smarty cambiándolas de funciones de tiempo de ejecución a funciones de compilación.</p>
<p>Este es un procedimiento que no es tan trivial, pues hay que tener en cuenta que en tiempo de compilación no tenemos certeza de los valores que tienen las variables.</p>
<p>Para esto veamos un ejemplo.</p>
<p>Veamos este template sencillo que hace uso del tag {counter}. Este es un tag relativamente simple, sin embargo ofrece varios parámetros que modifican su comportamiento.</p>
<p>Este es el template:</p>
<p>Archivo: DOCROOT/templates/ejemplo3.tpl</p>

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"><span style="color: #009000;">&lt;br&gt;</span>
<span style="color: #009000;">&lt;table cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;&gt;</span>
<span style="color: #009000;">&lt;tr&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span>up:1<span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span>up:1<span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span>start:3; up:1<span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span>up:2<span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span>down:1<span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span>up:1 on &gt;=fifth down:1<span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span>up:1;no-print;using assign<span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;/tr&gt;</span>
<span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;third&quot;</span> <span style="color: #6A0A0A;">start</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;3&quot;</span> print<span style="color: #D36900;">=</span>false<span style="color: #D36900;">&#125;</span>
<span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">section</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;myloop&quot;</span> <span style="color: #6A0A0A;">loop</span><span style="color: #D36900;">=</span><span style="color: #cc66cc;">11</span><span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;TR&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;second&quot;</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;third&quot;</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;fourth&quot;</span> skip<span style="color: #D36900;">=</span><span style="color: #cc66cc;">2</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;fifth&quot;</span> direction<span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;down&quot;</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;sixth&quot;</span> print<span style="color: #D36900;">=</span>true<span style="color: #D36900;">&#125;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">if</span> <span style="color: #00aaff;">$smarty</span>.<span style="color: #0600FF;">section</span>.<span style="color: #006600;">myloop</span>.<span style="color: #006600;">index</span> <span style="color: #D36900;">==</span> <span style="color: #cc66cc;">5</span><span style="color: #D36900;">&#125;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;sixth&quot;</span> direction<span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;down&quot;</span> print<span style="color: #D36900;">=</span>false<span style="color: #D36900;">&#125;</span><span style="color: #D36900;">&#123;</span><span style="color: #D36900;">/</span><span style="color: #0600FF;">if</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;TD&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">counter</span> <span style="color: #6A0A0A;">name</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;seventh&quot;</span> print<span style="color: #D36900;">=</span>false <span style="color: #008000;">assign</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;counter6&quot;</span><span style="color: #D36900;">&#125;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$counter6</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/TD&gt;</span>
<span style="color: #009000;">&lt;/TR&gt;</span>
<span style="color: #D36900;">&#123;</span><span style="color: #D36900;">/</span><span style="color: #0600FF;">section</span><span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/table&gt;</span></pre></div></div>

<p>y este el resultado de su ejecución:</p>
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<td>up:1</td>
<td>up:1</td>
<td>start:3; up:1</td>
<td>up:2</td>
<td>down:1</td>
<td>up:1 on &gt;=fifth down:1</td>
<td>up:1;no-print;using assign</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>4</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>5</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>6</td>
<td>5</td>
<td>-1</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>7</td>
<td>7</td>
<td>-2</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
<td>8</td>
<td>9</td>
<td>-3</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
<td>9</td>
<td>11</td>
<td>-4</td>
<td>6</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>7</td>
<td>10</td>
<td>13</td>
<td>-5</td>
<td>6</td>
<td>7</td>
</tr>
<tr>
<td>8</td>
<td>8</td>
<td>11</td>
<td>15</td>
<td>-6</td>
<td>5</td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td>9</td>
<td>12</td>
<td>17</td>
<td>-7</td>
<td>4</td>
<td>9</td>
</tr>
<tr>
<td>10</td>
<td>10</td>
<td>13</td>
<td>19</td>
<td>-8</td>
<td>3</td>
<td>10</td>
</tr>
<tr>
<td>11</td>
<td>11</td>
<td>14</td>
<td>21</td>
<td>-9</td>
<td>2</td>
<td>11</td>
</tr>
</table>
<p>Ahora bien, ¿cómo compila Smarty este template?</p>
<p>Archivo: DOCROOT/smartystuff/compile/%%64^64F^64F63ED0%%ejemplo3.tpl.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #666666; font-style: italic;">/* Smarty version 2.6.19, created on 2008-03-15 14:59:55
         compiled from ejemplo3.tpl */</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span>SMARTY_CORE_DIR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'core.load_plugins.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
smarty_core_load_plugins<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'plugins'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'function'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'counter'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ejemplo3.tpl'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;br&gt;
&lt;table cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;TD&gt;up:1&lt;/TD&gt;
&lt;TD&gt;up:1&lt;/TD&gt;
&lt;TD&gt;start:3; up:1&lt;/TD&gt;
&lt;TD&gt;up:2&lt;/TD&gt;
&lt;TD&gt;down:1&lt;/TD&gt;
&lt;TD&gt;up:1 on &gt;=fifth down:1&lt;/TD&gt;
&lt;TD&gt;up:1;no-print;using assign&lt;/TD&gt;
&lt;/tr&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'third'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'start'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'3'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'print'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'myloop'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#41;</span> ? <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'max'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> ? <span style="color: #cc66cc;">0</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
&nbsp;
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rownum'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index_prev'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index_next'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'first'</span><span style="color: #009900;">&#93;</span>      <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'last'</span><span style="color: #009900;">&#93;</span>       <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;TR&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'second'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'third'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'fourth'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'skip'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'fifth'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'direction'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'sixth'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'print'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'sixth'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'direction'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'down'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'print'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> smarty_function_counter<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'seventh'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'print'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'assign'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'counter6'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'counter6'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;/TR&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endfor</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/table&gt;</pre></div></div>

<p>El código no es del todo limpio (de hecho es bastante sucio), sin embargo , obviando la parte del {section} es bastante comprensible&#8230; y quisiera presta atención a dos cosas: La primera parte precisamente carga el plugin que implementa el tag {counter}; y las distintas invocaciones al plugin que lucen más o menos así: echo smarty_function_counter(array(), $this);</p>
<p>Parece un poco inútil que para un simple counter se cargue un archivo adicional y se invoque a una funcion. Cuando, en su caso más sencillo, eso es algo que se podría lograr con un: $i = 1; echo $i++;</p>
<p>Aquí es donde entra el beneficio de los plugins de compilación de Smarty.</p>
<p>Vamos a reemplazar la función por un plugin de compilación.</p>
<p>El plugin que necesitamos sería este:</p>
<p>Archivo: DOCROOT/classes/smarty/libs/plugins/compiler.counter_compile.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Smarty {compiler} compiler function plugin
 *
 * Type:     compiler function&lt;br&gt;
 * Name:     counter&lt;br&gt;
 * Purpose:  print out a counter value
 * @author Paolo Ragone &lt;pragone at gmail dot com&gt; (initial author)
 * @param string containing name, start, skip, direction, print and assign attributes
 * @param Smarty_Compiler
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> smarty_compiler_counter_compile<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag_attrs</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$compiler</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$_params</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span>_parse_attrs<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag_attrs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$_confvar_prefix</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'$this-&gt;_tpl_vars[\'__counters_conf__\']'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'\'default\''</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$myconf</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_confvar_prefix</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'['</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">']'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$myskip</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'$_counter[\'skip\']'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$mydir</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'$_counter[\'direction\']'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$myassign</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'$_counter[\'assign\']'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$myval</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'$_counter[\'val\']'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$r</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'$_counter =&amp; '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myconf</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">';'</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$myval</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = (int)'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">' if (!isset('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myval</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')) {'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myval</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = 1;} '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$myskip</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">' if (!isset('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myskip</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')) {'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myskip</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = 1;} '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$mydir</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">' if (!isset('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$mydir</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')) {'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$mydir</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = \'up\';} '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$myassign</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'print'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'print'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'false'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'if (empty('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myassign</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')) { print '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myval</span>  <span style="color: #339933;">.</span> <span style="color: #0000ff;">';} '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'if (!empty('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myassign</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')) { $this-&gt;assign('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myassign</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">','</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myval</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'); } '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'if ('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$mydir</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' == \'down\') {'</span>  <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">.</span> 
				<span style="color: #000088;">$myval</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'-= '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myskip</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">.</span> 
				<span style="color: #0000ff;">'} else {'</span>  <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">.</span>
				<span style="color: #000088;">$myval</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'+= '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myskip</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; } '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'unset($_counter);'</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$r</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Y el código del template compilado (una vez cambiados los tags de {counter} por {counter_compile} es (he creado una copia del template):</p>
<p>Archivo: DOCROOT/smartystuff/compile/%%C3^C34^C34FA758%%ejemplo3.1.tpl.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #666666; font-style: italic;">/* Smarty version 2.6.19, created on 2008-03-15 14:59:56
         compiled from ejemplo3.1.tpl */</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;br&gt;
&lt;table cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;TD&gt;up:1&lt;/TD&gt;
&lt;TD&gt;up:1&lt;/TD&gt;
&lt;TD&gt;start:3; up:1&lt;/TD&gt;
&lt;TD&gt;up:2&lt;/TD&gt;
&lt;TD&gt;down:1&lt;/TD&gt;
&lt;TD&gt;up:1 on &gt;=fifth down:1&lt;/TD&gt;
&lt;TD&gt;up:1;no-print;using assign&lt;/TD&gt;
&lt;/tr&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'third'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #0000ff;">'3'</span><span style="color: #339933;">;</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'myloop'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#41;</span> ? <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'max'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> ? <span style="color: #cc66cc;">0</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
&nbsp;
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rownum'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index_prev'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index_next'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'first'</span><span style="color: #009900;">&#93;</span>      <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'last'</span><span style="color: #009900;">&#93;</span>       <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;TR&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'second'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'third'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fourth'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'fifth'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'down'</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sixth'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sixth'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'down'</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter</span> <span style="color: #339933;">=&amp;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'__counters_conf__'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'seventh'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'counter6'</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'val'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+=</span> <span style="color: #000088;">$_counter</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> 
<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'counter6'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;/TR&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endfor</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/table&gt;</pre></div></div>

<p>Sé lo que están pensando&#8230; esto en vez de mejorar empeora. Pero no es así. Hemos eliminado la carga de un archivo adicional (el del plugin del counter) y aunque el template sea más grande, hemos reducido el número total de líneas de código a ejecutar (contando las que se ejecutarían al invocar la función del counter).</p>
<p>Ya para terminar (y para quitarnos el mal sabor de boca de haber tenido que mirar código de este tipo), les propongo una versión alternativa.</p>
<p>Para un caso más simple en el que los valores que le pasamos a al tag {counter} son estáticos y no varían durante la ejecución del tpl (por ejemplo, no cambiamos el sentido o incrementamos el skip basándonos en una variable de tiempo de ejecución&#8230; vamos, el caso típico. Podemos utilizar esta otra versión del counter compilado:</p>
<p>Archivo: DOCROOT/classes/smarty/libs/plugins/compiler.simple_counter_compile.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Smarty {compiler} compiler function plugin
 *
 * Type:     compiler function&lt;br&gt;
 * Name:     counter&lt;br&gt;
 * Purpose:  print out a counter value
 * @author Paolo Ragone &lt;pragone at gmail dot com&gt; (initial author)
 * @param string containing name, start, skip, direction, print and assign attributes
 * @param Smarty_Compiler
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> smarty_compiler_simple_counter_compile<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag_attrs</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$compiler</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$_params</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span>_parse_attrs<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag_attrs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span>_dequote<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$myvar</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'$_counter_'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$name</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$myvar</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = (int) '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span>_dequote<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">' if (!isset('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myvar</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')) {'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myvar</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' = 1;} '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$mydir</span>  <span style="color: #339933;">=</span> <span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span>_dequote<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'direction'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #000088;">$mydir</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'up'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'$this-&gt;assign('</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'assign'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">','</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myvar</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'); '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'print'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span>_dequote<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'print'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'false'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'print '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myvar</span>  <span style="color: #339933;">.</span> <span style="color: #0000ff;">';'</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$myskip</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$compiler</span><span style="color: #339933;">-&gt;</span>_dequote<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'skip'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$myskip</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$mydir</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'down'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$myvar</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'-= '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myskip</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$r</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$myvar</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'+= '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$myskip</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'; '</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$r</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Luego de reemplazar las invocaciones de {counter_compile} por {simple_counter_compile} el código compilado es MUCHO mejor:</p>
<p>Archivo:DOCROOT/smartystuff/compile/%%84^84E^84EFDD88%%ejemplo3.2.tpl.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #666666; font-style: italic;">/* Smarty version 2.6.19, created on 2008-03-15 15:01:09
         compiled from ejemplo3.2.tpl */</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;br&gt;
&lt;table cellpadding=&quot;5&quot; cellspacing=&quot;0&quot; border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;TD&gt;up:1&lt;/TD&gt;
&lt;TD&gt;up:1&lt;/TD&gt;
&lt;TD&gt;start:3; up:1&lt;/TD&gt;
&lt;TD&gt;up:2&lt;/TD&gt;
&lt;TD&gt;down:1&lt;/TD&gt;
&lt;TD&gt;up:1 on &gt;=fifth down:1&lt;/TD&gt;
&lt;TD&gt;up:1;no-print;using assign&lt;/TD&gt;
&lt;/tr&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$_counter_third</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span> <span style="color: #000088;">$_counter_third</span><span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'myloop'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">11</span><span style="color: #009900;">&#41;</span> ? <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">max</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_loop</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'max'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> ? <span style="color: #cc66cc;">0</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'loop'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'show'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
&nbsp;
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'rownum'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index_prev'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index_next'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'step'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'first'</span><span style="color: #009900;">&#93;</span>      <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'last'</span><span style="color: #009900;">&#93;</span>       <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'iteration'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'total'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;TR&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_default</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_default</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter_default</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_counter_default</span><span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_second</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_second</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter_second</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_counter_second</span><span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_third</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_third</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter_third</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_counter_third</span><span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_fourth</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_fourth</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter_fourth</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_counter_fourth</span><span style="color: #339933;">+=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_fifth</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_fifth</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter_fifth</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_counter_fifth</span><span style="color: #339933;">-=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/TD&gt;
&lt;TD&gt;&lt;strong&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_sixth</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_sixth</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #b1b100;">print</span> <span style="color: #000088;">$_counter_sixth</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$_counter_sixth</span><span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_sections<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myloop'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'index'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_sixth</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_sixth</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #000088;">$_counter_sixth</span><span style="color: #339933;">-=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/strong&gt;&lt;/TD&gt;
&lt;TD&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_counter_seventh</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000088;">$_counter_seventh</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span> 
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'counter6'</span><span style="color: #339933;">,</span><span style="color: #000088;">$_counter_seventh</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$_counter_seventh</span><span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> 
 <span style="color: #000000; font-weight: bold;">?&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_tpl_vars<span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'counter6'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/TD&gt;
&lt;/TR&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endfor</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/table&gt;</pre></div></div>

<p>Pero cuidado, no funciona como la versión anterior o como la versión función. Fíjense en la columna: &#8220;up:1 on &gt;=fifth down:1&#8243;</p>
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<td>up:1</td>
<td>up:1</td>
<td>start:3; up:1</td>
<td>up:2</td>
<td>down:1</td>
<td>up:1 on &gt;=fifth down:1</td>
<td>up:1;no-print;using assign</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>4</td>
<td>1</td>
<td>1</td>
<td><strong>1</strong></td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>5</td>
<td>3</td>
<td>0</td>
<td><strong>2</strong></td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>6</td>
<td>5</td>
<td>-1</td>
<td><strong>3</strong></td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>7</td>
<td>7</td>
<td>-2</td>
<td><strong>4</strong></td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
<td>8</td>
<td>9</td>
<td>-3</td>
<td><strong>5</strong></td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
<td>9</td>
<td>11</td>
<td>-4</td>
<td><strong>6</strong></td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>7</td>
<td>10</td>
<td>13</td>
<td>-5</td>
<td><strong>6</strong></td>
<td>7</td>
</tr>
<tr>
<td>8</td>
<td>8</td>
<td>11</td>
<td>15</td>
<td>-6</td>
<td><strong>7</strong></td>
<td>8</td>
</tr>
<tr>
<td>9</td>
<td>9</td>
<td>12</td>
<td>17</td>
<td>-7</td>
<td><strong>8</strong></td>
<td>9</td>
</tr>
<tr>
<td>10</td>
<td>10</td>
<td>13</td>
<td>19</td>
<td>-8</td>
<td><strong>9</strong></td>
<td>10</td>
</tr>
<tr>
<td>11</td>
<td>11</td>
<td>14</td>
<td>21</td>
<td>-9</td>
<td><strong>10</strong></td>
<td>11</td>
</tr>
</table>
<p>Eso es todo por ahora. Este tip lo he utilizado de otras formas también. Colocaré otras mejoras en los próximos artículos.</p>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/trucos-para-smarty-3-reducir-el-io-compiler-plugins/33/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trucos para Smarty: 2. Usa el cache</title>
		<link>http://pragone.com/proyectos/trucos-para-smarty-2-usa-el-cache/32</link>
		<comments>http://pragone.com/proyectos/trucos-para-smarty-2-usa-el-cache/32#comments</comments>
		<pubDate>Wed, 12 Mar 2008 23:23:18 +0000</pubDate>
		<dc:creator>pragone</dc:creator>
				<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>

		<guid isPermaLink="false">http://pragone.com/proyectos/trucos-para-smarty-2-usa-el-cache/32</guid>
		<description><![CDATA[Por más sencillo o &#8220;light&#8221; que sea tu sitio web, hay un punto en que con alto tráfico, las visitas comienzan a ser un problema en varios frentes: Servidor Web: Smarty es muy extensible, pero afrontémoslo&#8230; no es ligero. Las grandes libertades que te ofrece vienen con un coste: CPU, memoria y acceso a disco [...]]]></description>
			<content:encoded><![CDATA[<p>Por más sencillo o &#8220;light&#8221; que sea tu sitio web, hay un punto en que con alto tráfico, las visitas comienzan a ser un problema en varios frentes:</p>
<ol>
<li>Servidor Web: Smarty es muy extensible, pero afrontémoslo&#8230; no es ligero. Las grandes libertades que te ofrece vienen con un coste: CPU, memoria y acceso a disco (por lo general carga muchos archivos, sobre todo en la etapa de compilación).</li>
<li>Bases de Datos: Suelo ser un cuello de botella, y si tienes algunos procesos que sean intensivos en datos puede hacer que tus servidores se arrodillen pidiendo perdón.</li>
</ol>
<p>Para esto existe el Cache.</p>
<p>El uso del Cache es bastante claro para páginas que no cambien con frecuencia, de hecho con la clase que creamos en el artículo anterior, es muy sencillo, ya que es un parámetro a la hora de instanciar la clase.</p>
<p>Sin embargo, el uso del Cache no sólo se limita a páginas estáticas o casi estáticas. Hay un par más de casos (entre otros que ahora no se me ocurren) en el que es útil:</p>
<ul>
<li>Si la información no debe ser &#8220;real time&#8221;</li>
<li>Para hacer que páginas estáticas se vuelvan estáticas.</li>
</ul>
<p>Una buena opción para el uso del cache es cuando tienes una página cuyo contenido es dinámico, pero que no importa si tiene un par de minutos de &#8220;retraso. Por ejemplo, un listado de noticias, etc.</p>
<p>En este caso, nos basta con indicarle al Smarty que sí deseamos utilizar el cache y decirle cada cuánto queremos que refresque el contenido.</p>
<p>Por ejemplo, supongamos que tenemos un PHP que saca el listado de las últimas noticias y lo muestra. Sin el caché sería así (simplificando un poco el código):</p>
<p>Archivo: DOCROOT/pubs/ejemplo2.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'classes/db/News.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'classes/template/MySmartyBasic.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$news</span> <span style="color: #339933;">=</span> News<span style="color: #339933;">::</span><span style="color: #004000;">getLatestNews</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$tpl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MySmarty<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'news'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$news</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ejemplo2.tpl'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Archivo: DOCROOT/confs/ejemplo2.conf</p>
<pre>
latest_news=Últimas Noticias
</pre>
<p>Archivo: DOCROOT/templates/ejemplo2.tpl</p>

<div class="wp_syntax"><div class="code"><pre class="smarty" style="font-family:monospace;"><span style="color: #D36900;">&#123;</span><span style="color: #008000;">config_load</span> <span style="color: #6A0A0A;">file</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;ejemplo2.conf&quot;</span><span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;html&gt;</span>
<span style="color: #009000;">&lt;head&gt;</span>
<span style="color: #009000;">&lt;title&gt;</span><span style="color: #D36900;">&#123;</span>#lates_news#<span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/title&gt;</span>
<span style="color: #009000;">&lt;style&gt;</span>
<span style="color: #D36900;">&#123;</span>literal<span style="color: #D36900;">&#125;</span>
BODY <span style="color: #D36900;">&#123;</span>
	font-family:Arial, sans;
<span style="color: #D36900;">&#125;</span>
h1 <span style="color: #D36900;">&#123;</span>
	border: 1px black solid;
	background-color:#dddddd;
	margin:5px;
	padding:6px;
<span style="color: #D36900;">&#125;</span>
div, div.dark <span style="color: #D36900;">&#123;</span>
	white-space:nowrap;
	overflow:hidden;
	padding:5px;
	margin: 5px 10px 0px 10px;
<span style="color: #D36900;">&#125;</span>
div.dark <span style="color: #D36900;">&#123;</span>
	background-color:#eeeeee;
<span style="color: #D36900;">&#125;</span>
<span style="color: #D36900;">&#123;</span><span style="color: #D36900;">/</span>literal<span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/style&gt;</span>
<span style="color: #009000;">&lt;/head&gt;</span>
<span style="color: #009000;">&lt;body&gt;</span>
<span style="color: #009000;">&lt;h1&gt;</span><span style="color: #D36900;">&#123;</span>#latest_news#<span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/h1&gt;</span>
<span style="color: #D36900;">&#123;</span><span style="color: #0600FF;">foreach</span> <span style="color: #6A0A0A;">from</span><span style="color: #D36900;">=</span><span style="color: #00aaff;">$news</span> <span style="color: #6A0A0A;">item</span><span style="color: #D36900;">=</span><span style="color: #ff0000;">&quot;new&quot;</span><span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;div {cycle values=&quot;,class='dark'&quot;}&gt;</span>
<span style="color: #009000;">&lt;a href=&quot;{$new.url}&quot;&gt;</span><span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$new</span>.<span style="color: #006600;">title</span><span style="color: #D36900;">&#125;</span><span style="color: #009000;">&lt;/a&gt;</span>: <span style="color: #D36900;">&#123;</span><span style="color: #00aaff;">$new</span>.<span style="color: #006600;">description</span><span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/div&gt;</span>
<span style="color: #D36900;">&#123;</span><span style="color: #D36900;">/</span><span style="color: #0600FF;">foreach</span><span style="color: #D36900;">&#125;</span>
<span style="color: #009000;">&lt;/body&gt;</span>
<span style="color: #009000;">&lt;/html&gt;</span></pre></div></div>

<p>Para utilizar el caché, basta con modificar el php de la siguiente forma:</p>
<p>Archivo: DOCROOT/pubs/ejemplo2.1.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'classes/db/News.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'classes/template/MySmartyBasic.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$tpl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MySmarty<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Para asegurarnos de usar el cache.</span>
<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cache_lifetime</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">60</span><span style="color: #339933;">*</span><span style="color: #cc66cc;">60</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Regenerar cada 5 minutos</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_cached</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ejemplo2.tpl'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'latest_news'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Colocamos el acceso a la BD dentro del if para evitarlo</span>
	<span style="color: #000088;">$news</span> <span style="color: #339933;">=</span> News<span style="color: #339933;">::</span><span style="color: #004000;">getLatestNews</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'news'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$news</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ejemplo2.tpl'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'latest_news'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>y listo, el caché se refrescará cada 5 minutos.</p>
<p>Un ejemplo de hacer que el contenido dinámico se vuelva estático sería en este caso apropiado para la página que muestra la noticia. En este caso nos basta con modificar el PHP que muestra la noticia para que utilice el caché (como hicimos en el caso anterior), pero incluyendo el identificador de la noticia como parte del &#8220;cache_id&#8221;. Podría quedar así:</p>
<p>Archivo: DOCROOT/pubs/ejemplo2.2.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'classes/db/News.php'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'classes/template/MySmartyBasic.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$new_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_numeric</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$new_id</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;new_id debe ser un número&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Para asegurarnos de usar el cache y que nunca expire</span>
<span style="color: #000088;">$tpl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MySmarty<span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$cache_id</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'news'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$new_id</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_cached</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ejemplo2.2.tpl'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cache_id</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Colocamos el acceso a la BD dentro del if para evitarlo</span>
	<span style="color: #000088;">$the_news</span> <span style="color: #339933;">=</span> News<span style="color: #339933;">::</span><span style="color: #004000;">getNews</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$new_id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$the_news</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;News id <span style="color: #006699; font-weight: bold;">$new_id</span> doesn't exist&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'the_news'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$the_news</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$tpl</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ejemplo2.2.tpl'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cache_id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Y listo!</p>
<p>Recuerda con el uso del cache algunas cosas importantes:</p>
<ul>
<li>No lo uses en desarrollo, te ahorrarás muchos dolores de cabeza.</li>
<li>Ten cuidado con el manejo de errores, no quieres que si al generar la página ocurre algún error, ese error quede perpetuado en la versión cacheada. Tip: si detectas un error deshabilita el cache.</li>
<li>Si necesitas forzar que una versión en caché sea regenerada tienes dos opciones: eliminar el archivo de la carpeta cache (el nombre del archivo incluye el cache_id); o utiliza la función clear_cache recordando de indicarle el cache_id.</li>
<li>Si realizas algún cambio en el .tpl en el que se basa un cache, automáticamente todas las versiones cache-adas de ese .tpl quedan invalidadas y deberán ser regeneradas.</li>
<li>Si debes cambiar el tpl y temes el impacto que regenerar el cache pueda tener en tu servidor, puedes regenerar las versiones cache en un ambiente anterior al de producción (stage) y subirlas junto con el tpl cuando estés publicando el cambio. En este caso ten mucho cuidado con las fechas de modificación de los archivos, las versiones cache deben ser posteriores al tpl o serán inválidas (un touch puede servir, o simplemente usa rsync).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://pragone.com/proyectos/trucos-para-smarty-2-usa-el-cache/32/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
