<?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>CaChi &#187; framework</title>
	<atom:link href="http://cachi.temiga.org/tag/framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://cachi.temiga.org</link>
	<description>[ TEMIGA ]</description>
	<lastBuildDate>Mon, 19 Jul 2010 14:10:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>KumbiaPHP + i18N Internacionalización</title>
		<link>http://cachi.temiga.org/2010/07/18/kumbiaphp-i18n-internacionalizacion/</link>
		<comments>http://cachi.temiga.org/2010/07/18/kumbiaphp-i18n-internacionalizacion/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 02:07:21 +0000</pubDate>
		<dc:creator>CaChi</dc:creator>
				<category><![CDATA[KumbiaPHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Buenas Prácticas]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[internacionalización]]></category>
		<category><![CDATA[KumbiaPHP Tips]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://cachi.temiga.org/?p=678</guid>
		<description><![CDATA[Antes de comenzar este tutorial que es bastante práctico y fácil quiero resaltar algunos conceptos básicos para entender mejor para que sirve la internacionalización i18N. Parto de una premisa: i18n No ES sólo presentar contenido en varios idiomas. ¿Que es la Internacionalización? La Web se ha convertido en la principal herramienta de difusión de información]]></description>
			<content:encoded><![CDATA[<p><a href="http://cachi.temiga.org/wp-content/uploads/i18nIcon.png"><img alt="i18n" src="http://cachi.temiga.org/wp-content/uploads/i18nIcon.png" title="i18N" class="alignleft" width="120" height="120" /></a>Antes de comenzar este tutorial que es bastante práctico y fácil quiero resaltar algunos conceptos básicos para entender mejor para que sirve la internacionalización i18N. Parto de una premisa:<br />
<strong>i18n No ES sólo presentar contenido en varios idiomas.</strong> </p>
<h2>¿Que es la Internacionalización?</h2>
<p>La Web se ha convertido en la principal herramienta de difusión de información para una audiencia variada y de gran tamaño que requiere de un procesamiento de información sencillo. La información que se muestra al usuario está compuesta de partes diferentes que han de trabajar en conjunto de forma coordinada para que la información sea accesible y universal, es decir, estas partes que integran la <strong>Web han de funcionar bajo cualquier circunstancia, en cualquier país, con cualquier idioma y cultura</strong>. Por este motivo la internacionalización podría definirse como un proceso a través del cual se van a diseñar sitios <strong>Web adaptables a diferentes idiomas y regiones sin necesidad de realizar cambios en el código</strong>. La utilización de formatos y protocolos que no establezcan barreras a los diferentes idiomas, sistemas de escritura, códigos y otras convenciones locales, es esencial para hablar de internacionalización en un sitio Web.</p>
<p>La Internacionalización también es conocida como I18N, que es la abreviatura de Internacionalización porque hay 18 letras entre la i y la n. <a href="http://www.w3c.es/divulgacion/guiasbreves/internacionalizacion#intro">Fuente</a>.</p>
<p>Otro aspecto importante es saber <a href="http://www.w3c.es/divulgacion/guiasbreves/internacionalizacion#funcionamiento">como funciona la internacionalización</a>.</p>
<p><strong>Norma N. 1 &#8211; TODO EN UTF-8</strong>: editor, archivos, BD, tablas, campos, es decir todo, esto soluciona el 90% de los problemas de i18n.</p>
<p>Recordar que este ejemplo esta adaptado para <a href="http://kumbiaphp.com" title="KumbiaPHP Framework">KumbiaPHP</a>, aunque la generación de los catalogos es igual en cualquier caso, la recomendación es usar <a href="http://www.gnu.org/software/gettext/">Gettex</a> fácil de usar y estándar, hay un tutorial en la <a href="http://wiki.kumbiaphp.com/" title="Wiki de KumbiaPHP Framework">Wiki de KumbiaPHP</a> (<a href="http://wiki.kumbiaphp.com/KumbiaPHP_y_gettext">KumbiaPHP y Gettext</a>)el cual explica como generar los catalogos con <a href="http://www.poedit.net/" title="Poedit">Poedit</a> y donde ubicarlos dentro de la estructura de directorio de la <a href="http://www.kumbiaphp.com/blog/2009/08/14/kumbiaphp_framework_1_0_beta1_liberada/">versión 1.0 Beta1</a></p>
<p>El autor del blog Matando Tigres ha <a href="http://matandotigres.wordpress.com/2010/07/17/internacionalizacion-i18n-basada-en-url-para-kumbiaphp/">creado su receta</a> que <a href="http://groups.google.com/group/kumbia/msg/97b697ef83ff208c">como comente</a> es bastante simple y funcional, yo traigo otra alternativa tan igual de fácil como esa ;).</p>
<p>Es sumamente importante generar los catalogos tal como se explica en el tutorial <a href="http://wiki.kumbiaphp.com/KumbiaPHP_y_gettext">KumbiaPHP y Gettex</a> ya que la intención de este tutorial es como mediante las URL&#8217;s sabemos el idioma y aplicarlo a nuestra aplicación para que se hagan las traducciones necesarias.</p>
<h3>Lo Primero</h3>
<p>Lo que deseamos es tener una URL como esta http://dominio.com/<strong>$lang</strong>/controller/action/, donde el <em>$lang</em> puede tener tantos idiomas como se hayan considerado.</p>
<p>Siguiendo, hay que editar el archivo <strong>app/public/.htaccess</strong> hay muchos que ignoran el gran potencial que se cuenta con la reescrituras de URL (<a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a>) y para efecto de este tutorial quiero sacar provecho de las reglas de reescritura.</p>
<pre lang=text>
... AQUI ESTA EL DEMAS CONTENIDO...
    # Para peticiones que no son archivos ni directorios
    # Reescribe a index.php?_url=URL
    RewriteRule ^(es|en)/(.*)$ index.php?url=/$2&#038;lang=$1 [QSA,L]
</pre>
<p>Como se aprecia solo hemos cambiado la última regla para agregar el idioma y este luego es enviado como un parámetro <strong>GET['lang']</strong> y como se mencionó la URL tendra este aspecto http://dominio.com/<strong>es</strong>/controller/action/ para efecto del ejemplo solo se han colocado 2 idiomas es (español) y en (ingles) pueden estar todos los que se necesiten.</p>
<h3>Lo Segundo</h3>
<p>Adecuar todos los enlaces, esto lo hacemos editando el FrontController de KumbiaPHP <strong>app/public/index.php</strong> en la definición de la constante <strong>URL_PATH</strong> que es la constante que se colocan en los link, form, etc. generados por los helpers.</p>
<p>La definición de esta constante esta aprox. por la línea 75.<br />
<strong>define(&#8216;URL_PATH&#8217;, PUBLIC_PATH.$_GET['lang'].&#8217;/');</strong></p>
<p>Como se aprecia solo hemos agregando el valor del parámetro <strong>$_GET['lang']</strong> que se definió en el .htaccess con esto ya todos nuestros enlaces tienen el idioma en la URL.</p>
<h3>Por último&#8230;</h3>
<p>Ahora solo queda asignar el valor del lenguaje solicitado para que la aplicación lo cargue y aplique las traducciones necesarias, ¿recuerdan lo que escribí hace un tiempo de <a href="http://cachi.temiga.org/2010/01/31/kumbiaphp-tips-aprovecha-el-metodo-initialize/">aprovechar el método initialize()</a>? para este caso también aplica :).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ApplicationController <span style="color: #000000; font-weight: bold;">extends</span> Controller
<span style="color: #009900;">&#123;</span>
    <span style="color: #009933; font-style: italic;">/**
     * Array con los idiomas disponibles
     */</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_langs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'es'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'es_VE'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'en'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'en_US'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> initialize<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$lang</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'lang'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//verifica que el lenguaje sea soportado, sino existe tomamos uno por defecto 'es_VE'</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$lang</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_langs<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">//idioma por defecto</span>
            <span style="color: #000088;">$lang</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'es_VE'</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;">$lang</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_langs<span style="color: #009900;">&#91;</span><span style="color: #000088;">$lang</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #990000;">putenv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;LC_ALL=<span style="color: #006699; font-weight: bold;">$lang</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">setlocale</span><span style="color: #009900;">&#40;</span>LC_ALL<span style="color: #339933;">,</span> <span style="color: #000088;">$lang</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">bindtextdomain</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;messages&quot;</span><span style="color: #339933;">,</span> APP_PATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'locale'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">textdomain</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;messages&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Con esto ya deben funcionar las traducciones de nuestra aplicación, los código de idiomas sale del <a href="http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">ISO 631-1</a></p>
<h3>Conclusiones&#8230;</h3>
<p>i18n es mas que una traducción de texto a un idioma hay que tomar en cuenta las culturas de las traducciones, monedas, fechas, montos, etc. hay muchas cosas por tomar en cuenta que no mencione en este tutorial sin embargo con ir al <a href="http://www.w3.org/International/">sitio oficial de Internacionalización</a> (ingles) de la W3C encontraran bastante insumos para comprender este tema.</p>
<p>Haciendo una pequeña comparación respecto al ejemplo que publico el autor del blog <a href="http://matandotigres.wordpress.com/">Matando Tigres</a> es que en este caso no utilizo el <strong>routes.ini</strong> obviamente esto se traduce en un tema de performance y reducción de trabajo, porque tantas rutas estaticas tenga en mi sistema debo definirla para el idioma.</p>
<p>Como siempre digo es una opción que seguro irá mejorando a medida que ustedes den un feedback, espero sus comentarios.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fcachi.temiga.org%2F2010%2F07%2F18%2Fkumbiaphp-i18n-internacionalizacion%2F&amp;linkname=KumbiaPHP%20%2B%20i18N%20Internacionalizaci%C3%B3n"><img src="http://cachi.temiga.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://cachi.temiga.org/2010/07/18/kumbiaphp-i18n-internacionalizacion/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>KumbiaPHP + Ajax + jQuery</title>
		<link>http://cachi.temiga.org/2010/06/10/kumbiaphp-ajax-jquery/</link>
		<comments>http://cachi.temiga.org/2010/06/10/kumbiaphp-ajax-jquery/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 16:04:07 +0000</pubDate>
		<dc:creator>CaChi</dc:creator>
				<category><![CDATA[KumbiaPHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Buenas Prácticas]]></category>
		<category><![CDATA[comunidad]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[KumbiaPHP Tips]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php framework]]></category>
		<category><![CDATA[Programing]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[ShortUrl]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://cachi.temiga.org/?p=641</guid>
		<description><![CDATA[Actualizado 11 de Junio 2010 En este tutorial explcaré el comportamiento de KumbiaPHP cuando hacemos aplicaciones ricas en JavaScript, me basare en utilizar jQuery como framework de JavaScript y no daré una explicación muy amplia de que son peticiones asíncronas ni como funcionan estas esto porque hay suficiente información en la red para quienes deseen]]></description>
			<content:encoded><![CDATA[<blockquote><p>Actualizado 11 de Junio 2010</p></blockquote>
<p>En este tutorial explcaré el comportamiento de <a href="http://www.kumbiaphp.com" title="KumbiaPHP Framework">KumbiaPHP</a> cuando hacemos aplicaciones ricas en JavaScript, me basare en utilizar jQuery como framework de JavaScript  y no daré una explicación muy amplia de que son peticiones asíncronas ni como funcionan estas esto porque hay suficiente información en la red para quienes deseen indagar un poco mas, simplemente nos dedicaremos hacer peticiones asíncronas dentro de <a href="http://www.kumbiaphp.com" title="KumbiaPHP Framework">KumbiaPHP</a>.</p>
<p>Como todo ejemplo lo ideal es basarlo en hechos reales y cotidianos en este sentido haremos un cliente que acorte URL utilizando el <a href="http://www.siguemilink.com/api">API</a> del servicio <a href="http://www.siguemilink.com/" title="SigueMiLink » Acorta tus enlaces!">SigueMiLink</a> el cual fue desarrollado con KumbiaPHP :).</p>
<h3>Requisitos</h3>
<p>Antes de continuar hay que verificar lo que necesitamos para llevar acabo el tutorial.</p>
<ul>
<li>Tener funcionando KumbiaPHP <a href="http://www.kumbiaphp.com/blog/manuales-y-descargas/">Beta1</a> (<a href="http://wiki.kumbiaphp.com/Instalar_Kumbia">Instalar KumbiaPHP</a>)</li>
<li><a href="http://code.jquery.com/jquery-1.4.2.min.js">Descargar jQuery</a> y colocarlo en el directorio <strong>app/public/javascript/jquery/jquery-1.4.2.min.js</strong>.</li>
<li>Por lo menos haber hecho el ejemplo <a href="http://wiki.kumbiaphp.com/Hola_Mundo_KumbiaPHP_Framework">Hola Mundo de KumbiaPHP</a> para entender este tutorial.</li>
<li>Leer un poco el <a href="http://www.siguemilink.com/api">API</a> del servicio <a href="http://www.siguemilink.com/" title="SigueMiLink » Acorta tus enlaces!">SigueMiLink</a></li>
<li>Ver funcionamiento básico de <a href="http://wiki.kumbiaphp.com/AJAX">KumbiaPHP con AJAX</a></li>
</ul>
<h3>Empezamos</h3>
<p>Lo primero es crear el controlador para efecto de este tutorial lo llame <strong>api</strong> mirar las <a href="http://wiki.kumbiaphp.com/Preguntas_Frecuentes#.C2.BFCu.C3.A1l_es_la_convenci.C3.B3n_para_nombrar_los_archivos_y_clases_de_modelos_y_controladores.3F">convenciones de nombres de controladores</a> si se te ocurre otro nombre mejor usalo, pero piensa que a lo largo del tutorial haré mención al <strong>controller api</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
 * Controller para utilizar el API de SigueMiLink
 * @author Deivinson Tejeda &lt;deivinsontejeda@kumbiaphp.com&gt;
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> ApiController <span style="color: #000000; font-weight: bold;">extends</span> ApplicationController
<span style="color: #009900;">&#123;</span>
    <span style="color: #009933; font-style: italic;">/**
     * URL del API de SigueMiLink
     */</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$_urlAPI</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://www.siguemilink.com/api/%s/?destination=%s'</span><span style="color: #339933;">;</span>
    <span style="color: #009933; font-style: italic;">/**
     * Callback Before que verifica si la petición es Asíncrona...
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> before_filter<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">is_ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set_response</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'view'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #009933; font-style: italic;">/**
     * Form que se comunica con el API de SigueMiLink
     * para acortar el enlace
     *
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> acortar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">has_post</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</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;">//Reemplazo de valores en la URL del API.</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_urlAPI <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_urlAPI<span style="color: #339933;">,</span> <span style="color: #0000ff;">'create'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">post</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">response1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_urlAPI<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'response'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ahora se crea la vista <strong>app/views/api/acortar.phtml</strong> que tiene un formulario que envia la URL al controller que será enviada al API de SigueMiLink.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;div style=&quot;margin: auto&quot;&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> form_tag<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'api/acortar/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'form-remote'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
        &lt;label&gt;Acorte tu enlace&lt;/label&gt;
        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> text_field_tag<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> submit_tag<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Enviar'</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> end_form_tag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;br /&gt;
    &lt;div id=&quot;update&quot; style=&quot;margin: auto;&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> javascript_include_tag<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'jquery/jquery-1.4.2.min'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;script type=&quot;text/javascript&quot;&gt;
    &lt;!--//--&gt;&lt;![CDATA[//&gt;&lt;!--
        $(function() {
            $(&quot;.form-remote&quot;).live('submit', function(event){
                event.preventDefault();
			    self = $(this);
			    var button = $('[type=submit]', self);
			    button.attr('disabled', 'disabled');
			    var url = self.attr('action');
			    //var div = self.attr('data-div');
			    $.post(url, self.serialize(), function(data, status){
				    var capa = $('#update');
				    capa.html(data);
				    capa.hide();
				    capa.show('slow');
				    button.attr('disabled', null);
			    });
            });
        });
    //--&gt;&lt;!]]&gt;
&lt;/script&gt;</pre></div></div>

<p>Creamos la vista que tiene la respuesta enviado desde el servicio que acorta la URL <strong>app/views/api/response.phtml</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">code</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;a href=&quot;http://smlk.es/<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$response1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #000000; font-weight: bold;">?&gt;</span>/&quot;&gt;http://smlk.es/<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$response1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">link</span><span style="color: #000000; font-weight: bold;">?&gt;</span>/&lt;/a&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">else</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;strong&gt;No se pudo acortar el enlace&lt;/strong&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Lo genial de este ejemplo es que funciona con o sin javascript para promover la <a href="http://cachi.temiga.org/2009/10/27/accesibilidad-web/">accesibilidad web</a>. Ahora explico un poco lo que hace el <strong>controller api</strong>, el método <strong>before_filter()</strong> es un filtro que se ejecuta antes de la acción en este caso verificamos si la petición es asíncrona y de serlo damos respuesta asíncrona, útil para centralizar y si la aplicación es muy rica en javascript no se tendra que tener esta validación en cada action del controller ;).</p>
<p>La action <strong>acortar()</strong> muestra el form y envia la petición (cuando se hace el submit) al servicio <a href="http://www.siguemilink.com/" title="SigueMiLink » Acorta tus enlaces!">SigueMiLink</a> para acortar la URL, con el método <a href="http://wiki.kumbiaphp.com/KumbiaPHP_Framework_Versi%C3%B3n_1.0_Spirit#Utilizando_el_m.C3.A9todo_render.28.24view.2C_.5B.24template.5D.29">render()</a> cambiamos de vista a <strong>renpose</strong> y como la petición se ha hecho asíncrona ya saben lo demas :).</p>
<p>En la vista <strong>acortar.phtml</strong> tenemos el formulario y con un JavaScript para enviar la petición asíncrona, en la <a href="http://api.jquery.com/">documentación de jQuery</a> se explican los métodos usados en este ejemplo en los cuales no me enfocare. </p>
<p>Es importante indicar el elemento del <a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a> que se actualizará luego de la petición, en este caso es un div con un identificador (id) <strong>update</strong>.</p>
<p>Es de notar que en la vista <strong>response</strong> no se analizan todos los códigos de error que devuelve el API de SigueMiLink, como tarea pueden hacer esto y dar respuesta al usuario de acuerdo al error retornado del servicio.</p>
<h3>Importante</h3>
<ul>
<li>Si no indicas que la respuesta será asíncrona <a href="http://www.kumbiaphp.com">KumbiaPHP</a> cargará todo el template y por ende habran elementos de la vista que veras repetidos, así que no olvides el <strong>$this->set_response(&#8216;view&#8217;)</strong>.</li>
<li>Saber que elemento del DOM se va actualizar</li>
</ul>
<h3>A probar lo hecho</h3>
<p>Así es, nos queda probar lo que se hizo y mirar que todo ande como lo planeado, es decir un formulario con un campo de texto donde se coloca la URL que deseamos acortar al dar click en el submit si todo estuvo bien nos retorna una URL acortada para compartirla en nuestras redes sociales&#8230;</p>
<p>Asumiendo que tienes una instalación local deberías ver el ejemplo pinchando una URL como esta http://localhost/kumbiaphp/api/acortar/ es importante entender las <a href="http://wiki.kumbiaphp.com/Hola_Mundo_KumbiaPHP_Framework#KumbiaPHP_URLs" title="URL de KumbiaPHP">URL de KumbiaPHP</a></p>
<p>En la <a href="http://wiki.kumbiaphp.com/">Wiki de KumbiaPHP</a> hay un ejemplo mas simple de como <a href="http://wiki.kumbiaphp.com/Integrar_KumbiaPHP_Spirit_con_jQuery">integrar jQuery en KumbiaPHP</a> y puede quedar mucho mejor este tutorial por ejemplo tener un modelo que se consuma todo el web service del API de SigueMiLink, pero ya esto es tarea de lo mas curiosos les dejo un post que escribí sobre los <a href="http://cachi.temiga.org/2009/12/29/que-es-un-modelo-mvc/">modelo dentro del MVC</a></p>
<p>¿dudas? ¿sugerencias? deja tu comentario y ayuda a mejorar este ejemplo&#8230;</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fcachi.temiga.org%2F2010%2F06%2F10%2Fkumbiaphp-ajax-jquery%2F&amp;linkname=KumbiaPHP%20%2B%20Ajax%20%2B%20jQuery"><img src="http://cachi.temiga.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://cachi.temiga.org/2010/06/10/kumbiaphp-ajax-jquery/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Sistema de Enrutamiento en KumbiaPHP</title>
		<link>http://cachi.temiga.org/2010/05/01/sistema-de-enrutamiento-en-kumbiaphp/</link>
		<comments>http://cachi.temiga.org/2010/05/01/sistema-de-enrutamiento-en-kumbiaphp/#comments</comments>
		<pubDate>Sun, 02 May 2010 02:01:35 +0000</pubDate>
		<dc:creator>CaChi</dc:creator>
				<category><![CDATA[KumbiaPHP]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[Buenas Prácticas]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[KumbiaPHP Tips]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programing]]></category>
		<category><![CDATA[Router]]></category>
		<category><![CDATA[Routing]]></category>

		<guid isPermaLink="false">http://cachi.temiga.org/?p=581</guid>
		<description><![CDATA[Los enlaces y las URL requieren de un tratamiento especial en cualquier framework para aplicaciones web. El motivo es que la definición de un único punto de entrada a la aplicación y el uso de helpers en las vistas (Views), permiten separar completamente el funcionamiento y el aspecto de las URL. Este mecanismo se conoce]]></description>
			<content:encoded><![CDATA[<p>Los enlaces y las <acronym title="Uniform Resource Locator">URL</acronym> requieren de un tratamiento especial en cualquier <a title="framework para aplicaciones web" href="http://en.wikipedia.org/wiki/Web_application_framework">framework para aplicaciones web</a>. El motivo es que la definición de un único punto de entrada a la aplicación y el uso de <em>helpers</em> en las vistas (Views), permiten separar completamente el funcionamiento y el aspecto de las <acronym title="Uniform Resource Locator">URL</acronym>. Este mecanismo se conoce como &#8220;enrutamiento&#8221; (del inglés <em>&#8220;routing&#8221;</em>). El enrutamiento mas que ser una utilidad curiosa, es una herramienta muy útil para hacer las aplicaciones web más fáciles de usar y más seguras.</p>
<p><!-- pagebreak --></p>
<p>El enrutamiento es un mecanismo que reescribe las <acronym title="Uniform Resource Locator">URL</acronym> para simplificar su aspecto. Antes de poder comprender su importancia, es necesario dedicar unos minutos al estudio de las <acronym title="Uniform Resource Locator">URL</acronym> de las aplicaciones web.</p>
<h3>Ejecutando Acciones en el Servidor mediante URL.</h3>
<p>Las <acronym title="Uniform Resource Locator">URL</acronym> se encargan de enviar la información desde el navegador hasta el servidor. Las <acronym title="Uniform Resource Locator">URL</acronym> tradicionales incluyen la ruta hasta del <em>script</em> del servidor y algunos parámetros necesarios para completar la petición, como se muestra en el siguiente:</p>
<pre>http://www.dominio.com/controlador/noticia.php?id=123456</pre>
<p>La URL anterior revela informacion sobre la arquitectura interna de la aplicacion incluso de la BD, esto es algo que todo desarrollador de software debe evitar, veamos los detalles tecnicos:</p>
<ul>
<li>En la URL anterior, ¿que pasaria si un usuario malicioso (6) cambia el valor del parametro <span style="color: #0000ff;">id</span>? ¿Supone este caso que la aplicación ofrece una interfaz directa a la base de datos?, lo que intento decir que con esta URL nos podemos poner muy &#8220;<em><a href="http://www.wordreference.com/definicion/esot%C3%A9rico">esotérico</a></em>&#8220;, volviendose casi <strong><em>imposible aplicar seguridad</em></strong>.</li>
<li>Una URL como la anterior es muy dificil de leer, y estas no solo se muestran en la barra de direcciones de los browser, ademas son las que se indexan en los principales buscadores cuando los usuarios buscan informacion, por eso es mas simple ofrecer URL sencillas para que sean entendibles.</li>
<li>Si se modifica una <acronym title="Uniform Resource Locator">URL</acronym> (porque cambia el nombre del script u otra cosa), se deben modificar todos los enlaces a esa <acronym title="Uniform Resource Locator">URL</acronym> (esto trae consecuencias <em>terrorificas</em>). De esta forma, las modificaciones en la estructura del controlador son muy pesadas y costosas, lo que contradice la filosofía del desarrollo <em>ágil de aplicaciones</em>.</li>
</ul>
<h3>La URL como Interfaz.</h3>
<p>Una de las ideas del sistema de enrutamiento es utilizar las <acronym title="Uniform Resource Locator">URL</acronym> como parte de la interfaz. Las aplicaciones trasladan información al usuario mediante el formateo de las <acronym title="Uniform Resource Locator">URL</acronym> y el usuario puede utilizar las <acronym title="Uniform Resource Locator">URL</acronym> para acceder a los recursos de la aplicación.</p>
<p>Esto es posible en <a title="KumbiaPHP Framework" href="http://kumbiaphp.com">KumbiaPHP</a> porque la <acronym title="Uniform Resource Locator">URL</acronym> no guarda necesariamente relación con las instrucciones del servidor.  En su lugar, la <acronym title="Uniform Resource Locator">URL</acronym> está relacionada con el recurso solicitado, y su aspecto puede configurarse libremente de manera muy fácil.</p>
<pre>http://blog.temiga.org/noticias/enrutamiento_en_kumbiaphp/</pre>
<p>Esta URL tiene muchas ventajas:</p>
<ul>
<li>Las <acronym title="Uniform Resource Locator">URL</acronym> tienen significado y ayudan a los usuarios a decidir si la página que se cargará al pulsar sobre un enlace contiene lo que esperan. Un enlace puede contener detalles adicionales sobre el recurso que enlaza.</li>
</ul>
<p style="text-align: center;"><img style="border: 0pt none;" title="SEO URL Amigable de KumbiaPHP" src="http://blog.temiga.org/img/upload/url-enrutamiento-kumbiaphp.png" alt="SEO URL Amigable de KumbiaPHP" /></p>
<ul>
<li>Se puede modificar el aspecto de la <acronym title="Uniform Resource Locator">URL</acronym> y el del nombre de la acción o de los parámetros de forma independiente y con una sola modificación.</li>
<li>Aunque se modifique la estructura interna de la aplicación, las <acronym title="Uniform Resource Locator">URL</acronym> pueden mantener su mismo aspecto hacia el exterior.</li>
<li>Son más seguras. Cualquier <acronym title="Uniform Resource Locator">URL</acronym> no reconocida se redirige a una página especificada por el programador y los usuarios no pueden navegar por el directorio raíz del servidor mediante la prueba de diferentes <acronym title="Uniform Resource Locator">URL</acronym>.</li>
</ul>
<h3>Veamos como funciona.</h3>
<p>Como hemos hablado KumbiaPHP no guarda relacion con las URL externas y las <acronym title="Uniform Resource Identifier">URI</acronym> utilizadas internamente (ya conocemos algunas ventajas) la corresponsabilidad entre ambas es trabajo del Sistema de Enrutamiento (Router), esto se simplifica utilizando una sintaxis para <acronym title="Uniform Resource Identifier">URI</acronym> internas muy parecidas a las externas, ejemplo:</p>
<pre>; URI Interna
/articulos/* = controller/action/*

; NOTA controller y action respresentan quienes se encargaran de atender esa regla

;URL externa tendra esta forma
; http://www.dominio.com/articulos/una_noticia_cualquiera/</pre>
<p>El sistema de enrutamiento utiliza un archivo de configuración, llamado <code>routes.ini</code>, en el que se pueden definir las reglas de enrutamiento. Si se considera la regla mostrada arriba, se define un patrón cuyo aspecto es <strong><code>articulos/*</code></strong>.</p>
<p>Todas las peticiones realizadas KumbiaPHP son analizadas en primer lugar por el sistema de enrutamiento. El sistema de enrutamiento busca coincidencias entre la <acronym title="Uniform Resource Locator">URL</acronym> de la petición y los patrones definidos en las reglas de enrutamiento estatico. Si se produce una coincidencia, las partes del patrón que tienen nombre se transforman en parámetros de la petición y se juntan como parametros de la accion del controller.</p>
<pre>// El usuario solicita la siguiente URL externa

http://www.dominio.com/articulos/una_noticia_cualquiera/

// El Router comprueba que coincide con la regla /articulos/*
// El sistema de enrutamiento crea los siguientes parámetros de la petición
  'module'  =&gt; 'null'
  'controller'  =&gt; 'controller'
  'action'  =&gt; 'action'
  'paramater'    =&gt; 'una_noticia_cualquiera'</pre>
<p>Luego que se descompone la URL, se pasa al controller &#8220;<em>controller</em>&#8221; y action &#8220;<em>action</em>&#8221; que recibe un parametro con el valor &#8220;<em>una_noticia_cualquiera</em>&#8220;, que internamente hara lo necesario para obtener esa noticia solicitada.</p>
<pre>class ControllerController extend ApplicationController
{
    //método al cual se enruta
    public function action  ($noticia){
        echo $noticia; //salida una_noticia_cualquiera
   }
}</pre>
<h3>Conclusiones.</h3>
<p>Sin  que utilizar el Sistema de Routing es un gran aliadoy  siempre hay que tener bien claro que una URL no debe guardar relación con la arquitectura de software del lado servidor siendo parte fundamente en el uso de <a title="Etiqueta Buenas Prácticas" href="http://cachi.temiga.org/tag/buenas-practicas/" target="_blank">buenas prácticas</a> de desarrollo</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fcachi.temiga.org%2F2010%2F05%2F01%2Fsistema-de-enrutamiento-en-kumbiaphp%2F&amp;linkname=Sistema%20de%20Enrutamiento%20en%20KumbiaPHP"><img src="http://cachi.temiga.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://cachi.temiga.org/2010/05/01/sistema-de-enrutamiento-en-kumbiaphp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>¿Que es un Modelo? &#8211; MVC</title>
		<link>http://cachi.temiga.org/2009/12/29/que-es-un-modelo-mvc/</link>
		<comments>http://cachi.temiga.org/2009/12/29/que-es-un-modelo-mvc/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 23:41:14 +0000</pubDate>
		<dc:creator>CaChi</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Buenas Prácticas]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[KumbiaPHP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programing]]></category>

		<guid isPermaLink="false">http://cachi.temiga.org/?p=378</guid>
		<description><![CDATA[Una de las cosas que se aprecia constantemente entre las comunidades de desarrolladores, es la vaga idea que suele existir sobre el manejo del MVC donde solo se tiene en mente el concepto de wikipedia y demas sitios donde se conceptualiza sobre el tema. Resulta bastante difícil, de acuerdo a mi experiencia y el roce]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas que se aprecia constantemente entre las comunidades de desarrolladores, es la vaga idea que suele existir sobre el manejo del <a title="MVC Wikipedia" href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador" target="_blank">MVC</a> donde solo se tiene en mente el concepto de wikipedia y demas sitios donde se conceptualiza sobre el tema.</p>
<p>Resulta bastante difícil, de acuerdo a mi experiencia y el roce que he tenido con personas del área, ir de la teoría a la implementacion del concepto de lo que es <a title="MVC Wikipedia" href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador" target="_blank">MVC</a> parece ser una camino ofuscado en el que muchos se pierden. La gran mayoría suele decir <em>&#8220;estoy claro en lo es MVC&#8230;&#8221;</em>, pero cuando se ve la aplicabilidad se termina dando cuenta que lo que dijó <em>&#8220;estoy claro&#8230;&#8221;</em> es inversamente proporcional.</p>
<h2>Filosofía de un Modelo</h2>
<p>Estos son &#8220;Lógica de Negocio&#8221; y son parte fundamental para el momento que se desarrolla una aplicación, un buen uso de estos nos permiten un gran poder al momento que se necesita escalar, mantener y rehusar código en una aplicación.; es un concepto muy simple, pero la complicacion esta en comprender lo que significa &#8220;Logica de Negocio&#8221; ya que muchos piensan que la única forma de tener &#8220;Lógica de Negocio&#8221; va estrecha y únicamente relacionada con una conexión de <a title="WikiPedia Base de Datos" href="http://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datos" target="_blank">Base de Datos</a> y esto no es asi!</p>
<p>La práctica mas común (en todos los niveles, no solo me refiero a usuarios novatos) es que dejan la lógica en los <a title="MVC Wikipedia" href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador#Descripci.C3.B3n_del_patr.C3.B3nhttp://es.wikipedia.org/wiki/Modelo_Vista_Controlador#Descripci.C3.B3n_del_patr.C3.B3n" target="_blank">controladores</a>, a medida que se deja código de la <em>lógica de negocio</em> en un controlador trae consecuencias garrafales a largo plazo siendo imposible su reutilizacion, traduciendoce en una mala implementacion (<strong>código espaguetti</strong>). Lo antes expuesto no es precisamente lo que fomenta MVC y <a title="Programación Orientada a Objetos" href="http://es.wikipedia.org/wiki/POO" target="_self">POO</a> donde la idea fundamental es el orden y reutilización del código.</p>
<p>Veamos un par de ejemplos para contextualizar.</p>
<p>El primero es un Modelo donde su <em>lógica de negocio</em> esta en una Base de Datos y por ende necesitamos una conexion a motor para trabajar con esa fuente de datos.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Articulos <span style="color: #000000; font-weight: bold;">extends</span> ActiveRecord <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ver<span style="color: #009900;">&#40;</span><span style="color: #000088;">$page</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #000088;">$ppage</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>paginate<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'order: creat_at desc'</span><span style="color: #339933;">,</span>
					<span style="color: #0000ff;">&quot;page: <span style="color: #006699; font-weight: bold;">$page</span>&quot;</span><span style="color: #339933;">,</span>
					<span style="color: #0000ff;">&quot;per_page: <span style="color: #006699; font-weight: bold;">$ppage</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> ultimos<span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$today</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'now'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>find<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'order: creat_at desc'</span><span style="color: #339933;">,</span>
				   <span style="color: #0000ff;">&quot;conditions: data &amp;gt;= <span style="color: #006699; font-weight: bold;">$today</span>&quot;</span><span style="color: #339933;">,</span>
                                    <span style="color: #0000ff;">&quot;limit: <span style="color: #006699; font-weight: bold;">$limit</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Lo que mencionamos arriba sobre la re-utilización de código y característica fundamental de la <a title="Programación Orientada a Objetos" href="http://es.wikipedia.org/wiki/POO" target="_blank">POO</a>, si vemos el método <strong><em>ultimos()</em></strong> del modelo Articulos nos sirve para crear un RSS, widget (Partial en KumbiaPHP) con los artículos recientes, etc. es decir donde se necesite los últimos artículos.</p>
<p>El segundo es un Modelo para el manejo de fotos y su la <em>lógica de negocio</em> <strong>no esta ligada a una BD</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
* Carga la libreria upload
**/</span>
Load<span style="color: #339933;">::</span><span style="color: #004000;">lib</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'upload'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009933; font-style: italic;">/**
* Carga la libreria wideimage
**/</span>
<span style="color: #666666; font-style: italic;">//Load::lib('wideimage');</span>
<span style="color: #009933; font-style: italic;">/**
* Modelo para manipular las fotos de las personas
*
**/</span>
<span style="color: #000000; font-weight: bold;">class</span> Foto
<span style="color: #009900;">&#123;</span>
    <span style="color: #009933; font-style: italic;">/**
* Guarda la foto de una persona
*
* @param string $id id de la foto al guardar
* @param string $file nombre de la foto
* @return boolean
**/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> save <span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</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: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Flash<span style="color: #339933;">::</span><span style="color: #004000;">error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Error: No se ha logrado subir el archivo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">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;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'image/jpeg'</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">'image/pjpeg'</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">'image/gif'</span> <span style="color: #339933;">,</span> <span style="color: #0000ff;">'image/png'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Flash<span style="color: #339933;">::</span><span style="color: #004000;">error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Error: Solo se admiten imagenes JPEG, PNG y GIF'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'size'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">600</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            Flash<span style="color: #339933;">::</span><span style="color: #004000;">error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Error: No se admiten imagenes superiores a 600KB'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>Upload<span style="color: #339933;">::</span><span style="color: #004000;">image</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$id</span>.jpg&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$file_path</span> <span style="color: #339933;">=</span> APP_PATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;public/img/upload/<span style="color: #006699; font-weight: bold;">$id</span>.jpg&quot;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// con marca de agua</span>
            <span style="color: #666666; font-style: italic;">// $watermark = wiImage::load(APP_PATH . &quot;public/img/logo.png&quot;);</span>
            <span style="color: #666666; font-style: italic;">// wiImage::load($file_path)-&gt;resize(160, 213, 'fill')-&gt;merge($watermark, 40, 175)-&gt;saveToFile($file_path);</span>
            wiImage<span style="color: #339933;">::</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">resize</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">160</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">213</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'fill'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">saveToFile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #990000;">chmod</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_path</span><span style="color: #339933;">,</span> <span style="color: #208080;">0777</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #009933; font-style: italic;">/**
* Busca la foto y en caso de que exista retorna la ruta relativa respecto al directorio de imagenes
*
* @return string $id
* @return string
**/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get <span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_file</span><span style="color: #009900;">&#40;</span>APP_PATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;public/img/upload/<span style="color: #006699; font-weight: bold;">$id</span>.jpg&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;upload/<span style="color: #006699; font-weight: bold;">$id</span>.jpg&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #009933; font-style: italic;">/**
* ELimina la foto del usuario
*
* @return string $id
* @return string
**/</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> delete <span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$filepath</span> <span style="color: #339933;">=</span> APP_PATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;public/img/upload/<span style="color: #006699; font-weight: bold;">$id</span>.jpg&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filepath</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">return</span> <span style="color: #990000;">unlink</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$filepath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como se aprecia en este segundo modelo no existe ninguna conexión a una BD y sigue teniendo <em>lógica de negocio</em> para la aplicación, esta historia también se puede repetir para un modelo de sessión, o como me comento el amigo Jesus Lara (<a title="Phenobarbital con Soda" href="http://phenobarbital.wordpress.com/">Phenobarbital</a>) tiene modelos que gestionan todas las operaciones de un servidor SAMBA.</p>
<p><a title="Como Usar los Modelos en KumbiaPHP" href="http://wiki.kumbiaphp.com/Como_Usar_los_Modelos_en_KumbiaPHP">Como Usar los Modelos en KumbiaPHP</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fcachi.temiga.org%2F2009%2F12%2F29%2Fque-es-un-modelo-mvc%2F&amp;linkname=%C2%BFQue%20es%20un%20Modelo%3F%20%26%238211%3B%20MVC"><img src="http://cachi.temiga.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://cachi.temiga.org/2009/12/29/que-es-un-modelo-mvc/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>1er Encuentro de Kumbieros Maracay &#8211; Venezuela</title>
		<link>http://cachi.temiga.org/2009/10/07/1er-encuentro-de-kumbieros-maracay-venezuela/</link>
		<comments>http://cachi.temiga.org/2009/10/07/1er-encuentro-de-kumbieros-maracay-venezuela/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 18:28:52 +0000</pubDate>
		<dc:creator>CaChi</dc:creator>
				<category><![CDATA[KumbiaPHP]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[anuncios]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://cachi.temiga.org/?p=343</guid>
		<description><![CDATA[Ya es un hecho KumbiaPHP llega a su 1er Encuentro de Kumbieros en Maracay &#8211; Venezuela, esto nace producto de la misma comunidad en querer encontrarnos y compartir experiencias sobre el proyecto. Esta iniciativa que nació como KumbiaPHP Party &#38; Beers y ya a estas alturas se ha convertido en un evento. Para ese día]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.kumbiaphp.com/blog/wp-content/uploads/1er-encuentro-kumbieros-maracay-venezuela.jpg"><img class=" alignleft" style="padding: 10px" title="1er Encuentro Kumbieros Maracay - Venezuela 05 Dic 2009" src="http://www.kumbiaphp.com/blog/wp-content/uploads/1er-encuentro-kumbieros-maracay-venezuela.jpg" alt="1er Encuentro Kumbieros Maracay - Venezuela 05 Dic 2009" width="274" height="150" /></a></p>
<p>Ya es un hecho <em>KumbiaPHP</em> llega a su <em><strong>1er Encuentro de Kumbieros en Maracay &#8211; Venezuela</strong></em>, esto nace producto de la misma comunidad en querer encontrarnos y compartir experiencias sobre el proyecto. Esta iniciativa que nació como <em><strong>KumbiaPHP Party &amp; Beers</strong></em> y ya a estas alturas se ha convertido en un evento.</p>
<p>Para ese día tenemos planeado dictar talleres introductorios sobre <em>KumbiaPHP</em>, de la mano de los desarrolladores del Framework y miembros de la comunidad (Próximamente publicaremos el temario de las charlas y/o talleres).</p>
<p><strong>La cita es el Sábado 05 de Diciembre del 2009 a partir de las 09:00 a.m. en Calle Sucre, Complejo Cultural Santos Michelena, Edificio Bibliotecas Virtuales de Aragua, Maracay Edo. Aragua</strong></p>
<p>Como la idea inicial fue un <em>Beers</em> no la hemos dejado de lado, así que al final del evento habrá un <em>Beers</em> (cervezada) que aun no hemos elegido un sitio pero están invitados los que así lo deseen.</p>
<p>Desde KumbiaPHP queremos dar un agradecimiento especial al amigo Hector Rodriguez (acá Al3jandro) por su valiosa colaboración en la organización del evento y encontrar los espacios que dispondremos para esa fecha.</p>
<p>Fuente&#8230; <a title="1er Encuentro de Kumbieros Maracay - Venezuela" href="http://www.kumbiaphp.com/blog/2009/10/07/1er-encuentro-de-kumbieros-maracay-venezuela/" target="_self">KumbiaPHP</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fcachi.temiga.org%2F2009%2F10%2F07%2F1er-encuentro-de-kumbieros-maracay-venezuela%2F&amp;linkname=1er%20Encuentro%20de%20Kumbieros%20Maracay%20%26%238211%3B%20Venezuela"><img src="http://cachi.temiga.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://cachi.temiga.org/2009/10/07/1er-encuentro-de-kumbieros-maracay-venezuela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No te confies de todo lo que dice el manual de PHP</title>
		<link>http://cachi.temiga.org/2009/05/17/no_te_confies_de_todo_lo_que_dice_el_manual_de_php/</link>
		<comments>http://cachi.temiga.org/2009/05/17/no_te_confies_de_todo_lo_que_dice_el_manual_de_php/#comments</comments>
		<pubDate>Mon, 18 May 2009 00:37:30 +0000</pubDate>
		<dc:creator>CaChi</dc:creator>
				<category><![CDATA[PHP5]]></category>
		<category><![CDATA[Planeta Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Buenas Prácticas]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[KumbiaPHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[profiler]]></category>

		<guid isPermaLink="false">http://cachi.temiga.org/?p=301</guid>
		<description><![CDATA[Hace unos días haciendo unos benchmark a kumbiaphp framework en comparación con la vieja estructura de directorios de alguna para ver si la nueva estructura directorio genero efectos de rendimientos sobre el framework que seria lo ideal. Bien lo cierto es que cuando se corrió el benchmark los #request/seg no cuadraban y no era lógico]]></description>
			<content:encoded><![CDATA[<p>Hace unos días haciendo unos <a title="benchamrk" href="http://en.wikipedia.org/wiki/Benchmark_(computing)">benchmark</a> a <a title="Sitio web de kumbiaphp framework" href="http://www.kumbiaphp.com">kumbiaphp framework</a> en comparación con la <span style="text-decoration: line-through;">vieja estructura</span> de directorios de alguna para ver si la <a title="KumbiaPHP Avances version 1.0" href="http://www.kumbiaphp.com/blog/2009/04/30/avances_de_kumbiaphp_framework/" target="_blank">nueva estructura directorio</a> genero efectos de rendimientos sobre el framework que seria lo ideal.</p>
<p>Bien lo cierto es que cuando se corrió el benchmark los <strong>#request/seg</strong> no cuadraban y no era lógico ya que la nueva estructura se depuraron ciertas cosas que sobraban, en el benchmark los números obtenidos eran tan locos que la vieja estructura tenia unos 10 #req/seg por encima :-S no era nada normal esto, nos toco recurrir a las <strong><em>buenas prácticas de desarrollo</em></strong> y que ya es una constante dentro del <a title="Equipo de Desarrollo de KumbiaPHP framework" href="http://wiki.kumbiaphp.com/Team_Development_KumbiaPHP_Framework#KumbiaPHP_Team_Developers" target="_blank">Equipo de Desarrollo de kumbiaphp</a> hacer <a title="debug y profiler con xdebug" href="http://cachi.temiga.org/2008/04/08/instalando-xdebug-en-debian-lenny/">debug y profiler con xdebug</a> :-), esto para detectar donde estaban los &#8220;cuellos de botellas&#8221; que nos hacían mas lento que la versión anterior.</p>
<p>El detalle estaba en una función de <a title="PHP" href="http://en.wikipedia.org/wiki/PHP">PHP</a> llamada <a title="php function extract" href="http://es.php.net/manual/es/function.extract.php" target="_blank">extract,</a> dentro de <a title="KumbiaPHP web &amp; app Framework" href="http://www.kumbiaphp.com">kumbiaphp framework</a> se utiliza esta dicha función en el core ya que el framework implementa las <strong><em>variables de instancia</em></strong> (algo muy parecido de <a title="Rails" href="http://en.wikipedia.org/wiki/Ruby_on_Rails">Rails</a>), es decir todo lo que llame en mi controlador <strong><em>$this-&gt;var</em></strong> o sean atributos públicos, en la vista los tengo disponible como <strong><em>$var</em></strong>, volviendo al punto esta funcion nos permite hacer lo antes dicho pero recibe ciertos parámetros uno es unas constantes entre ellas <span class="term"><strong><em>EXTR_OVERWRITE</em></strong> (</span><span class="simpara">Si hay colisión, sobrescribe la variable existente</span><span class="term">) nosotros decidimos sacar la constante porque en la documentación Oficial de PHP dice claro lo siguiente:</span></p>
<blockquote><p><em>Si no se especifica </em><em><tt class="parameter">tipo_extraccion</tt> , se asume que      vale EXTR_OVERWRITE.</em></p></blockquote>
<p>Bien como sabemos el xdebug nos da mucha información y la misma nos decía que el &#8220;cuello de botella&#8221; estaba allí ya que tomamos un profiler de la versión anterior y los tiempos eran totalmente distintos en ese punto. viendo en detalle la función <em><strong>extract </strong></em>decidí olvidar lo que dice el manual de PHP y pasar de forma implícita el tipo de extracción en este caso <span class="term"><strong><em>EXTR_OVERWRITE, </em></strong>una vez hecho el cambio vuelvo a correr el benchmark y como por arte de magia ahora obtengo los resultados esperados la nueva estructura ha causado efecto en velocidad y esta ~10 #req/seg por encima respecto a la <span style="text-decoration: line-through;">vieja estructura</span>.<br />
</span></p>
<p><strong><span class="term">Conclusión.</span></strong></p>
<p><span class="term">Tal como dice el titulo del post no hay que confiarse de lo que dicen algunos manual, ya que pueden ocurrir excepciones como la que comente aqui. En el caso descrito fue detectado este detalle porque se hizo uso de las <em>buenas prácticas</em> de desarrollo y de las herramientas disponibles y el turno fue para una que muchos obvian <a title="Xdebug " href="http://www.xdebug.org">(xdebug)</a>, que si le damos el uso correcto podemos ganar mucho en nuestros desarrollos.</span></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fcachi.temiga.org%2F2009%2F05%2F17%2Fno_te_confies_de_todo_lo_que_dice_el_manual_de_php%2F&amp;linkname=No%20te%20confies%20de%20todo%20lo%20que%20dice%20el%20manual%20de%20PHP"><img src="http://cachi.temiga.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://cachi.temiga.org/2009/05/17/no_te_confies_de_todo_lo_que_dice_el_manual_de_php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
