<?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>Javascript y PHP: recursos y explicaciones - por IUGO &#187; Programación</title>
	<atom:link href="http://www.iugo.com.uy/blog/index.php/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iugo.com.uy/blog</link>
	<description>PHP y JavaScript claro y sencillo, por IUGO software &#38; design studio</description>
	<lastBuildDate>Thu, 17 Nov 2011 20:49:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Ventanas modales con jQuery, de manera simple</title>
		<link>http://www.iugo.com.uy/blog/index.php/ventanas-modales-con-jquery-de-manera-simple/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/ventanas-modales-con-jquery-de-manera-simple/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 00:20:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Iugo]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=375</guid>
		<description><![CDATA[Reveal es un plugin para jQuery que permite implementar ventanas modales elegantes de manera muy sencilla. Las ventanas modales pueden ser customizadas si se desea, aunque el diseño por defecto es muy bueno. El plugin es compatible con todos los navegadores modernos, y muy liviano (1.75 KB).]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><a href="http://www.iugo.com.uy/blog/wp-content/uploads/2011/02/modal.png"><img class="size-full wp-image-376 aligncenter" style="margin-top: 5px; margin-bottom: 5px;" title="modal" src="http://www.iugo.com.uy/blog/wp-content/uploads/2011/02/modal.png" alt="" width="400" height="166" /></a></p>
<p><a href="http://www.zurb.com/playground/reveal-modal-plugin"> Reveal</a> es un plugin para jQuery que permite implementar ventanas modales elegantes de manera muy sencilla.</p>
<p style="text-align: left;">Las ventanas modales pueden ser customizadas si se desea, aunque el diseño por defecto es muy bueno. El plugin es compatible con todos los navegadores modernos, y muy liviano (1.75 KB).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/ventanas-modales-con-jquery-de-manera-simple/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selección de un framework para PHP</title>
		<link>http://www.iugo.com.uy/blog/index.php/seleccion-de-un-framework-para-php/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/seleccion-de-un-framework-para-php/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 13:21:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[Iugo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=330</guid>
		<description><![CDATA[En nuestra empresa utilizamos, para desarrollar en PHP, dos frameworks que hemos desarrollado internamente. Uno de ellos es un framework diseñado en capas, con el clásico diseño de 3 capas: presentación, logica y acceso a datos. El segundo framework utiliza el patrón MVC, y tiene incorporada las funcionalidades básicas: autenticación, logging, manejo de sesiones, purificación [...]]]></description>
			<content:encoded><![CDATA[<p>En nuestra empresa utilizamos, para desarrollar en PHP, dos frameworks que hemos desarrollado internamente. Uno de ellos es un framework diseñado en capas, con el clásico diseño de 3 capas: presentación, logica y acceso a datos. El segundo framework utiliza el patrón MVC, y tiene incorporada las funcionalidades básicas: autenticación, logging, manejo de sesiones, purificación de datos ingresados por el  usuario.<br />
<span id="more-330"></span></p>
<p>Sin embargo, tal vez sea mejor utilizar uno de los tantos frameworks MVC de PHP que se encuentran disponibles para elegir: CakePHP, Symfony, CodeIgniter, Kohana, Zend, Yii, Lithium, etc. Despues de todo, dichos frameworks traen incoporadas más funcionalidades y deberían ser mucho más seguros, ya que son usados por  miles de personas y por lo tanto están muy bien testeados.</p>
<p>Ventajas de utilizar un framework desarrollado internamente:</p>
<ul>
<li>lo conocemos a la perfección</li>
<li>podemos modificarlo fácilemente para agregar funcionalidades a medida que son necesarias</li>
<li>no está sobrecargado con  funcionalidades que raramente utilizamos</li>
</ul>
<p>Ventajas de utilizar uno de los frameworks disponibles para PHP:</p>
<ul>
<li>mejor testeado, menos bugs y más seguridad</li>
<li>más funcionalidades disponibles, por ej: I18N, Caching, ORM, etc</li>
<li>utilizar convenciones y técnicas probadas</li>
</ul>
<p>Es por eso que nos hemos  embarcado en la tarea de probar y decidir si es que alguno de dichos frameworks es más conveniente que utilizar el nuestro.Lo cual ha resultado una tarea bastante complicada.</p>
<p>Lo primero que hicimos fue leer descripciones y reviews de los frameworks más conocidos, buscando en StackOverflow, en phpframeworks.com, etc. Lamentablemente, no es posible decidirse por un framework basándose sólo en la documentación y reviews, es necesario utilizarlo en un proyecto de la vida real para saber realmente que tan bueno resulta ser. Utilizamos todo lo que leimos para acotar la búsqueda a dos frameworks: <a href="http://www.yiiframework.com/">Yii</a> y <a href="http://cakephp.org">CakePHP</a></p>
<p>En siguientes posts iremos publicando nuestras experiencias.</p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-9655719705705223";
/* Blog IUGO II */
google_ad_slot = "4068642316";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/seleccion-de-un-framework-para-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gráficas con OpenFlashChart 2 y CakePHP</title>
		<link>http://www.iugo.com.uy/blog/index.php/graficas-con-openflashchart-2-y-cakephp/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/graficas-con-openflashchart-2-y-cakephp/#comments</comments>
		<pubDate>Thu, 20 May 2010 13:11:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[Iugo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=325</guid>
		<description><![CDATA[En varias oportunidades nos hemos encontrado con el requerimiento de incorporar gráficas en nuestras aplicaciones creadas con CakePHP. Una de las formas más sencillas que hemos encontrado, es combinar Open Flash Chart 2.0 y CakePHP. Sin embargo, hemos encontrado que el Helper disponible en el sitio oficial de CakePHP tiene algunos errores (por ej. el [...]]]></description>
			<content:encoded><![CDATA[<p>En varias oportunidades nos hemos encontrado con el requerimiento de incorporar gráficas en nuestras aplicaciones creadas con CakePHP. Una de las formas más sencillas que hemos encontrado, es combinar <a href="http://teethgrinder.co.uk/open-flash-chart-2">Open Flash Chart 2.0</a> y CakePHP. Sin embargo, hemos encontrado que el Helper <a href="http://bakery.cakephp.org/articles/view/flashcharthelper-version-3">disponible en el sitio oficial de CakePHP</a> tiene algunos errores (por ej. el gráfico de barras horizontal no está soportado por el helper)</p>
<p>Supongamos que tenemos una lista de gastos por fecha y queremos mostrar un gráfico de línea representando el gasto en función del tiempo:<br />

<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-9655719705705223";
/* Blog IUGO II */
google_ad_slot = "4068642316";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
<br />
<span id="more-325"></span><br />
<code><br />
begin();<br />
$max = 0;<br />
foreach ($gastos as $key =&gt; $model){<br />
if ($gastos[$key]['Expense']['monto'] &gt; $max) $max = $gastos[$key]['Expense']['monto'];<br />
$gastos[$key]['Expense']['fecha'] = $time-&gt;format('M',$gastos[$key]['Expense']['fecha']);<br />
}<br />
$max+=200;<br />
$step = 100;</code></p>
<p><code> </code></p>
<p><code> $flashChart-&gt;setTitle('Gastos totales x rubro','{font-size:14px;}');<br />
$flashChart-&gt;setData($gastos,'/Expense/monto','{n}.Expense.fecha','Gastos','dig');<br />
$flashChart-&gt;axis('y',array('range' =&gt; array(0,$max,$step)));<br />
$flashChart-&gt;axis('x');<br />
echo $flashChart-&gt;chart('area_line',array('colour'=&gt;'#3399AA'),'Gastos','dig');<br />
echo $flashChart-&gt;render(450,250,'dig');<br />
?&gt;</code></p>
<p>El método setData recibe el DataSet, una expresión xpath para indicar cuáles son los valores a graficar, otra expresión xpath para indicar las etiquetas en el eje de las x para esos valores, un nombre para el gráfico y un id de gráfico (de esta forma pueden superponerse varios gráficos en uno).</p>
<p>Es importante destacar que en el ejemplo del código del helper se muestra que la expresión xpath para determinar las etiquetas debería ser &#8220;<em>default.{n}.Day.date</em>&#8220;, pero revisando el código nos dimos cuenta que para que funcione no debe incluirse el nodo &#8220;<em>default&#8221;.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/graficas-con-openflashchart-2-y-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuevo proyecto de nuestra empresa: dameprecios.com</title>
		<link>http://www.iugo.com.uy/blog/index.php/nuevo-proyecto-de-nuestra-empresa-dameprecios-com/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/nuevo-proyecto-de-nuestra-empresa-dameprecios-com/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 01:48:48 +0000</pubDate>
		<dc:creator>gonzalo</dc:creator>
				<category><![CDATA[emprendimientos]]></category>
		<category><![CDATA[Iugo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[startups]]></category>
		<category><![CDATA[TI]]></category>
		<category><![CDATA[uruguay]]></category>
		<category><![CDATA[proyecto]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=317</guid>
		<description><![CDATA[dameprecios.com es el último proyecto publicado por nuestra empresa. Se trata de un portal para comparar precios de productos en diversas tiendas.]]></description>
			<content:encoded><![CDATA[<p>En todo el mundo, principalmente en Europa son muy usados los llamados &#8220;Shopping Engines&#8221;. Se trata de motores de búsqueda que almacenan miles de productos en diversas tienas, y que les permiten a los usuarios <a title="dameprecios.com" href="http://uy.dameprecios.com" target="_blank">comparar precios de cualquier producto</a>, para elegir donde es el mejor lugar para comprar.</p>
<p>Para mantener los precios siempre actualizados, las tiendas proveen al sitio encargado de comprar los precios de un archivo de texto con la información de sus productos, los precios, la descripción, etc. Diariamente el sitio web analiza estos archivos y actualiza su base de datos.</p>
<p>De esa manera funciona <a title="dameprecios.com" href="http://uy.dameprecios.com" target="_blank">dameprecios.com, el portal de comparación de precios uruguayo</a> que acaba de publicar nuestra empresa.</p>
<p><span id="more-317"></span></p>
<p>Se trata de un proyecto muy ambicioso que implica imponer en el usuario de internet de Uruguay una nueva costumbre, un nuevo concepto y de incorporar un nuevo uso para internet, que tanto en Uruguay como en toda Amerérica Latina, no ha sido 100% explotada.</p>
<div class="wp-caption aligncenter" style="width: 374px"><a href="http://uy.dameprecios.com"><img title="dameprecios.com: portal de comparación de precios" src="http://www.iugo.com.uy/iugo/pics/novedades/dameprecios.png" alt="" width="364" height="307" /></a><p class="wp-caption-text">dameprecios.com: portal de comparación de precios</p></div>
<p style="text-align: center;">
<p>Por el momento, y por estar el proyecto aún en desarrollo, no hemos suscripto una gran cantidad de tiendas, pero poco a poco iremos sumando los principales comercios de Montevideo<!--more--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/nuevo-proyecto-de-nuestra-empresa-dameprecios-com/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Magento &#8211; No puedo entrar al admin: SOLUCIONADO!</title>
		<link>http://www.iugo.com.uy/blog/index.php/magento-no-puedo-entrar-al-admin-solucionado/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/magento-no-puedo-entrar-al-admin-solucionado/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 23:42:32 +0000</pubDate>
		<dc:creator>gonzalo</dc:creator>
				<category><![CDATA[Iugo]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[localhost]]></category>
		<category><![CDATA[login]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=291</guid>
		<description><![CDATA[Tras haber probado y usado varios sistemas para tiendas online, sin dudas no podía dejar pasar mas tiempo sin probar Magento. Asi que me decidí, descargué la última versión estable y lo instalé localmente en mi notebook. De esa manera puedo probarlo, ver que posibilidades ofrece y cuáles son las principales complicaciones para personalizarlo. A [...]]]></description>
			<content:encoded><![CDATA[<p>Tras haber probado y usado varios sistemas para tiendas online, sin dudas no podía dejar pasar mas tiempo sin probar Magento. Asi que me decidí, descargué la última versión estable y lo instalé localmente en mi notebook. De esa manera puedo probarlo, ver que posibilidades ofrece y cuáles son las principales complicaciones para personalizarlo.</p>
<p>A decir verdad, Magento es muy interesante, así que tras instalarlo ya comenzé a trabajar en la nueva versión de una tienda online, para un cliente. Sin lugar a dudas es muy superior a todas las demás opciones (al menos las que yo conozco) por lo que sin pensarlo mucho tiempo, opté por usarlo para una tienda virtual que estaba comenzando a desarrollar.</p>
<p>El primer problema con el que me encontré, al instalarlo en mi servidor local (localhost) fue que no me permitía ingresar al admin. En un principio pensé que estaba ingresando mal la contraseña (en el proceso de instalación te permite elegir el usuario y contraseña para el primer administrador del sitio). Pero luego me di cuenta que cuando tipeaba mal el usuario o la contraseña me daba un mensaje de error, mientras que cuando la tipeaba bien, simplemente volvía a la pantalla de login sin mostrarme ningún error.<br />
<span id="more-291"></span><br />
Tras googlear un rato, encontré la solución (tomando información de distintos lugares) por lo que pensé que podría ser útil publicar aquí un resumen.</p>
<p>El problema parece darse en algunos navegadores (Firefox es el que uso yo) y se da porque no reconoce el dominio &#8220;localhost&#8221; como un dominio seguro. Una opción es cambiar la ruta de nuestro sitio, y en lugar de usar http://localhost/mitienda/admin usar http://127.0.0.1/mitienda/admin (127.0.0.1 es la IP para localhost). Eso puede cambiarse sencillamente desde el panel de administración, pero para ello, obviamente, tenemos que poder ingresar antes. Para cambiarlo sin ingresar al panel de administración tenemos que ejecutar una query en la base de datos MySQL, usando por ejemplo phpmyadmin.</p>
<p>La consulta que debemos ejecutar es la siguiente:<br />
<code>UPDATE core_config_data SET value="http://127.0.0.1/mitienda" WHERE path IN ('web/unsecure/base_url','web/secure/base_url') ;</code><br />
(hay que cambiar &#8220;mitienda&#8221; por el nombre de la carpeta donde estemos guardando la instalación de Magento en el servidor local).</p>
<p>Luego probamos de entrar al admin por &#8220;http://127.0.0.1/mitienda/admin&#8221;. Eso debería funcionar, y tiene como ventaja que si copiamos la instalación a otro servidor, solamente ejecutando de nuevo esta consulta cambiando el value por el valor correcto vamos a poder usar la tienda tal como la teníamos en localhost.</p>
<p>Esa es sin dudas la mejor opción, ya que no tenemos que cambiar nada de código, pero acá les dejo otra forma, por si la anterior no funcionó&#8230;</p>
<p>Esta opción implica retocar el código de uno de los archivos del core de Magento, por lo que no es ideal y puede sobreescribrse en algún momento (por ej., al actualizar Magento). El archivo que tenemos que modificar es el siguiente:</p>
<p>mitienda/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php</p>
<p>y en ese archivo tenemos que modificar las siguientes líneas:<br />
<code><br />
// set session cookie params<br />
session_set_cookie_params(<br />
$this-&gt;getCookie()-&gt;getLifetime(),<br />
$this-&gt;getCookie()-&gt;getPath(),<br />
$this-&gt;getCookie()-&gt;getDomain(),<br />
$this-&gt;getCookie()-&gt;isSecure(),<br />
$this-&gt;getCookie()-&gt;getHttponly()<br />
);<br />
</code><br />
<strong>y dejarlas así:</strong><br />
<code><br />
// set session cookie params<br />
session_set_cookie_params(<br />
$this-&gt;getCookie()-&gt;getLifetime(),<br />
$this-&gt;getCookie()-&gt;getPath()//,<br />
//$this-&gt;getCookie()-&gt;getDomain(),<br />
//$this-&gt;getCookie()-&gt;isSecure(),<br />
//$this-&gt;getCookie()-&gt;getHttponly()<br />
);<br />
</code></p>
<p>Guardamos ese archivo y probamos nuevamente. Ahora si debería funcionar, pero tenemos que recordar que este cambio que hicimos, una vez que nuestra tienda es &#8220;mudada&#8221; a un servidor en internet bajo un dominio real (y por tanto, seguro para todos los navegadores) debemos deshacerlo y volver el archivo a su estado original.</p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-9655719705705223";
/* Blog IUGO II */
google_ad_slot = "4068642316";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/magento-no-puedo-entrar-al-admin-solucionado/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Autocompletar con jQuery</title>
		<link>http://www.iugo.com.uy/blog/index.php/autocompletar-con-jquery/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/autocompletar-con-jquery/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 15:08:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Iugo]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=271</guid>
		<description><![CDATA[En este mini tutorial veremos como utilizar un excelente plugin de jQuery para implementar la funcionalidad de autocompletar (suggest). Nosotros lo hemos utilizado para taggear, sugiriendo al usuario los tags existentes en el sistema, pero hay muchas más aplicaciones: en buscadores, ingreso de datos, etc. El plugin que utilizamos fue Autocomplete (que va a pasar [...]]]></description>
			<content:encoded><![CDATA[<p>En este mini tutorial veremos como utilizar un excelente <strong>plugin de jQuery</strong> para implementar la funcionalidad de <strong>autocompletar </strong>(suggest). Nosotros lo hemos utilizado para taggear, sugiriendo al usuario los tags existentes en el sistema, pero hay muchas más aplicaciones: en buscadores, ingreso de datos, etc.<br />
<span id="more-271"></span><br />
El plugin que utilizamos fue <a title="jquery plugin autocomplete" href="http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/" target="_blank">Autocomplete</a> (que va a pasar a formar parte de <a href="http://bassistance.de/2009/04/22/contributing-to-jquery-ui-autocomplete/" target="_blank">jQuery UI</a>).   Este plugin convierte un input o área de texto en autocompletable, y puede obtener los datos remotamente utilizando AJAX o localmente desde un array. En caso de que los datos sean pocos, lo recomendable es utilizar un array local, pero si ya se está en el orden de los cientos, lo mejor será utilizar AJAX para obtener los datos buscando desde por ej. la base de datos.</p>
<p>Inicializamos el plugin:<br />
<code><br />
$().ready(function(){<br />
$("#tags").autocomplete('buscar_tags.php',<br />
{ multiple: true,<br />
autoFill: true,<br />
selectFirst: true,<br />
formatItem: formatItem,<br />
formatResult: formatResult } );<br />
});</code></p>
<p>function formatItem(row) {<br />
return row[0] + &#8221; (&#8221; + row[1] + &#8220;)&#8221;;<br />
}</p>
<p>function formatResult(row) {<br />
return row[0];<br />
}</p>
<p>En donde:  multiple = true permite ingresar más de un valor autocompletado,  <code>autoFill: </code>completa la palabara para poder seleccionarla presionando enter o tab,  selectFirst hace que la primera sugerencia sea seleccionada si no se presiona enter o tab o se selecciona algo utilizando el puntero, formatItem es una función que permite formatear como se muestra cada item mientras que formatResult es una función que permite formatear cómo se muestra una vez seleccionado un ítem.<br />
Otras posibilidades son:</p>
<ul>
<li>max: limitar la cantidad máxima de ítems</li>
<li>minChars: mínima cantidad de caracteres que debe escribir el usuario para que se active el autocompletar</li>
<li>etc</li>
</ul>
<p>Cuando implementemos el código de buscar_tags.php, obtendremos en el parmámetro q del querystring el valor ingresado por el usuario. Por ejemplo, si el usuario ingresa &#8220;foo&#8221; se generará un request de tipo:  buscar_tags.php?q=foo&amp;limit=10, donde limit tendrá el valor de la opción &#8220;max&#8221;.  EL script buscar_tags.php deberá retoranar el resultado un ítem por renglón. Para el ejemplo de <em>formatItem </em>anterior podría ser:<br />
<code><br />
foreach($resultados as $resultado) {<br />
echo $</code><code>resultado</code><code>[0], "|", $</code><code>resultado</code><code>[1], "\n";<br />
}<br />
</code></p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-9655719705705223";
/* Blog IUGO II */
google_ad_slot = "4068642316";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/autocompletar-con-jquery/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Subir archivos con CakePHP y jQuery</title>
		<link>http://www.iugo.com.uy/blog/index.php/subir-archivos-con-cakephp-y-jquery/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/subir-archivos-con-cakephp-y-jquery/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 01:49:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=256</guid>
		<description><![CDATA[En este turorial veremos como se puede implementar la carga de archivos utilizando CakePHP y jQuery. 1. CakePHP. Carga de archivos Utilizando los consejos publicados en este post, implementaremos la lógica PHP para subir archivos al servidor. El siguiente método toma el nombre del directorio en el servidor al cual se quieren subir los archivos, [...]]]></description>
			<content:encoded><![CDATA[<p>En este turorial veremos como se puede implementar la carga de archivos utilizando CakePHP y jQuery.</p>
<p>1. <strong>CakePHP. Carga de archivos</strong><br />
Utilizando los consejos publicados en <a href="http://www.jamesfairhurst.co.uk/posts/view/uploading_files_and_images_with_cakephp">este post,</a> implementaremos la lógica PHP para subir archivos al servidor. El siguiente método toma el nombre del directorio en el servidor al cual se quieren subir los archivos, el array de archivos del formulario y un identificador opcional en caso que se desee crear un subdirectorio en donde guardar el archivo.<br />
<span id="more-256"></span></p>
<blockquote><p><code> </code></p>
<pre>/**
* uploads files to the server
* @params:
*		$folder 	= the folder to upload the files e.g. 'img/files'
*		$formdata 	= the array containing the form files
*		$itemId 	= id of the item (optional) will create a new sub folder
* @return:
*		will return an array with the success of each file upload
*/
function uploadFiles($folder, $formdata, $itemId = null) {
// setup dir names absolute and relative
$folder_url = WWW_ROOT.$folder;
$rel_url = $folder;

// create the folder if it does not exist
if(!is_dir($folder_url)) {
mkdir($folder_url);
}

// if itemId is set create an item folder
if($itemId) {
// set new absolute folder
$folder_url = WWW_ROOT.$folder.'/'.$itemId;
// set new relative folder
$rel_url = $folder.'/'.$itemId;
// create directory
if(!is_dir($folder_url)) {
mkdir($folder_url);
}
}

// list of permitted file types, this is only images but documents can be added
$permitted = array('image/gif','image/jpeg','image/pjpeg','image/png');

// loop through and deal with the files
foreach($formdata as $file) {
// replace spaces with underscores
$filename = str_replace(' ', '_', $file['name']);
// assume filetype is false
$typeOK = false;
// check filetype is ok
foreach($permitted as $type) {
if($type == $file['type']) {
$typeOK = true;
break;
}
}

// if file type ok upload the file
if($typeOK) {
// switch based on error code
switch($file['error']) {
case 0:
// check filename already exists
if(!file_exists($folder_url.'/'.$filename)) {
// create full filename
$full_url = $folder_url.'/'.$filename;
$url = $rel_url.'/'.$filename;
// upload the file
$success = move_uploaded_file($file['tmp_name'], $url);
} else {
// create unique filename and upload file
ini_set('date.timezone', 'Europe/London');
$now = date('Y-m-d-His');
$full_url = $folder_url.'/'.$now.$filename;
$url = $rel_url.'/'.$now.$filename;
$success = move_uploaded_file($file['tmp_name'], $url);
}
// if upload was successful
if($success) {
// save the url of the file
$result['urls'][] = $url;
} else {
$result['errors'][] = "Error uploaded $filename. Please try again.";
}
break;
case 3:
// an error occured
$result['errors'][] = "Error uploading $filename. Please try again.";
break;
default:
// an error occured
$result['errors'][] = "System error uploading $filename. Contact webmaster.";
break;
}
} elseif($file['error'] == 4) {
// no file was selected for upload
$result['nofiles'][] = "No file Selected";
} else {
// unacceptable file type
$result['errors'][] = "$filename cannot be uploaded. Acceptable file types: gif, jpg, png.";
}
}
return $result;
}</pre>
</blockquote>
<p>Dado que lo voy a usar en varios controllers, lo agregué al AppController. Un ejemplo de cómo usarlo sería el siguiente:</p>
<p>En la vista: &lt;?php echo $form-&gt;file(&#8216;File.image&#8217;); ?&gt;<br />
En el controller:</p>
<blockquote><p><code><br />
$fileOK = $this-&gt;uploadFiles('files', $this-&gt;data['File']);<br />
// si el archivo fue subido correctamente<br />
if(array_key_exists('urls', $fileOK)) {<br />
// guardar la url en la informacion del from<br />
$this-&gt;data['Post']['image_url'] = $fileOK['urls'][0];<br />
}<br />
</code></p></blockquote>
<p>2. <strong>jQuery</strong></p>
<p>Para el frontend, usamos el plugin AjaxUpload de jQuery, disponible <a href="http://valums.com/ajax-upload/" target="_self">aquí.</a> Les recomiendo que vean los ejemplos disponibles desde esa misma página. Una vez descargado, (requerden que también necesitan jQuery), lo guardamos en la carpeta app/webroot/js. Para poder utilizarlo, no olviden incluirlo en la vista: &lt;?php $this-&gt;addScript($javascript-&gt;link(&#8216;ajaxupload&#8217;)); ?&gt;</p>
<p>Un ejemplo de código javascript para inicializar AjaxUpload es el siguiente:</p>
<blockquote>
<pre>$(document).ready(function(){
 new AjaxUpload('#att_file', {
  action: 'controller/action',
  name: 'data[Attachment][path]',
  autoSubmit: true,
  onComplete : function(file, response){
    alert('Carga Filanizada');
  },
  onChange: function(){
  }
 });
});//document ready</pre>
</blockquote>
<p>Debemos setear el action para que apuente al controllador y acción correspondiente.</p>
<p>AjaxUpload permite utilizar cualquier elemento como botón para abrir el cuadro de dialogo de seleccionar archivos. Por ejemplo, podríamos usar un div:</p>
<blockquote>
<pre>&lt;div id='att_file'&gt;Cargar Archivos&lt;/div&gt;</pre>
</blockquote>
<p>AjaxUpload utiliza un iframe oculto para cargar el archivo, por lo que no es una técnica AJAX propiamente dicha, aunque logra una experiencia de uso similar.</p>
<p>Podríamos utlizar los eventos onChange y onComplete para mostrar un mensaje de Loading. Si es necesario adjuntar más datos para ser enviados por el formulario, se puede utilizar la propiedad data.</p>
<p>Con esto tenemos todos los elementos necesarios para tener carga de archivos AJAX utilizando CakePHP.<br />

<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-9655719705705223";
/* Blog IUGO II */
google_ad_slot = "4068642316";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/subir-archivos-con-cakephp-y-jquery/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Checkboxes y Radio Buttons elegantes con jQuery/CSS</title>
		<link>http://www.iugo.com.uy/blog/index.php/checkboxes-y-radio-buttons-elegantes-con-jquerycss/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/checkboxes-y-radio-buttons-elegantes-con-jquerycss/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 15:47:30 +0000</pubDate>
		<dc:creator>gonzalo</dc:creator>
				<category><![CDATA[formularios]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=41</guid>
		<description><![CDATA[Los formularios forman parte de prácticamente todos los sitos y aplicaciones web de hoy en día.  Si bien con la ayuda de CSS simple podemos personalizarlos hasta cierto punto, siempre llega un momento en el que las queridas hojas de estilo ya no pueden ayudarnos, y debemos hecharle mano a nuestro adorado y salvador jQuery. [...]]]></description>
			<content:encoded><![CDATA[<p>Los formularios forman parte de prácticamente todos los sitos y aplicaciones web de hoy en día.  Si bien con la ayuda de CSS simple podemos personalizarlos hasta cierto punto, siempre llega un momento en el que las queridas hojas de estilo ya no pueden ayudarnos, y debemos hecharle mano a nuestro adorado y salvador jQuery.</p>
<p>
<!-- Begin Google Adsense code -->
<script type="text/javascript"><!--
google_ad_client = "pub-9655719705705223";
/* Blog IUGO II */
google_ad_slot = "4068642316";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Google Adsense code -->
 </p>
<div id="attachment_47" class="wp-caption alignleft" style="width: 419px"><a href="http://www.no-margin-for-errors.com/projects/prettyCheckboxes/"><img class="size-full wp-image-47" title="prettycheckboxes" src="http://www.iugo.com.uy/blog/wp-content/uploads/2009/02/prettycheckboxes.jpg" alt="Imágen del sitio web de prettyCheckboxes" width="409" height="205" /></a><p class="wp-caption-text">Imágen extraida del sitio web de prettyCheckboxes</p></div>
<p>En este post vamos a enfocarnos en los radio buttons y checkboxes, o &#8220;botones de opcion&#8221; y &#8220;casillas de verificación&#8221;&#8230; como nos guste llamarles.</p>
<p>He probado con varios plugins de jQuery, e incluso personalizarlos bastante, pero considero que <a href="http://www.no-margin-for-errors.com/projects/prettyCheckboxes/" target="_blank">prettyCheckboxes</a> es uno de los más sencillos de utilizar. Para incluirlo en tu diseño solo tienes que:</p>
<p>1.- Importar jQuery (por supuesto) y el archivo prettyCheckboxes.js que podrás descargar de <a href="http://www.no-margin-for-errors.com/projects/prettyCheckboxes/" target="_blank">este sitio</a> (allí encontraras ejemplos y una explicación mas detallada)</p>
<p>2.- Inicializar prettyCheckboxes (para todos los checkbox y radio buttons de la página):</p>
<pre><code>    $(document).ready(function(){
        $('input[type=checkbox],input[type=radio]').prettyCheckboxes();
    });</code></pre>
<p>O inicializarlo solo para algunos elementos de tus formularios:</p>
<pre><code>    $(document).ready(function(){
        $('input.myCheckbox').prettyCheckboxes();
    });</code></pre>
<p>Y eso es todo, ahora solo falta personalizar las imágenes (que descargas de la <a href="http://www.no-margin-for-errors.com/projects/prettyCheckboxes/" target="_blank">página de prettyCheckboxes</a> para que se vean según tu diseño.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/checkboxes-y-radio-buttons-elegantes-con-jquerycss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Árboles con jQuery parte II</title>
		<link>http://www.iugo.com.uy/blog/index.php/arboles-con-jquery-parte-ii/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/arboles-con-jquery-parte-ii/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 21:30:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=29</guid>
		<description><![CDATA[Continuando con el post anterior sobre árboles con jQuery, quería comentarles sobre jstree. Éste es un componente jQuery para generar árobles, pudiendo generarlos &#8220;on the fly&#8221; a partir de listas HTML anidadas. Algunas de sus características son: carga asincrónica, borrar, crear y editar nodos, drag and drop, themes, etc, etc. Pueden ver algunos demos en [...]]]></description>
			<content:encoded><![CDATA[<p>Continuando con el post anterior sobre <a href="http://www.iugo.com.uy/blog/?p=23">árboles con jQuery</a>, quería comentarles sobre <a href="http://www.jstree.com/">jstree</a>. Éste es un componente jQuery para generar árobles, pudiendo generarlos &#8220;on the fly&#8221; a partir de listas HTML anidadas. Algunas de sus características son: carga asincrónica, borrar, crear y editar nodos, drag and drop, themes, etc, etc.</p>
<p>Pueden ver algunos demos en <a href="http://www.jstree.com/jsTree/examples/">esta dirección</a>.</p>
<p>Es algo más complejo <a href="http://jquery.bassistance.de/treeview/demo/" target="_blank">jQuery treeView</a>, pero también bastante más versátil.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/arboles-con-jquery-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alternar colores de las filas de una tabla con jQuery</title>
		<link>http://www.iugo.com.uy/blog/index.php/alternar-colores-de-las-filas-de-una-tabla-con-jquery/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/alternar-colores-de-las-filas-de-una-tabla-con-jquery/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 12:33:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=27</guid>
		<description><![CDATA[Éste es un ejemplo contundente de la elegancia y sencillez a la que se puede llegar al utilizar jQuery como framework de desarrollo para javascript. Con sólamente dos líneas de código podemos tener las filas de nuestras tablas pintadas alternadamente y además un efecto de rollover al pasar sobre cada fila. Esto es lo que [...]]]></description>
			<content:encoded><![CDATA[<p>Éste es un ejemplo contundente de la elegancia y sencillez a la que se puede llegar al utilizar<strong> jQuery</strong> como framework de desarrollo para javascript. Con sólamente dos líneas de código podemos tener las filas de nuestras tablas pintadas alternadamente y además un efecto de rollover al pasar sobre cada fila. Esto es lo que se conoce como <strong>tabla Zebra o Zebra table</strong>.</p>
<p>El código jQuery a utilizar es el siguiente:</p>
<p><code><br />
$(".stripeMe tr").mouseover(function() {<br />
</code></p>
<blockquote><p><code>$(this).addClass("over");</code><br />
<code></code></p></blockquote>
<p><code> }).mouseout(function() {<br />
</code></p>
<blockquote><p><code>$(this).removeClass("over");</code><br />
<code></code></p></blockquote>
<p><code> });<br />
$(".stripeMe tr:even").addClass("alt");	</code></p>
<p>Las tablas a las que quieran agreagar el efecto deben tener la clase &#8220;stripMe&#8221;. Si quieren tener una fila encabezado de la tabla a la cual no se le aplique el efecto, deben utilizar <code>thead y tfoot </code>para el footer.</p>
<p>Los estilos a utilizar para pintar las filas son: <code>alt</code> y <code>over </code>. Como ven en el código, a las filas impares se le aplica el esitlo &#8220;alt&#8221; mientras que el estilo &#8220;over&#8221; es utilizado para destacar las filas cuando el mouse pasa sobre ellas.</p>
<p>Para leer más acerca de esta técnica, pueden visitar <a href="http://15daysofjquery.com/examples/zebra/" title="zebra striping made easy" target="_blank">este sitio</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/alternar-colores-de-las-filas-de-una-tabla-con-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

