<?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</title>
	<atom:link href="http://www.iugo.com.uy/blog/index.php/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>Tue, 09 Mar 2010 14:17:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Autocompletar con jQuery &#8211; otro tutorial</title>
		<link>http://www.iugo.com.uy/blog/index.php/autocompletar-con-jquery-otro-tutorial/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/autocompletar-con-jquery-otro-tutorial/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 14:14:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Iugo]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=303</guid>
		<description><![CDATA[En un artículo anterior describíamos cómo utilizar el plugin Autocomplete de jQuery para implementar un campo de texto con sugerencias. En esta ocasión usaremos el plugín (también de jQuery) FlexBox.  Este plugin puede ser usado como combobox o textbox con autocompletado. Además, puede paginar la lista de resultados y definir un template HTML para mostrar [...]]]></description>
			<content:encoded><![CDATA[<p>En un <a href="http://www.iugo.com.uy/blog/index.php/autocompletar-con-jquery/">artículo anterior</a> describíamos cómo utilizar el plugin <a title="jquery plugin autocomplete" href="http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/" target="_blank">Autocomplete</a> de jQuery para implementar un campo de texto con sugerencias. En esta ocasión usaremos el plugín (también de jQuery) <a href="http://www.codeplex.com/flexbox">FlexBox</a>.  Este plugin puede ser usado como combobox o textbox con autocompletado. Además, puede paginar la lista de resultados y definir un template HTML para mostrar cada ítem de la lista.</p>
<p><img class="aligncenter" title="Ejemplo de Flexbox" src="http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=flexbox&amp;DownloadId=48590" alt="" width="406" height="261" /></p>
<p>Las instrucciones para descargar e instalarlo se encuentran <a href="http://www.fairwaytech.com/Technology/FlexBox.aspx">aquí</a>. Una vez descargados todos los archivos, se debe incluir el css y js para poder utilizarlos (recordar incluir también jquery):<br />
<code><br />
&lt;script src="ruta/a/jquery.flexbox.min.js" type="text/javascript"&gt;</code></p>
<p><code>&lt;link type="text/css" rel="stylesheet" href="ruta/a/jquery.flexbox.css" mce_href="path/to/jquery.flexbox.css" /&gt;</code></p>
<p>Veamos un ejemplo:<span id="more-303"></span></p>
<p>Tenemos que crear un DIV, el cual va a ser convertido en el cuadro de texto con autocompletar:<br />
<code><br />
&lt;div id="fb"&gt;&lt;/div&gt;</code></p>
<p>Luego, insertamos el código JavaScript:</p>
<p style="padding-left: 30px;"><code>$(document).ready(function () {<br />
$('#fb').flexbox('resultados.php', {<br />
watermark: 'Seleccione una elemento',<br />
noResultsText: 'No hay resultados',<br />
method : 'POST',<br />
paging: {<br />
pageSize: 15</code><br />
}</p>
<p style="padding-left: 30px;"><code>});<br />
});</code></p>
<p>El script resultados.php debe retornar un string JSON, con el siguiente formato:<br />
<code><br />
{"results":[<br />
{"id":1,"name":"Hormiga"},<br />
{"id":2,"name":"Oso"},<br />
{...} // los demás resultados aquí<br />
]}</code></p>
<p>El &#8220;id&#8221; es un entero o un string identificando al elemento y es el valor que es enviado cuando el formulario el enviado.<br />
El &#8220;name&#8221;  es un entero o un string que es mostrado para cada elemento.</p>
<p>En el siguiente post mostraremos algunas otras opciones que brinda este plugin.
<!-- 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-otro-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</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[Programación]]></category>
		<category><![CDATA[php]]></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 decir [...]]]></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>1</slash:comments>
		</item>
		<item>
		<title>Galería de imágenes en Wordpress con jQuery</title>
		<link>http://www.iugo.com.uy/blog/index.php/galeria-de-imagenes-en-wordpress-con-jquery/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/galeria-de-imagenes-en-wordpress-con-jquery/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 18:35:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Iugo]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=283</guid>
		<description><![CDATA[Hay una infinidad de plugins de Wordpress para la generación de galerías de imágenes, pero ninguna cumplía con el requisito de que fuera sencilla de utilizar desde el panel de administración y que no utilizara el efecto lightbox. El funcionamiento debía ser el siguiente: se muestran todas las imágenes en una serie de miniaturas y [...]]]></description>
			<content:encoded><![CDATA[<p>Hay una infinidad de plugins de Wordpress para la generación de galerías de imágenes, pero ninguna cumplía con el requisito de que fuera sencilla de utilizar desde el panel de administración y que no utilizara el efecto lightbox. El funcionamiento debía ser el siguiente: se muestran todas las imágenes en una serie de miniaturas y cuando el usuario hace clic en una miniatura ésta se muestra en grande en la misma página (<a href="http://www.twospy.com/galleriffic/advanced.html">por ejemplo</a>). Luego de buscar un rato, encontré un excelente plug-in de jQuery: <a href="http://www.twospy.com/galleriffic/">Galleriffic</a>.<br />
<span id="more-283"></span><br />
Juntando las ideas que encontré <a href="http://wphackr.com/get-images-attached-to-post/">aquí</a> para extraer las imágenes asociadas a un post en Wordpress, logré armar lo que estaba buscando:</p>
<p>1. Si un post está categorizado bajo la categoría &#8220;Galerías&#8221;, entonces se mostrará una galería de imágenes con todas las imágenes asociadas al post</p>
<p>2. En single.php de Wordpress, utilizamos la función publicada en el sitio que comenté anteriormente para crear un lista de thumbnails de las imágenes</p>
<p>3. Con la ayuda de Galleriffic, instanciamos la galería de fotos.</p>
<p>En subsiguientes artículos explicaremos con más detalle el código necesario para cada uno de los pasos.</p>
<p>Hasta la próxima!</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/galeria-de-imagenes-en-wordpress-con-jquery/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Finalmente! PHP 5.3.0 confirmado para el 30 de Junio</title>
		<link>http://www.iugo.com.uy/blog/index.php/finalmente-php-5-3-0-confirmado-para-el-30-de-junio/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/finalmente-php-5-3-0-confirmado-para-el-30-de-junio/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 19:55:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Iugo]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=280</guid>
		<description><![CDATA[Se anunció en php.internals que la nueva versión de PHP (5.3.0) saldrá el próximo martes 30 de Junio.  Alguna de las muy importantes funcionalidades son:

namespaces (al fin!)
funciones lamda y clausuras
archivos Phar, para poder crear un único archivo (ala JAR en Java) con todo lo necesario para correr la aplicación
driver nativo para MySql

Ahora tenemos que empezar [...]]]></description>
			<content:encoded><![CDATA[<p>Se anunció en <a href="http://news.php.net/php.internals/44454 qu">php.internals</a> que la nueva versión de PHP (5.3.0) saldrá el próximo martes 30 de Junio.  Alguna de las muy importantes funcionalidades son:</p>
<ul>
<li>namespaces (al fin!)</li>
<li>funciones lamda y clausuras</li>
<li>archivos Phar, para poder crear un único archivo (ala JAR en Java) con todo lo necesario para correr la aplicación</li>
<li>driver nativo para MySql</li>
</ul>
<p>Ahora tenemos que empezar a pedir a las empresas de hosting que actualicen las versiones!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/finalmente-php-5-3-0-confirmado-para-el-30-de-junio/feed/</wfw:commentRss>
		<slash:comments>0</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[Programación]]></category>
		<category><![CDATA[jQuery]]></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 a [...]]]></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>7</slash:comments>
		</item>
		<item>
		<title>Nuevo theme para el blog</title>
		<link>http://www.iugo.com.uy/blog/index.php/nuevo-theme-para-el-blog/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/nuevo-theme-para-el-blog/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 13:08:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Iugo]]></category>
		<category><![CDATA[themes]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/index.php/nuevo-theme-para-el-blog/</guid>
		<description><![CDATA[Estamos estrenando theme en el blog. Es un diseño para Wordpress realizado a medida por nosotros y que busca integrarse al nuevo diseño de nuestro sitio web (que estaremos habilitando la próxima semana). Esperemos que les guste!
]]></description>
			<content:encoded><![CDATA[<p>Estamos estrenando theme en el blog. Es un diseño para Wordpress realizado a medida por <a href="http://www.iugo.com.uy" target="_blank">nosotros</a> y que busca integrarse al nuevo diseño de nuestro sitio web (que estaremos habilitando la próxima semana). Esperemos que les guste!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.iugo.com.uy/blog/index.php/nuevo-theme-para-el-blog/feed/</wfw:commentRss>
		<slash:comments>0</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[Javascript]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[php]]></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, el array [...]]]></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>Recursos para desarrolladores y diseñadores web</title>
		<link>http://www.iugo.com.uy/blog/index.php/recursos-para-desarrolladores-y-disenadores-web/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/recursos-para-desarrolladores-y-disenadores-web/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 20:32:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[diseño]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=52</guid>
		<description><![CDATA[Navegando por ahí me topé con este excelente compliado de recursos para diseñadores y desarrolladores web.  Se pueden encontrar enlaces a sitios para generar favicons, gráficos de loading, frameworks css, íconos gratuitos, un montón de widgets para jQuery, etc, etc. Recomendado.








]]></description>
			<content:encoded><![CDATA[<p>Navegando por ahí me topé con <a href="http://elementiks.com/web_resources.php" target="_blank">este excelente compliado</a> de recursos para diseñadores y desarrolladores web.  Se pueden encontrar enlaces a sitios para generar favicons, gráficos de loading, frameworks css, íconos gratuitos, un montón de widgets para jQuery, etc, etc. Recomendado.<br />
<br /><span id="more-52"></span><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/recursos-para-desarrolladores-y-disenadores-web/feed/</wfw:commentRss>
		<slash:comments>0</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[Javascript]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[formularios]]></category>
		<category><![CDATA[jQuery]]></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.







 
En [...]]]></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>FlexiGrid para jQuery: grilla con todo el poder ajax</title>
		<link>http://www.iugo.com.uy/blog/index.php/flexigrid-para-jquery-grilla-con-todo-el-poder-ajax/</link>
		<comments>http://www.iugo.com.uy/blog/index.php/flexigrid-para-jquery-grilla-con-todo-el-poder-ajax/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 23:50:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.iugo.com.uy/blog/?p=32</guid>
		<description><![CDATA[Durante un tiempo usé Ext para desarrollo en Javascript, y una de sus grandes ventajas es la gran cantidad de componentes y widgets disponibles. Uno de los que usaba seguidamente era la grilla o grid, con posibilidad de paginado, ordenar columnas, etc.
jQuery también dispone de una muy buena grilla, llamada FlexiGrid. Brinda todo lo que [...]]]></description>
			<content:encoded><![CDATA[<p>Durante un tiempo usé Ext para desarrollo en Javascript, y una de sus grandes ventajas es la gran cantidad de componentes y widgets disponibles. Uno de los que usaba seguidamente era la grilla o grid, con posibilidad de paginado, ordenar columnas, etc.</p>
<p>jQuery también dispone de una muy buena grilla, <span id="more-32"></span>llamada <a href="http://code.google.com/p/flexigrid/" target="_blank">FlexiGrid</a>. Brinda todo lo que esperamos: resize de columnas, ordernar cada columna, puede cargar los datos por ajax usando XML o JSON, paginado, buscador, etc. Admás tiene un diseño muy atractivo y es muy liviana, que es uno de sus objetivos principales y lo que lo diferencia de Ext Grid.<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/flexigrid-para-jquery-grilla-con-todo-el-poder-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
