<?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>Cabeza de Ratón</title>
	<atom:link href="http://cabezaderaton.com.ar/feed/" rel="self" type="application/rss+xml" />
	<link>http://cabezaderaton.com.ar</link>
	<description>versus el Amor Letal</description>
	<lastBuildDate>Fri, 02 Jul 2010 17:03:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>sNews en IIS</title>
		<link>http://cabezaderaton.com.ar/snews-en-iis/</link>
		<comments>http://cabezaderaton.com.ar/snews-en-iis/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 22:24:07 +0000</pubDate>
		<dc:creator>Pinien</dc:creator>
				<category><![CDATA[Snews]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Web.config]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=496</guid>
		<description><![CDATA[Cortito y al pie: me encontré ante la terrible situación de tener que instalar un sitio que había armado con snews en un servidor con IIS, cosa que creí no iba a pasarme nunca y zas! no funcionaba el .htaccess, claro, es exclusivo de nuestro querido y libre Apache. Cuando busco ayuda de como hacer [...]]]></description>
			<content:encoded><![CDATA[<p>Cortito y al pie: me encontré ante la terrible situación de tener que instalar un sitio que había armado con snews en un servidor con IIS, cosa que creí no iba a pasarme nunca y zas! no funcionaba el .htaccess, claro, es exclusivo de nuestro querido y libre <a href="http://httpd.apache.org/">Apache</a>. Cuando busco ayuda de como hacer funcionar <a href="http://snewscms.com">sNews</a> en IIS, la respuesta que encontré en los foros de <a href="http://snewscms.com">sNews</a> es que esta hecho para funcionar <strong>solo</strong> en el sistema que esta en mas del 80% de los servidores del mundo, <a href="http://httpd.apache.org/">Apache</a>, por supuesto.<br />
Seguí buscando y consulté al servicio de hosting, y resulta que IIS tiene un Mod Rewrite propio que estaba activado en este hosting. Encontré este <a href="http://learn.iis.net/page.aspx/557/translate-htaccess-content-to-iis-webconfig/">sitio</a> y con su ayuda creé un archivo Web.config en la raíz de mi sitio con este contenido:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;configuration&gt;
    &lt;configSections&gt;
        &lt;sectionGroup name=&quot;system.webServer&quot;&gt;
            &lt;sectionGroup name=&quot;rewrite&quot;&gt;
                &lt;section name=&quot;rewriteMaps&quot; overrideModeDefault=&quot;Allow&quot; /&gt;
                &lt;section name=&quot;rules&quot; overrideModeDefault=&quot;Allow&quot; /&gt;
            &lt;/sectionGroup&gt;
        &lt;/sectionGroup&gt;
    &lt;/configSections&gt;
    &lt;system.webServer&gt;
        &lt;directoryBrowse enabled=&quot;true&quot; /&gt;
        &lt;caching&gt;
            &lt;profiles&gt;
                &lt;add extension=&quot;.php&quot; policy=&quot;DisableCache&quot; kernelCachePolicy=&quot;DisableCache&quot; /&gt;
                &lt;add extension=&quot;.html&quot; policy=&quot;CacheForTimePeriod&quot; kernelCachePolicy=&quot;CacheForTimePeriod&quot; duration=&quot;14:00:00:00&quot; /&gt;
            &lt;/profiles&gt;
        &lt;/caching&gt;
        &lt;rewrite&gt;
            &lt;rules&gt;
                &lt;rule name=&quot;block favicon&quot; stopProcessing=&quot;true&quot;&gt;
                    &lt;match url=&quot;favicon\.ico&quot; /&gt;
                    &lt;action type=&quot;CustomResponse&quot; statusCode=&quot;404&quot; subStatusCode=&quot;1&quot;
                        statusReason=&quot;The requested file favicon.ico was not found&quot;
                        statusDescription=&quot;The requested file favicon.ico was not found&quot; /&gt;
                &lt;/rule&gt;
                &lt;rule name=&quot;Imported Rule 1&quot; stopProcessing=&quot;true&quot;&gt;
                    &lt;match url=&quot;^(.*)$&quot; ignoreCase=&quot;false&quot; /&gt;
                    &lt;conditions&gt;
                        &lt;add input=&quot;{HTTP_HOST}&quot; pattern=&quot;^example\.com$&quot; /&gt;
                    &lt;/conditions&gt;

                    &lt;action type=&quot;Redirect&quot; redirectType=&quot;Permanent&quot; url=&quot;http://www.example.com/{R:1}&quot; /&gt;
                &lt;/rule&gt;
                &lt;rule name=&quot;Imported Rule 2&quot; stopProcessing=&quot;true&quot;&gt;
                    &lt;match url=&quot;^(.*)$&quot; ignoreCase=&quot;false&quot; /&gt;
                    &lt;conditions&gt;
                        &lt;add input=&quot;{REQUEST_FILENAME}&quot; matchType=&quot;IsFile&quot; ignoreCase=&quot;false&quot; negate=&quot;true&quot; /&gt;
                        &lt;add input=&quot;{REQUEST_FILENAME}&quot; matchType=&quot;IsDirectory&quot; ignoreCase=&quot;false&quot; negate=&quot;true&quot; /&gt;
                        &lt;add input=&quot;{URL}&quot; pattern=&quot;^/favicon.ico$&quot; ignoreCase=&quot;false&quot; negate=&quot;true&quot; /&gt;
                    &lt;/conditions&gt;
                    &lt;action type=&quot;Rewrite&quot; url=&quot;index.php?category={R:1}&quot; appendQueryString=&quot;true&quot; /&gt;
                &lt;/rule&gt;
            &lt;/rules&gt;
        &lt;/rewrite&gt;
        &lt;defaultDocument&gt;
            &lt;files&gt;
                &lt;remove value=&quot;index.php&quot; /&gt;
                &lt;add value=&quot;index.php&quot; /&gt;
            &lt;/files&gt;
        &lt;/defaultDocument&gt;
    &lt;/system.webServer&gt;
&lt;/configuration&gt;
</pre>
<p> y voilà! mi sitio en sNews funcionando con sus lindas urls amigables!</p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/snews-en-iis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMS : Snews</title>
		<link>http://cabezaderaton.com.ar/cms-snews/</link>
		<comments>http://cabezaderaton.com.ar/cms-snews/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 17:01:06 +0000</pubDate>
		<dc:creator>Pinien</dc:creator>
				<category><![CDATA[Snews]]></category>
		<category><![CDATA[cms]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=469</guid>
		<description><![CDATA[Snews es un CMS ultra simple, pero muy potente, ideal para resolver las necesidades de blog pequeños. Existen mods, addons y aplicaciones de terceros que amplían su funcionalidad, haciendo pequeñas modificaciones en el código. Como se imaginaran es necesario tener un mínimo conocimiento de php para utilizar esto, digamos que escapa la filosofía del clic [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://snewscms.com/">Snews</a> es un CMS ultra simple, pero muy potente, ideal para resolver las necesidades de blog pequeños.<br />
Existen <a href="http://snewscms.com/forum/index.php?board=97.0">mods</a>, <a href="http://snewscms.com/forum/index.php?board=98.0">addons</a> y <a href="http://snewscms.com/forum/index.php?board=99.0">aplicaciones de terceros</a> que amplían su funcionalidad, haciendo pequeñas modificaciones en el código. Como se imaginaran es necesario tener un mínimo conocimiento de php para utilizar esto, digamos que escapa la filosofía del clic de WordPress. Esto depende de como se lo mire puede ser bueno o malo. En mi caso buenísimo por que te una flexibilidad difícil de encontrar en otros CMS más grandes, sin complicarse, claro.<br />
La instalación es casi tan sencilla como descomprimir el contenido de zip en una carpeta, no encontré las instrucciones en castellano para linkear así que les dejo un detalle de las cosas a tener en cuenta:</p>
<ol>
<li>Bajar el <a href="http://snewscms.com/home/download/">zip de la última versión</a></li>
<li>Descomprimir en el servidor </li>
<li>Con tu administrador de mysql favorito crear la base de datos e importar el sql que se encuentra en la carpeta <code>/sql/</code> del proyecto.
<li>Configurar la conexión de la base de datos en las primeras líneas del archivo snews.php:<br />
<code> 	                     // MySQL host<br />
		             'dbhost' 	=> 'localhost',<br />
		             // Database name<br />
		             'dbname' 	=> 'snews17',<br />
		             // Database Username<br />
		             'dbuname' 	=> 'root',<br />
		             // Database password<br />
		             'dbpass' 	=> 'root',</code>
</li>
</ol>
<p><a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/08/Pantallazo-sNews-1.7-Mozilla-Firefox.png"><img src="http://cabezaderaton.com.ar/wp-content/uploads/2009/08/Pantallazo-sNews-1.7-Mozilla-Firefox-300x179.png" alt="Pantallazo-sNews 1.7" title="Pantallazo-sNews 1.7" width="300" height="179" class="aligncenter size-medium wp-image-488" /></a><br />
Y listo!, claro, siempre y cuando se cumplan ciertos requisitos:</p>
<ul>
<li>Tener el Apache instalado con el mod_rewrite habilitado, para que funcionen las url amigables</li>
<li>MySQL</li>
<li>PHP versión 4.3.x o superior</li>
<li>.htaccess (con permisos de edición)</li>
</ul>
<p>Haciendo click en <strong>login</strong> ingresan a la administración, el usuario y contraseña por defecto es <em>test</em>. Ahí van a ver las múltiples opciones que tiene. </p>
<p>Sugerencias:</p>
<ul>
<li>Cambiar el prefijo de las tablas, es una medida de seguridad que no esta demás. Esto se hace modificando el archivo sql antes de importarlo. Luego indicar en el snews.php el prefijo usado:
<p>                              <code> // Table prefix for multiple sNews systems on one database<br />
		                 // if you don't need it just leave it blank<br />
			         'prefix' 	=> ' '<br />
</code></p>
</li>
<li>Pueden bajar el <a href="http://snewscms.com/forum/index.php?topic=7200.0">archivo de idiomas</a>, bajarlo en la carpeta <code>/lang/</code> y setear en la configuración el idioma deseado. Yo tomé el archivo <code>EN.php</code> de esa carpeta y creé mi traducción propia: <code><a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/08/ES.zip">ES.php</a></code>, la pueden bajar a su riesgo por que puede que tenga muchos errores.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/cms-snews/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>We are under attack!</title>
		<link>http://cabezaderaton.com.ar/we-are-under-attack/</link>
		<comments>http://cabezaderaton.com.ar/we-are-under-attack/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 20:07:34 +0000</pubDate>
		<dc:creator>Pinien</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=463</guid>
		<description><![CDATA[Si alguien intento entrar a blog este fin de semana (ordas de visitas truncas!), habrán notado que habíamos sido sido raptados por un &#8220;pirata&#8221; de la web. En fin, cosas que pasan. A favor nuestro estamos alojados en un servidor bien serio que nos recuperó la cuenta rápidamente y nos recomendó asegurar nuestro WordPress para [...]]]></description>
			<content:encoded><![CDATA[<p>Si alguien intento entrar a blog este fin de semana (ordas de visitas truncas!), habrán notado que habíamos sido sido raptados por un &#8220;pirata&#8221; de la web. En fin, cosas que pasan. A favor nuestro estamos alojados en un <a href="http://www.pydot.com">servidor</a> bien serio que nos recuperó la cuenta rápidamente y nos recomendó asegurar nuestro WordPress para evitar nuevos ataques.<br />
Entonces, gentileza obliga, vamos listar las medidas a tener en cuenta a la hora de mejorar la seguridad de nuestro querido WordPress:</p>
<ol>
<li>Mantener la versión de WordPress actualizada, <strong>siempre</strong>, evitemos que nos ataquen por bugs conocidos y resueltos.</li>
<li>Lo mismo corre para los plugins y para los themes. Además tratar de que sean de fuentes confiables. Creo que a partir de la versión 2.7 WP te avisa siempre que haya actualizaciones disponibles. </li>
<li>Siempre, <strong>siempre</strong> hacer backups de todo (esto es para mi).</li>
<li>instalar el plugin <a href="http://wordpress.org/extend/plugins/wp-security-scan/">WP Security Scan </a> que sugiere varias modificaciones, entre ellas:</li>
<ul>
<li>Cambiar el prefijo por defecto de las tablas.  Esto es una medida que se puede tomar a la hora de la instalación, o bien modificarlas en uno ya instalado. A mi la herramienta que trae el plugin no me funcionó, pero pude hacer manualmente haciendo un backup del sql de la base de datos y remplazando el <em>wp_</em> por una cadena nueva del tipo gql257s_ por ejemplo, subir de nuevo la base de datos con este sql. Luego reemplazar en el <em>wp-config.php</em> la cadena  <em>$table_prefix = &#8216;wp_&#8217;;</em> por <em>$table_prefix = &#8216;gql257s_ &#8216;;</em>. Como precauciones, no hay que estar logueado en el panel de administración al momento de hacerlo y se deben desactivar todos los Plugins, una vez restaurada la base de datos se activan nuevamente. No hacer esto puede generar el maldito error &#8220;No tienes autorización para acceder a esta página&#8221; (que no supe solucionar) al loguearte.</li>
<li>Eliminar el usuario admin que crea por defecto, para no ser tan obvios.</li>
<li>Crear el archivo .htaccess para nuestro wp-admin. Yo lo hice siguiendo <a href="http://www.guvnr.com/web/blogging/10-tips-to-make-wordpress-hack-proof/">este instructivo</a> de paso creé el del wp-content también.</li>
<li>También hace un chequeo de los permisos que deberias tener en cada una de las carpetas de tu blog, y te sugiere los cambios necesarios.</li>
<li>Otras recomendaciones que en las últimas versiones de WP vienen por defecto o en el theme que uso viene por defecto, como ocultar la versión de WP, apagar los errores de de la base de datos, etc.</li>
</ul>
</ol>
<p>Buscando un poco encontré un par de link interesantes en el blog de aNieto que vale la pena recorrerlos para estar mas seguros:<br />
<a href="http://www.anieto2k.com/2009/01/27/10-pasos-para-proteger-tu-panel-de-administrador/">10 pasos para proteger tu panel de administrador</a> y uno mas viejito:<br />
<a href="http://www.anieto2k.com/2007/10/31/las-paginas-blancas-de-la-seguridad-wordpress/">Las páginas blancas de la seguridad WordPress</a></p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/we-are-under-attack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AutoCompletado con Symfony</title>
		<link>http://cabezaderaton.com.ar/autocompletado-con-symfony/</link>
		<comments>http://cabezaderaton.com.ar/autocompletado-con-symfony/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 22:28:40 +0000</pubDate>
		<dc:creator>retrofox</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[autocompleter]]></category>
		<category><![CDATA[sfFormExtraPlugin]]></category>
		<category><![CDATA[sfWidgetFormPropelJQueryAutocompleter]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=431</guid>
		<description><![CDATA[Denominamos &#8216;Autocompletado&#8217;  al comportamiento que se produce en campos de texto especiales donde a medida que tipeamos este nos devuelve, generalmente en forma de lista, los resultados de una búsqueda en función del texto introducido. Es muy útil cuando consideramos que la cantidad de opciones de un campo tipo select es muy grande; por ejemplo, [...]]]></description>
			<content:encoded><![CDATA[<p>Denominamos &#8216;Autocompletado&#8217;  al comportamiento que se produce en campos de texto especiales donde a medida que tipeamos este nos devuelve, generalmente en forma de lista, los resultados de una búsqueda en función del texto introducido.</p>
<p>Es muy útil cuando consideramos que la cantidad de opciones de un campo tipo select es muy grande; por ejemplo, un listado de países.<span id="more-431"></span></p>
<h2>Consideraciones Iniciales</h2>
<p>En este ejemplo se muestra como implementar los scripts necesarios. Utilizaremos el widget sfWidgetPropelChoice con algunas funcionalidades adicionales incluidas en el plugin <a title="sfFormExtraPlugin" href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_blank">sfFormExtraPlugin</a> [1].</p>
<h3>Instalando el plugin</h3>
<p>No vamos a perder mucho tiempo en esto; simplemente:</p>
<pre class="brush: jscript;">
$ symfony plugin:install sfFormExtraPlugin
$ symfony clear:cache
</pre>
<p>Si surgen dudas puedes consultar el <a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_blank">readme</a> de la doc.</p>
<h3>Agregando jQuery</h3>
<p>Por si no lo comenté anteriormente, necesitamos el framework de javascript <em>jQuery</em> para nuestro input de autocompletado. El plugin <em>sfFormExtraPlugin</em> no lo incluye por lo que tendremos que hacerlo a manopla. Puedes descargar el framework desde este <a title="Descargar jQuery" href="http://docs.jquery.com/Downloading_jQuery" target="_blank">link</a> [2]. En estos momentos yo he descargado jquery-1.3.2.min.js.</p>
<p>Luego tienes que incluirlo en tu aplicación, para eso edita el archivo view.yml que se encuentra en la carpeta /config de la misma. Algo así:</p>
<pre class="brush: jscript;">
  javascripts:    [ jquery-1.3.2.min.js ]
</pre>
<p>Puedes verificar si sQuery es cargado por la aplicación ojeando el código html generado; hasta puedes copiar la ruta del script y cargarla en el del browser para la comprobación final.</p>
<h2>Schema de nuestro ejemplo.</h2>
<p>Usaremos como ejemplo una tabla denominada <em>producto</em> y otra <em>categoria</em> para la relación 1-n:</p>
<pre style="font-size: 10px">propel:
  categoria:
    _attributes: { phpName: Categoria, idMethod: native }
    id: { type: integer, required: true, primaryKey: true, autoIncrement: true }
    nombre: { type: varchar(50), required: true }
    descripcion: { type: longvarchar }

  producto:
    _attributes: { phpName: Producto, idMethod: native }
    id: { type: integer, required: true, primaryKey: true, autoIncrement: true }
    codigo: { type: varchar(20), required: true }
    nombre: { type: varchar(100), required: true }
    marca: { type: varchar(80) }
    descripcion: { type: longvarchar }
    categoria_id: { type: integer, foreignTable: categoria, foreignReference: id }
</pre>
<p>Creamos una aplicación y para simplificar la existencia generamos un módulo administrativo con el generador de propel. En mi caso yo generé la aplicación <strong>pruebas</strong> y el módulo a partir de la clase <strong>Producto</strong>.</p>
<pre>$ symfony generate:app pruebas
$ propel:generate-admin pruebas Producto
</pre>
<h3>Configurando el widget</h3>
<p>Como todo hijo de vecino sabe Propel genera clases del modelo (ORM) y también las clases de formulario del modelo entre otras cositasa más. Tendremos que redefinir el widget para nuestro campo <em>categoria_id</em>.</p>
<p>Entonces, dentro de la clase <em>ProductoForm.class.php</em> definiremos:</p>
<pre class="brush: php;">
  public function configure() {
   // ..
    $this-&gt;widgetSchema['categoria_id'] = new sfWidgetFormChoice(array(
      'choices'          =&gt; array(),
      'renderer_class'   =&gt; 'sfWidgetFormPropelJQueryAutocompleter',
      'renderer_options' =&gt; array(
        'model' =&gt; 'Categoria',
        'url'   =&gt; $this-&gt;getOption('url')
      )
    ));
  // ..
  }
</pre>
<p>Acá es donde invocamos a la clase <em>sfWidgetFormPropelJQueryAutocompleter</em> definida en el archivo <em>sfWidgetFormPropelJQueryAutocompleter.class.php</em> que es agregada en el plugin <em>sfFormExtraPlugin</em>.</p>
<p>La usamos como clase de renderizado en el parámetro <strong>renderer_class</strong>. También definimos el modelo &#8216;<em>Categoria</em>&#8216; que usamos para la relacion 1-n y finalmente definimos &#8216;url&#8217; mediante el método <em>getObject(&#8216;url&#8217;)</em>;</p>
<p>El parámetro &#8216;url&#8217; define la dirección url que utilizará javascript cuando realice las búsquedas, a través de AJAX, de las distintas categorías para nuestro ejemplo. Con &#8216;<em>$this-&gt;getObject(&#8216;url&#8217;)&#8217;</em> esperamos que este valor &#8216;venga&#8217; cuando creamos el objeto de formulario; por lo que tendremos que definirlo.</p>
<h3>En el controlador &#8230;</h3>
<p>En el controlador, en nuestra clase de acciones, vamos a redefinir el método <em>executeNew</em>.</p>
<pre class="brush: php;">
  public function executeNew(sfWebRequest $request)
  {
    $this-&gt;producto = new Producto ();
    $this-&gt;form = new ProductoForm ($this-&gt;producto, array('url' =&gt; $this-&gt;getController()-&gt;genUrl('producto/request2Autoomplete')));
  }
</pre>
<p>Hemos creado un nuevo objeto de formulario donde se ha pasado dentro del array de opciones el parámetro &#8216;<em>url</em>&#8216; con el valor del link (renderizado) de la acción &#8216;<em>producto/autocomplete</em>&#8216;.</p>
<p>Esto significa que el browser, gracias a los scripts de javascript, hará que cada vez que escribamos en el input se produzca un request a esta acción y es esta misma quien deberá &#8216;contestar&#8217; ese pedido con los datos (en formato JSON) de la búsqueda en la tabla <em>&#8216;categoria&#8217;</em> dentro de la base de datos.</p>
<p>Entonces nosotros hemos definido el nombre de la acción<em> &#8216;autoComplete</em>&#8216; de nuestro módulo <em>&#8216;producto&#8217;</em> por lo que tendremos que programarla:</p>
<pre class="brush: php;">
  public function executeAutoComplete($request)
  {
    $this-&gt;getResponse()-&gt;setContentType('application/json');
    $categorias = CategoriaPeer::retrieveForAutoSelect($request-&gt;getParameter('q'), $request-&gt;getParameter('limit'));
    return $this-&gt;renderText(json_encode($categorias));
  }
</pre>
<p>En esta acción hemos definido el content-type de la página de respuesta como application/json, creado una variable $categorias que son todas las categorías que nos devuelve el método de la clase <em>CategoriaPeer</em> denominado <em>&#8216;retrieveForAutoSelect&#8217;</em> y finalmente renderizamos la respuesta de la acción transformando el array $categorias a notación <a href="http://es.wikipedia.org/wiki/JSON" target="_blank">JSon</a> [3].</p>
<p>Por si no te has dado cuenta el método peer <em>&#8216;retrieveForAutoSelect&#8217;</em> no existe. Amigo .. a arremangarse.</p>
<h3>El método Peer</h3>
<p>Finalmente debemos programar el método Peer que nos devuelve un array con todas las categorías encontradas en función de los datos que vamos introduciendo en el campo de texto:</p>
<pre class="brush: php;">
  static public function retrieveForAutoSelect($q, $limit)
  {
    $criteria = new Criteria();
    $criteria-&gt;add(CategoriaPeer::NOMBRE, '%'.$q.'%', Criteria::LIKE);
    $criteria-&gt;addAscendingOrderByColumn(CategoriaPeer::NOMBRE);
    $criteria-&gt;setLimit($limit);

    $categorias = array();
    foreach (CategoriaPeer::doSelect($criteria) as $categoria)
    {
      $categorias[$categoria-&gt;getId()] = (string) $categoria;
    }

    return $categorias;
  }
</pre>
<h2>Final.</h2>
<p>Con todo lo realizado deberíamos tener funcionando nuestro autocompletado en el campo de las categorías. He subido un ejemplo onLine con el comportamiento correcto para que se pueda apreciar el funcionamiento.</p>
<p>Al agregar un <a title="Producto Nuevo" href="http://cabezaderaton.com.ar/symfony/web/index.php/producto/new" target="_blank">producto nuevo</a> [6] se aprecia el funcionamiento en el campo <em>&#8216;categoria_id&#8217;</em>. Puedes agregar <a title="Más Categrías" href="http://cabezaderaton.com.ar/symfony/web/index.php/categoria/new" target="_blank">más categorías</a> [7] para que el ejemplo funcione mejor.</p>
<p>Gran parte de mi comprensión sobre este tema se debe a la traducción de formularios de librosWeb.es [4], hoy por hoy material imprescindible para el buen aprendizaje de symfony en idioma castellano; y al artículo <em><a title="Haz tu elección" href="http://www.puentesdiaz.com.ar/symfony/haz-tu-eleccion.php" target="_blank">Haz tu Elección</a> </em>de Roberto Puentes Díaz [5].</p>
<p>Saludos &#8230;</p>
<h4>Enlaces</h4>
<p>[1] <a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_self">http://www.symfony-project.org/plugins/sfFormExtraPlugin</a><br />
[2] <a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" target="_blank">http://docs.jquery.com/Downloading_jQuery</a><br />
[3] <a href="http://es.wikipedia.org/wiki/JSON" target="_blank">http://es.wikipedia.org/wiki/JSON</a><br />
[4] <a href="http://www.librosweb.es/symfony_formularios/capitulo12/widgets_para_elecciones.html" target="_blank">http://www.librosweb.es/symfony_formularios/capitulo12/widgets_para_elecciones.html</a><br />
[5] <a title="Haz tu elección" href="http://www.puentesdiaz.com.ar/symfony/haz-tu-eleccion.php">http://www.puentesdiaz.com.ar/symfony/haz-tu-eleccion.php</a><br />
[6] <a title="Agregar Producto Nuevo" href="http://cabezaderaton.com.ar/symfony/web/index.php/producto/new" target="_blank">http://cabezaderaton.com.ar/symfony/web/index.php/producto/new</a><br />
[7] <a title="Agregar Categoría nueva" href="http://cabezaderaton.com.ar/symfony/web/index.php/categoria/new" target="_blank">http://cabezaderaton.com.ar/symfony/web/index.php/producto/new</a></p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/autocompletado-con-symfony/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Contra la pared: documento e Internet Explorer requerido.</title>
		<link>http://cabezaderaton.com.ar/contra-la-pared-documento-e-internet-explorer-requerido/</link>
		<comments>http://cabezaderaton.com.ar/contra-la-pared-documento-e-internet-explorer-requerido/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 12:10:33 +0000</pubDate>
		<dc:creator>retrofox</dc:creator>
				<category><![CDATA[Terror en la WEB]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=418</guid>
		<description><![CDATA[En la lista de correo de usuarios de Ubuntu de Argentina leo el emprendimiento de un muchacho al encarar un site donde se publiquen aquellas páginas webs que requieren internet explorer para su uso. En un primer momento me llama la atención de manera poco agradable la cantidad de páginas del gobierno nacional que están [...]]]></description>
			<content:encoded><![CDATA[<p>En la lista de correo de usuarios de Ubuntu de Argentina leo el emprendimiento de un muchacho al encarar un site donde se publiquen aquellas páginas webs que requieren internet explorer para su uso.</p>
<div id="attachment_420" class="wp-caption alignnone" style="width: 310px"><a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/07/ie-requerido.png"><img class="size-medium wp-image-420" title="ie-requerido" src="http://cabezaderaton.com.ar/wp-content/uploads/2009/07/ie-requerido-300x124.png" alt="Internet Explorer requerido. Algo demasiado habitual." width="300" height="124" /></a><p class="wp-caption-text">Internet Explorer requerido. Algo demasiado habitual.</p></div>
<p>En un primer momento me llama la atención de manera poco agradable la cantidad de páginas del gobierno nacional que están bajo esta condición: <a href="http://foncyt.mincyt.gov.ar/inquality/" target="_blank">FONCyt</a>, <a href="http://foncyt.mincyt.gov.ar/inquality/" target="_blank">SeSOP</a>, <a href="http://www.afip.gov.ar/" target="_blank">AFIP</a>, etc.</p>
<p>Con poco podría ser de otra manera, no ?; más si tenemos en cuenta que gracias a Dios Internet Explorer no monopoliza como lo hacía antes, y parece ser que la tendencia es aún más pesimista para uno de los peores navegadoras que he conocido.</p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/contra-la-pared-documento-e-internet-explorer-requerido/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subir proyecto de Symfony a hosting</title>
		<link>http://cabezaderaton.com.ar/subir-proyecto-de-symfony-a-hosting/</link>
		<comments>http://cabezaderaton.com.ar/subir-proyecto-de-symfony-a-hosting/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 00:29:53 +0000</pubDate>
		<dc:creator>retrofox</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=395</guid>
		<description><![CDATA[Hoy tuve que subir un proyecto de symfony a un hosting &#8216;normal&#8217;; o sea, sólo tenía acceso por ftp y un administrador simple de MySql, el tan conocido por todos PhpMyAdmin. Este artículo intentará ser una simple guía para poder realizar esta tarea que tantos dolores de cabeza les trae al grupo de aprendices de [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy tuve que subir un proyecto de symfony a un hosting &#8216;normal&#8217;; o sea, sólo tenía acceso por ftp y un administrador simple de MySql, el tan conocido por todos <a title="PhpMyAdmin" href="http://www.phpmyadmin.net/" target="_blank">PhpMyAdmin</a>. Este artículo intentará ser una simple guía para poder realizar esta tarea que tantos dolores de cabeza les trae al grupo de aprendices de symfony; en los cuales estamos todos menos ese tal <a title="Blog de Fabien Potencier" href="http://fabien.potencier.org/" target="_blank">Fabien</a>.</p>
<p>Aclaremos que lo hice usando Symfony 1.2, por lo que puede variar en algunos detalles cuando usemos otra versión.<span id="more-395"></span></p>
<h2>Primero; los requisitos mínimos.</h2>
<p>Muy posiblemente no va a ser ni la primera ni la última vez que subimos nuestro proyecto, creamos la base de datos, importamos los datos, etc. sin antes cerciorarnos que nuestro maldito hosting cumpla con los requerimientos técnicos mínimos. Aclaración para el alunado que nunca falta: no es necesario que en el servidor tengamos instalado symfony.</p>
<h3>phpInfo.</h3>
<p>Bueno, lo primero que podemos hacer es echarle una mirada a la configuración de php que tenemos en nuestro servidor. Simplemente haciendo un script, por ejemplo con el nombre info.php, y llamando a la función phpInfo() <a title="PhpInfo de CabezaDeRaton" href="http://cabezaderaton.com.ar/info.php" target="_blank">podemos ver</a> un buen panorama de la configuración en el server.</p>
<pre class="brush: php;">
&lt;?php
echo phpinfo() ;
?&gt;
</pre>
<h3>Check Configuration.</h3>
<div id="attachment_400" class="wp-caption alignnone" style="width: 310px"><a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/07/check_configuration.png"><img class="size-medium wp-image-400" title="check_configuration" src="http://cabezaderaton.com.ar/wp-content/uploads/2009/07/check_configuration-300x280.png" alt="Captura del check configuration de symfony 1.2" width="300" height="280" /></a><p class="wp-caption-text">Captura del check configuration de symfony 1.2</p></div>
<p>Y la segunda buena idea que podemos tener es ejecutar el script de chequeo de configuración que viene incluido cuando instalamos symfony (en la modalidad que sea) en nuestro server local. En mi caso donde uso Ubuntu y he instalado symfony mediante pear dicho archivo se encuentra en la siguiente dirección.</p>
<pre class="brush: php;">
/usr/share/php/data/symfony/bin/check_configuration.php
</pre>
<p>Yo he modificado ligeramente el archivo para que quede mas lindo, similar a una consola . <img src='http://cabezaderaton.com.ar/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> . Pueden descargar el archivo <a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/07/check_configuration.php.tar.gz">check_configuration.php.tar enlace</a>, descomprimirlo y subirlo directamente a la raiz del hosting y ejecutarlo. En mi hosting actual, este es el <a title="Prueba de Chek Configuration en Cabeza de Raton" href="http://cabezaderaton.com.ar/check_configuration.php" target="_blank">link de prueba</a> donde se aprecia que esta todo bien.</p>
<p>Si hay algo que no cuadra en estas pruebas, no sigas. Es imprescindible que estos chequeos sean correctos.</p>
<h2>Freezar !</h2>
<p>Freezar el proyecto es imprescindible. Creo haber leído que en futuras versiones esto ya no será necesario ya que nuestro proyecto tendrá el código necesario para que sea autosuficiente. Por lo pronto esto no es así.</p>
<p>Una tarea importante, que por lo menos yo siempre hago, es hacer una copia de nuestro proyecto ANTES de freezar. Porque al hacerlo en el proyecto se copiarán las librerías y archivos necesarios. Si bien existen métodos para desfreezar el proyecto me parece que es preferible trabajar con una copia local.</p>
<p>En la raíz de nuestro proyecto:</p>
<pre class="brush: php;">
$ symfony freeze /usr/share/php/symfony
</pre>
<p>La ubicación donde se encuentra instalado symfony (/usr/share/php/symfony en mi caso) puede variar en función del tipo de instalación que hemos utilizado. Para saber cual es la ruta correcta para nuestro caso podemos usar:</p>
<pre class="brush: php;">
$ symfony -V
</pre>
<h2>Limpiar la Basura. Configurar permisos.</h2>
<p>Podemos limpiar la cache usando el comando de symfony o borrando los archivos a mano. También podemos borrar el contenido de la carpeta log/ ya que no nos interesa subirlo al hosting.</p>
<pre class="brush: php;">
$ rm -rf cache/*
$ rm -rf log/*
</pre>
<p>También podemos darle permisos de escritura a estas carpetas para la aplicación pueda generar los archivos sin problemas.</p>
<pre class="brush: php;">
$ chmod 777 cache/ -R
$ chmod 777 log/ -R
</pre>
<h2>Subir el proyeto al hosting.</h2>
<p>Esto puede ser verdaderamente una tarea complicada si no lo hacemos con un mínimo de astucia. A lo que voy, en esta instancia mi proyecto tiene cerca de 4600 archivos (find -type f | wc -l). Si se nos ocurre subir vía ftp el proyecto al servidor a lo paisano vamos a notar que podemos estar una buena cantidad de minutos observando la progresión. Ni hablar si se nos corta la transmisión en medio de la transición. Un caos.</p>
<h3>A comprimiiiiiirrrrr.</h3>
<p>Lo ideal sería que en nuestro hosting tengamos alguna herramienta que nos permita descomprimir archivos en el servidor, como cPanel. De esta manera con solo comprimir todo el proyecto en forma local, subir un solo archivo (del órden de una decena de megas) y descomprimir en el server a otra cosa mariposa.</p>
<p>Pero si no contamos con este beneficio nos las podemos arreglar con algún script programado en php para tal fin. Para esto usamos PclZip.</p>
<div id="attachment_405" class="wp-caption alignleft" style="width: 236px"><a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/07/miproyecto_unzip.png"><img class="size-full wp-image-405" title="miproyecto_unzip" src="http://cabezaderaton.com.ar/wp-content/uploads/2009/07/miproyecto_unzip.png" alt="Acomodando" width="226" height="137" /></a><p class="wp-caption-text">Acomodando los archivos</p></div>
<p>PclZip es una clase programada en PHP que nos permite descomprimir archivos .zip. Lo mejor que podemos hacer es guardar en una carpeta el proyecto comprimido, la clase PclZip y un archivo que usaremos para la descrompresión llámese unzip.php.</p>
<p>Nuestro archivo unzip.php debe incluir la clase php pclzip, crear un objeto y definirle a dicho objeto el nombre del archivo que queremos descomprimir. Podemos hacer algo así:</p>
<pre class="brush: php;">
&lt;?php
require_once('pclzip.lib.php');

echo '&lt;h3&gt;Cargamos clase pclzip&lt;/h3&gt;';

echo '&lt;h3&gt;Creando objeto ...&lt;/h3&gt;';
$archive = new PclZip(&quot;miProyecto.zip&quot;);

if ($archive-&gt;extract() == 0) {
die(&quot;Error : &quot;.$archive-&gt;errorInfo(true));
}
else {
echo '&lt;h2&gt;Descompresión OK&lt;/h2&gt;';
}
?&gt;
</pre>
<p>Ahora sólo resta subir estos tres archivos al hosting y ejecutar el script unzip.php. Tengamos en cuenta que esta tarea puede tardar varios segundos. No nos pongamos nerviosos. La pantalla permanecerá con el mensaje &#8216;Creando objeto &#8230;&#8217; un lapso que dependerá de cuán potente es nuestro servidor. Es un buen momento para ir a hacer pis.</p>
<p>Si todo el proceso no ha sufrido errores al actualizar la vista en nuestro gestor ftp podremos ver todos los archivos y carpetas producto de descomprimir nuestro proyecto.</p>
<h2>Esta historia continuará &#8230;</h2>
<p>Restan muchas cosas por resolver que por cuestiones de tiempo y esfuerzo no puedo hacerlas ahora. Si consideramos que ya haz creado la base de datos y has importado lo que tenias en el server local la aplicación debería funcionar.</p>
<p>Espero que este artículo siga evolucionando en función de nuevas experiencias, preguntas y respuestas que puedan llegar. Saludos.</p>
<p>Esta historia continuará &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/subir-proyecto-de-symfony-a-hosting/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>JavaScripts dinámicos en Symfony.</title>
		<link>http://cabezaderaton.com.ar/javascripts-dinamicos-en-symfony/</link>
		<comments>http://cabezaderaton.com.ar/javascripts-dinamicos-en-symfony/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 00:04:38 +0000</pubDate>
		<dc:creator>retrofox</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=357</guid>
		<description><![CDATA[Me he visto en la necesidad de cargar archivos javascript dinámicos en una aplicación desarrollada en Symfony. Aquí, mi solución. Javascript Dinámico ? Pues la verdad así entiendo a un archivo javascript que modifica su contenido en función de ciertos factores. Por ejemplo, generar una estructura de datos en notación JSON en base a datos [...]]]></description>
			<content:encoded><![CDATA[<p>Me he visto en la necesidad de cargar archivos javascript dinámicos en una aplicación desarrollada en Symfony. Aquí, mi solución.</p>
<h2>Javascript Dinámico ?</h2>
<p>Pues la verdad así entiendo a un archivo javascript que modifica su contenido en función de ciertos factores. Por ejemplo, generar una estructura de datos en notación JSON en base a datos producto de una consulta realizada en el modelo.<span id="more-357"></span></p>
<h2>Metodología</h2>
<p>La implementación la he tomado de este artículo llamado <a href="http://www.symfony-zone.com/wordpress/2008/12/13/use-routing-to-server-localized-and-dynamic-javascript/" target="_blank">Use routing to serve localized and dynamic JavaScript</a> que he encontrado googleando. Mi aporte es más que una traducción una libre interpretación con algunos comentarios adicionales. O sea, una chantada.</p>
<h3>La dirección del Archivo dinámico</h3>
<p>Comenzado de atrás para adelante, vamos a definir el nombre de nuestro archivo javascript para insertarlo en algún script php de la vista, ya sea un layout, un template, etc. Tenemos que tener en cuenta que en función del nombre del archivo que definamos tendremos que definir una ruta nueva en nuestra aplicación.</p>
<p>Por ejemplo &#8230; usemos:</p>
<pre class="brush: php;">
&lt;?php
// Cargamos js con el helper
use_javascript('miModulo/dinamico.js');
?&gt;
</pre>
<p>O sea &#8230; el nombre y la ruta que hemos escogido poco tiene que ver con el archivo que realmente terminará generando el código javascript. Eso lo termina definiendo la nueva ruta.</p>
<h3>Nueva ruta a routing.yml</h3>
<p>Ahora debemos agregar una nueva ruta a nuestro routing.yml de nuestra aplicación en función del nombre de archivo antes definido. Para nuestro ejemplo:</p>
<pre class="brush: php;">
dynamic_javascript:
url: /miModulo/:filename.js
param: { module: modulo-real, action: load }
</pre>
<p>Con esta ruta lo que logramos es que cuando se intente cargar el archivo desde el helper <em>use_javascript</em> busque la acción <strong>load</strong> del modulo &#8216;modulo-real&#8217;.</p>
<h3>El Módulo</h3>
<p>Ahora creamos un módulo nuevo en función de la ruta, en nuestro ejemplo es &#8216;modulo-real&#8217;:</p>
<pre class="brush: xml;">$&gt; symfony generate:module appname script</pre>
<p>Y definimos la acción load que indefectiblemente buscará la aplicación a causa de la ruta:</p>
<pre class="brush: php;">
public function executeLoad($request) {
$this-&gt;setLayout(false);
$this-&gt;getResponse()-&gt;setContent('text/javascript');
$this-&gt;setTemplate($request-&gt;getParameter('filename'));
return &quot;.js&quot;.chr(0);
}
</pre>
<p>En este método:</p>
<p>La respuesta de la aplicación no tendrá un Layout.</p>
<p>Será un archivo de texto de javascript.</p>
<p>El contenido será el template con nombre igual a <em>dinamico.js</em>. Este archivo debe estar dentro de la carpeta templates del mismo módulo que esta acción, o sea, &#8216;modulo-real&#8217;.</p>
<h3>Y el dinamismo ?</h3>
<p>Bueno, simplemente trata a dinamico.js como un archivo PHP normal. Puedes usar y abusar de PHP y Symfony; mientras te asegures que lo que genera sea javascript, todo vale.</p>
<p>Por otro lado, puedes usar la arquitectura creada para cargar distintos archivos, por ejemplo &#8230;</p>
<pre class="brush: php;">&lt;?php use_javascript('miModulo/otro_js.js'); ?&gt;</pre>
<p>&#8230; y sólo preocuparte por tener ese archivo <em>otro_js.js</em> dentro de la misma carpeta templates.</p>
<p>Puedes modificar la acción para la forma de cargar el .js, etc. etc. etc.<br />
Espero que sea útil.<br />
Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/javascripts-dinamicos-en-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sfPropelMooDooPlugin &#8211; Algunas Capturas</title>
		<link>http://cabezaderaton.com.ar/sfpropelmoodooplugin-algunas-capturas/</link>
		<comments>http://cabezaderaton.com.ar/sfpropelmoodooplugin-algunas-capturas/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 14:27:25 +0000</pubDate>
		<dc:creator>retrofox</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=333</guid>
		<description><![CDATA[Presento un par de capturas del resultado del generator. Estas son imágenes preliminares, queda mucho por corregir, refactorizar, etc. Todavía no quiero mostrar un ejemplo funcionando porque algunas cosas me dan un poco de vergüenza. Están muy mal hechas y a conciencia.]]></description>
			<content:encoded><![CDATA[<p>Presento un par de capturas del resultado del generator. Estas son imágenes preliminares, queda mucho por corregir, refactorizar, etc.</p>
<div id="attachment_334" class="wp-caption alignnone" style="width: 310px"><a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/06/mooDoo-01.png"><img class="size-medium wp-image-334" title="Captura sfPropelMooDooPlugin" src="http://cabezaderaton.com.ar/wp-content/uploads/2009/06/mooDoo-01-300x95.png" alt="Captura del producto del generador" width="300" height="95" /></a><p class="wp-caption-text">Captura del producto del generador</p></div>
<p>Todavía no quiero mostrar un ejemplo funcionando porque algunas cosas me dan un poco de vergüenza. Están muy mal hechas y a conciencia.</p>
<p><a href="http://cabezaderaton.com.ar/wp-content/uploads/2009/06/mooDoo-02.png"><img class="alignnone size-medium wp-image-337" title="Captura de sfPropelMooDooPlugin" src="http://cabezaderaton.com.ar/wp-content/uploads/2009/06/mooDoo-02-300x181.png" alt="Captura de sfPropelMooDooPlugin" width="300" height="181" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/sfpropelmoodooplugin-algunas-capturas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sfPropelMooDooPlugin</title>
		<link>http://cabezaderaton.com.ar/sfpropelmoodooplugin/</link>
		<comments>http://cabezaderaton.com.ar/sfpropelmoodooplugin/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 13:08:24 +0000</pubDate>
		<dc:creator>retrofox</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=328</guid>
		<description><![CDATA[Hace un buen tiempo que empecé a programar con Symfony y desde la salida de la versión 1.2 me he dedicado a crear un generador administrativo (admin-generator) para Propel. Una tarea más que laboriosa para quien no domina al 100% muchas cosas del framework, tiene ambiciones,  aires de grandeza y no tiene donde caerse muerto. [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un buen tiempo que empecé a programar con Symfony y desde la salida de la versión 1.2 me he dedicado a crear un generador administrativo (admin-generator) para Propel. Una tarea más que laboriosa para quien no domina al 100% muchas cosas del framework, tiene ambiciones,  aires de grandeza y no tiene donde caerse muerto.</p>
<p>Estos últimos días he tomado la decisión de publicar el código no sin antes terminar al menos algunas puntos primordiales como documentación</p>
<p>Publicar en primera instancia me ayudará a ponerme metas y responsabilidades, y también aclarar mis ideas. Cuando uno escribe con la convicción de que hay personas que lo leen reafirma conceptos para poder transmitir de la mejor manera posible el mensaje al lector. Por lo menos, así lo veo yo.<br />
Y en segunda instancia, algo no seguro, poder recibir críticas, correcciones y porque no participación de otras personas.</p>
<p>Esta publicación estará, sin lugar a dudas, llena de correcciones que inevitablemente surgirán.</p>
<h3>Objetivos</h3>
<p>Implementar un plugin para symfony que nos permita incorporar a nuestros proyectos un generador similar al generator de propel pero con algunas mejoras sustanciales:</p>
<ul>
<li>Widgets de Formularios adaptados a las tecnologías usadas.</li>
<li>Uso de AJAX.</li>
<li>Implementación de una UI (Interface de Usuario).</li>
<li>JavaScript no intrusivo.</li>
</ul>
<h3>Tecnologías</h3>
<p>Inevitablemente el plugin deberá tener un buen soporte del lado cliente. En este caso utilizaremos mooTools.</p>
<h3>Metodología de funcionamiento</h3>
<p>La idea global de la metodología de funcionamiento es implementar un pequeño motor en el cliente (JS) con la capacidad suficiente de &#8216;entendimiento&#8217;  con las convenciones de funcionamiento de los scripts generador por Propel en el servidor.</p>
<p>Esta historia recién empieza &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/sfpropelmoodooplugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Me estaré volviendo viejo con mal gusto</title>
		<link>http://cabezaderaton.com.ar/me-estare-volviendo-viejo-con-mal-gusto/</link>
		<comments>http://cabezaderaton.com.ar/me-estare-volviendo-viejo-con-mal-gusto/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 13:27:18 +0000</pubDate>
		<dc:creator>retrofox</dc:creator>
				<category><![CDATA[Terror en la WEB]]></category>

		<guid isPermaLink="false">http://cabezaderaton.com.ar/?p=315</guid>
		<description><![CDATA[Hace mucho tiempo que no escribo en mi querido blog. He pasado por diversas experiencias que me han alejado de tan agradable rutina. Igual, creo que pasa en primera instancia por la motivación; y luego otros factores secundarios pero no menos importantes, como la constancia, organización; cualidades que últimamente se han esfumado. Hoy pienso que [...]]]></description>
			<content:encoded><![CDATA[<p>Hace mucho tiempo que no escribo en mi querido blog. He pasado por diversas experiencias que me han alejado de tan agradable rutina. Igual, creo que pasa en primera instancia por la motivación; y luego otros factores secundarios pero no menos importantes, como la constancia, organización; cualidades que últimamente se han esfumado.</p>
<p>Hoy pienso que debería escribir sobre algo relevante; cosa que no estoy muy seguro que lo sea. En estos días me ha llamado la atención la facilidad con la que se puede adquirir material &#8216;prohibido&#8217; en internet.</p>
<p>En realidad este no es el punto; todos sabemos que unos de los principales negocios desde los inicios de internet es la pornografía, por ejemplo. Pero hasta donde yo recordaba &#8230; todo se hacía desde el anonimato. Solía consumir material porno cuando buscaba cracks o serials para alguna aplicación pirata. Siempre sitios 100% desprolijos, armados con fotos berretas, gif animados, letras rojas y amarillas grandes, etc.</p>
<p>Al alejarme del soft privativo me alejé de los cracks y consecuentemente, en gran medida, de las chicas (y de los chicos por cierto). Mientras escribo esta entrada no dejo de escuchar a Mario Pergorini promocionar una y otra vez desde &#8216;cual es?&#8217; su web de mierda www.cuales.fm.</p>
<p><img class="alignleft size-medium wp-image-316" title="cualesson" src="http://cabezaderaton.com.ar/wp-content/uploads/2009/06/cualesson-300x161.png" alt="cualesson" width="300" height="161" /></p>
<p>Y eso me llama la atención. Ya no son piratas anónimos, es el mismo pelotudo que tanto respeto se ha ganado con algunos programas televisivos, comentarios contestatarios, excelentes reportajes, etc.</p>
<p>Me da un poco de cosa como se va blanqueando el negocio y que no se entienda que internet es un medio tan o más influyente para el consumidor que la tele. Está flotando en el aire la idea que en la tele hay cosas que se pueden hacer y cosas que no (aunque es de terror) y el producto puede estar en tela de juicio del consumidor. Internet no. Es tierra de nadie.</p>
<p><img class="alignleft size-full wp-image-323" title="control_de_edad" src="http://cabezaderaton.com.ar/wp-content/uploads/2009/06/control_de_edad1.png" alt="control_de_edad" width="200" height="141" />No estoy en contra de publicar este tipo de material, y uno es consciente que tampoco se puede controlar. Lo que me da por las pelotas es la grasa que chorrea este tipo de sitio, con nombre y apellido, que acuden a una gorda garchando (la escena es morbosamente asquerosa) para levantar las visitas y así promocionarlo con el único control que es casi tan berreta como el video mismo. Una verdadera porquería.</p>
<p>Todo bien, que cada quien haga de su culo un colectivo y deje subir a quien quiera.</p>
<p>No hay mejor momento para invocar una de las frases más repetidas entre personas entre 25 y 35 años: Me estaré volviendo viejo.</p>
]]></content:encoded>
			<wfw:commentRss>http://cabezaderaton.com.ar/me-estare-volviendo-viejo-con-mal-gusto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
