<?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>Facilitant la web</title>
	<atom:link href="http://blog.facilitant.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.facilitant.net</link>
	<description>Recursos, consells i reflexions sobre el món de la web</description>
	<lastBuildDate>Tue, 02 Mar 2010 11:10:57 +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>Reflexions de la primera DrupalcampSpain</title>
		<link>http://blog.facilitant.net/2010/03/02/reflexions-de-la-primera-drupalcampspain/</link>
		<comments>http://blog.facilitant.net/2010/03/02/reflexions-de-la-primera-drupalcampspain/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 11:10:57 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Conferències]]></category>
		<category><![CDATA[conferències]]></category>
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=216</guid>
		<description><![CDATA[Aquest cap de setmana passat fou la primera DrupalcampSpain, i tal i com va dir el meu amic Robert:
Ha estat la millor DrupalcampSpain que s&#8217;ha fet fins ara.
Bromes a part, han estat uns dies intensos, plens de conferències, xerrades informals entre passadissos, plens de networking i en definitiva, plens de gom a gom de Drupal. [...]]]></description>
			<content:encoded><![CDATA[<p>Aquest cap de setmana passat fou la primera <a hreflang="es" href="http://drupalcamp.es">DrupalcampSpain</a>, i tal i com va dir el meu amic <a href="http://garrigos.cat">Robert</a>:</p>
<blockquote><p>Ha estat la millor DrupalcampSpain que s&#8217;ha fet fins ara.</p></blockquote>
<p>Bromes a part, han estat uns dies intensos, plens de conferències, xerrades informals entre passadissos, plens de networking i en definitiva, plens de gom a gom de <a hreflang="en" href="http://drupal.org">Drupal</a>. Al final l&#8217;assistència fou tot un èxit (es calculen unes 375 persones vingudes de tot el món, encara que principalment de l&#8217;estat o més específicament, del país) i la qualitat de les xerrades fou força bona.</p>
<p>Tot seguit faig un petit resum del meu pas durant els tres dies:</p>
<h3>Divendres 26 &#8211; Presentació i primeres xerrades</h3>
<p>Només arribar al Citilab, i fer el registre, ja et donaven una bossa plena fins dalt de merxandatge, una samarreta de la Drupalcamp, una enganxina i un programa dels tres dies (amb això ja vaig preveure que la cosa anava en serio). Després de fer les primeres xerrades amb en <a href="http://garrigos.cat">Robert</a>, en <a hreflang="es" href="http://cambrico.net">Pedro</a>, en Conrad i en Jaume, i de menjar una mica, vaig entrar a l&#8217;auditori per veure la sessió inaugural: tot un espectacle que donava a entendre que allò seria una cosa gran!</p>
<p>Després d&#8217;això, tocà anar a la sessió anomenada &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/spacescontextfeaturespurl-que-es-y-como-se-come">Spaces/Context/Features/Purl.  Qué es y cómo se come?</a>&#8220;: una exposició força interessant de què són aquests 4 mòduls i on vaig veure que algun d&#8217;aquests era precisament el que jo estava buscant des de feia molt de temps.</p>
<p>Tot seguit, a la mateixa sala em vaig quedar a escoltar la sessió &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/unit-testing-integration-testing-implementacion-en-drupal"><span lang="en" xml:lang="en">Unit  testing &amp; Integration testing</span>. Implementación en Drupal</a>&#8221; on s&#8217;explicà una mica el tema de tests però no pas com jo m&#8217;esperava ni al nivell que es preveia. Tot i així, alguna cosa en vaig treure de bo i ho tinc apuntat com un tema a estudiar en breu.</p>
<p>Una vegada acabada la sessió, cap a casa que al dia següent tocava una jornada llarga.</p>
<h3>Dissabte 27 &#8211; El dia llarg</h3>
<p>Dissabte fou el dia estrella de la Drupalcamp: 21 conferències programades, desenes de xerrades informals improvisades, la fira de treball i el sopar de la nit.</p>
<p>A primera hora, i només arribar, tocà la sessió &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/ecommerce-para-drupal-introduccion-ubercart">Ecommerce  para Drupal: Introducción a Ubercart</a>&#8221; d&#8217;en <a href="http://cambrico.net">Pedro</a>, on explicà com començar una botiga electrònica amb <a lang="en" xml:lang="en" hreflang="en" href="http://ubercart.org">Ubercart </a>des de l&#8217;inici, a més a més, de solucionar algunes de les preguntes que em rondaven pel cap. Una de les millors sessions que vaig assistir, no tant pel que vaig aprendre jo, sinó pel que crec que va aprendre l&#8217;auditori sencer, ja que s&#8217;explicava molt bé, ordenadament i de forma clara i directa.</p>
<p>Tot seguit, l&#8217;equip català de traducció del Drupal varem fer una xerrada informal per a organitzar-nos, veure&#8217;ns les cares i en definitiva, poder llançar-nos en la traducció del Drupal d&#8217;una forma més ordenada i amb una gran qualitat associada. Personalment, en vaig sortir molt content tot i que amb deures pendents <img src='http://blog.facilitant.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Una vegada acabada, i havent esmorzat, me&#8217;n vaig anar a la xerrada de &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/open-atrium-para-la-gestion-de-proyectos"><span lang="en" xml:lang="en">Open  Atrium</span> para la gestión de proyectos</a>&#8220;. Feia temps que volia saber una mica d&#8217;aquest nou producte i amb la xerrada buscava veure quin ús se&#8217;n feia i per on anava la cosa encaminada. Alguna conclusió en vaig treure.</p>
<p>Tot seguit fou la fira de treball. Jo vaig anar a veure que es coïa, i després de donar un parell de voltes i escoltar què es proposava, vaig acabar xerrant amb el meu amic <a href="http://garrigos.cat">Robert</a> sobre <a href="http://drupal.cat">drupal.cat</a> i d&#8217;altres temes.</p>
<p>Per la tarda, i havent dinat, li tocà al torn a &#8220;<a lang="en" xml:lang="en" hreflang="es" href="http://drupalcamp.es/sessions/drush-make-y-feature-server">Drush  Make y Feature Server</a>&#8221; una xerrada molt més que interessant i de la que vaig aprendre&#8217;n molt, sobretot de la primera part. Ja tinc apuntat aquest tema per profunditzar-hi de debò en les properes setmanes.</p>
<p>Després, li tocà el torn a &#8220;<a lang="en" xml:lang="en" hreflang="es" href="http://drupalcamp.es/sessions/building-maps-openlayers-drupal">Building  Maps with OpenLayers in Drupal</a>&#8220;, la única xerrada en anglès a la que vaig assistir. Personalment, pensava que seria una altra cosa, però mira, al cap i a la fi, vaig practicar el meu anglès i vaig veure com anava el tema de mapes en Drupal, que també és força interessant (i complex!).</p>
<p>Per acabar el dia, i ja de baixada, vaig assistir a &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/programacion-con-la-api-de-views-un-caso-practico">Programación  con la API de views. Un caso práctico</a>&#8220;, una xerrada que segons el títol semblava que anés per una banda, però al final fou per tot el contrari. Un tema molt interessant, encara que crec que l&#8217;exemple que van proporcionar no fou dels més clars que podien haver posat.</p>
<h3>Diumenge 28 &#8211; Darreres xerrades i clausura</h3>
<p>El matí de diumenge ja es notava la ressaca en l&#8217;ambient.</p>
<p>La primera xerrada a la que vaig assistir, fou &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/construyendo-el-futuro-distribuciones-y-productos-basados-en-drupal">Construyendo  el futuro: Distribuciones y Productos basados en Drupal</a>&#8220;. Quan vaig decidir assistir-hi, pensava que no sortiria tan interessat i amb tantes preguntes al cap. La xerrada que més m&#8217;ha donat a pensar de tot el cap de setmana i una que en comptes d&#8217;explicar, el que feia era plantejar-nos preguntes, que poc a poc, i guiats, varem anar responent. La conferència tractà de la línia que segueix Drupal (on som, cap a on volem anar, què ens espera al futur), de quines necessitats tenen els diversos col·lectius associats (usuaris, desenvolupadors, integradors) i de quin rumb està prenent tot el món que envolta aquest programari (productes i serveis). Molt més que interessant.</p>
<p>Sortint de la xerrada, i amb la sang que em bombejava al cap de totes les preguntes que hi tenia, vaig entrar a &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/plantillas-como-tomar-el-control-sin-perder-mucho-pelo-en-el-intento">Plantillas,  como tomar el control sin perder (mucho) pelo en el intento</a>&#8220;. Una xerrada d&#8217;iniciació al món de les plantilles però sense entrar en res tècnic. Personalment, crec que hi faltà un últim ingredient, però tot i així, per a la gent que començava, suposo que no va estar gens malament.</p>
<p>I per acabar amb les xerrades, vaig assistir a &#8220;<a lang="es" xml:lang="es" hreflang="es" href="http://drupalcamp.es/sessions/iniciacion-skinr">Iniciación a Skinr</a>&#8221; per voler saber una mica més d&#8217;aquest mòdul. Personalment, crec que té una aplicació força reduïda en el món de les webs (tal i com es coneixen) però que sí que pot entrar una mica més en entorns on es necessiti poder donar a l&#8217;usuari la capacitat de personalització de diversos elements de la pàgina; encara que crec que a aquest mòdul encara li queda una maduració per arribar al nivell que s&#8217;espera d&#8217;ell.</p>
<p>Doncs bé, per acabar de tancar els tres dies, li tocà el torn a la sessió de clausura. Un moment de rialles, reflexions i molt bon rotllo. Se sortejaren diversos llibres (que no me&#8217;n tocà ni un <img src='http://blog.facilitant.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ) i es feu un petit anàlisi dels tres dies. Personalment, crec que ha estat tot un èxit i espero que l&#8217;any vinent hi hagi molt més i molt millor (si és que es pot)! Per acabar, només dir que tot això no hagués estat possible sense la super colla de voluntaris que varen fer tot el possible perquè tot això fos el que va ser! Gràcies a tots!!</p>
<h3>Què m&#8217;emporto de la Drupalcamp Spain 2010?</h3>
<ul>
<li>Un munt d&#8217;experiències i nous coneixements.</li>
<li>Un llistat de temes per estudiar i aprofundir.</li>
<li>Dues xapes: una de <a lang="en" xml:lang="en" hreflang="en" href="http://developmentseed.org">Development Seed</a> i una altra d&#8217;<a lang="en" xml:lang="en" hreflang="en" href="http://openatrium.com/">Open Atrium</a>.</li>
<li>Dues samarretes: la de regal i una ben xula que vaig comprar.</li>
<li>Uns quants quilos que he engreixat del munt de menjar boníssim que hi havia.</li>
<li>Una bona estona de networking.</li>
<li>I en definitiva, tot un món per a seguir investigant</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2010/03/02/reflexions-de-la-primera-drupalcampspain/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Validacions de formularis: a client o a servidor?</title>
		<link>http://blog.facilitant.net/2010/02/11/validacions-de-formularis-a-client-o-a-servidor/</link>
		<comments>http://blog.facilitant.net/2010/02/11/validacions-de-formularis-a-client-o-a-servidor/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 11:10:11 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[accessibilitat]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[usabilitat]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=211</guid>
		<description><![CDATA[Els que ens dediquem a sistemes client-servidor, més específicament, a sistemes basats en web,  sovint ens trobem amb la necessitat de construir formularis que executin accions a partir d&#8217;una entrada. És ben normal, que un client o un funcional proclami:


Vull que el número d&#8217;identificació sigui obligatori!
El correu electrònic ha d&#8217;estar en el format correcte!


O altres [...]]]></description>
			<content:encoded><![CDATA[<p>Els que ens dediquem a sistemes client-servidor, més específicament, a sistemes basats en web,  sovint ens trobem amb la necessitat de construir formularis que executin accions a partir d&#8217;una entrada. És ben normal, que un client o un funcional proclami:</p>
<blockquote>
<ul>
<li>Vull que el número d&#8217;identificació sigui obligatori!</li>
<li>El correu electrònic ha d&#8217;estar en el format correcte!</li>
</ul>
</blockquote>
<p>O altres típics requeriments que requereixin de fer una validació del formulari.</p>
<p>Davant d&#8217;aquest escenari, el primer que ens ve al cap és fer les validacions amb JavaScript a la capa client. Bé, no està malament. Fer les validacions a la capa de client, és ràpid en temps de computació, senzill (normalment) i proporciona una resposta ràpida a l&#8217;usuari, fet pel qual assegurem una bona experiència d&#8217;usuari mentre introduïm dades. Una de les primeres normes de la usabilitat a formularis és: com més aviat sàpiga l&#8217;usuari que s&#8217;ha equivocat, més aviat podrà reaccionar-hi (compte amb la interpretació d&#8217;aquesta frase <dfn title="De collita pròpia">made-by-me</dfn>!). Però mai hem d&#8217;acabar aquí!</p>
<p>Fer les validacions <strong>només</strong> a la capa client és una decisió completament errònia. On de debò s&#8217;han de fer aquestes comprovacions és a la capa servidor. Allà és on s&#8217;ha de mirar si cert camp existeix, si el format de tal camp és el correcte, de si la relació entre dos camps és correcta, etc. És a la capa servidor on tot aquest algorisme s&#8217;ha d&#8217;executar per prevenir qualsevol error que pugui tenir l&#8217;aplicació. És allà on s&#8217;executa la lògica de l&#8217;aplicació i on les validacions, com part d&#8217;aquesta lògica que són, s&#8217;han d&#8217;executar. Si només ho féssim a client, què passaria si no tinguéssim disponible el JavaScript? Quin seria el comportament de l&#8217;aplicació? Possiblement, acabéssim en un estat d&#8217;inconsistència no desitjat per ningú.</p>
<p>Sovint quan es planteja aquest argument (validacions dobles a capa client i servidor), molts <em>arquitectes </em>d&#8217;aplicacions (remarco la paraula perquè és el títol que es posen ells, no el que els hi posaria jo) posen el crit al cel i diuen la del porc argumentant que s&#8217;està fent una tasca dues vegades i que el rendiment de l&#8217;aplicació en general es veu ressentit. Si alguna vegada us trobeu davant d&#8217;això, només heu de dir:</p>
<blockquote><p>D&#8217;acord, llavors, les validacions que es facin només a la capa de servidor!</p></blockquote>
<p>Veureu com els hi canvia la cara <img src='http://blog.facilitant.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Cal tenir ben presents quines són les implicacions de deixar un processament de dades a una capa tan fràgil com pot ser un navegador, i la nostra tasca és argumentar i deixar ben clar el per què a client no és lloc per fer aquest tipus de processament.</p>
<p>Tingueu aquest consell sempre ben present perquè segur que al llarg de la vostra vida professional us caldrà utilitzar-lo més d&#8217;un cop.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2010/02/11/validacions-de-formularis-a-client-o-a-servidor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DrupalcampSpain 2010: Barcelona</title>
		<link>http://blog.facilitant.net/2010/01/11/drupalcampspain-2010-barcelona/</link>
		<comments>http://blog.facilitant.net/2010/01/11/drupalcampspain-2010-barcelona/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 22:43:17 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Conferències]]></category>
		<category><![CDATA[conferències]]></category>
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=206</guid>
		<description><![CDATA[Els propers dies 26, 27 i 28 de febrer es durà a terme al Citilab de Cornellà la primera Drupalcamp de l&#8217;estat, l&#8217;esdeveniment del món drupaler més gran de la península.Durant aquests tres dies es duran a terme diverses xerrades, tallers, xerrades informals (anomenades BOFs), a més a més, de ser un lloc únic per [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_207" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-207" title="logo" src="http://blog.facilitant.net/wp-content/uploads/2010/01/logo-300x73.png" alt="Logotip de la DrupalcampSpain 2010" width="300" height="73" /><p class="wp-caption-text">Logotip de la DrupalcampSpain 2010</p></div>
<p>Els propers dies 26, 27 i 28 de febrer es durà a terme al Citilab de Cornellà la primera<a href="http://drupalcamp.es/" hreflang="es"> Drupalcamp</a> de l&#8217;estat, l&#8217;esdeveniment del món drupaler més gran de la península.Durant aquests tres dies es duran a terme diverses xerrades, tallers, xerrades informals (anomenades BOFs), a més a més, de ser un lloc únic per a poder augmentar el nostre networking drupaler amb gent propera. Igualment, servirà com a lloc per a poder contactar entre diverses empreses i professionals per tal d&#8217;iniciar possibles col·laboracions o simplement, per intercanviar punts de vista i experiències.</p>
<p>Com no podia ser menys, jo ja m&#8217;he inscrit (els primers 50 tenien un descompte de 10€ i calia aprofitar-lo), i per tant, hi seré, a poder ser, els tres dies. Igualment, <a href="http://drupalcamp.es/node/250" hreflang="es">he proposat una sessió sobre com traduir Drupal</a> de forma correcta i ordenada (actualment hi ha una mica de merder al voltant d&#8217;aquest tema). A més a més, em ronda pel cap proposar una sessió sobre integració de maquetes HTML+CSS+JS a Drupal, cosa que mai he trobat informació i exemples precisos sobre un cas pràctic.</p>
<p>Doncs bé, si teniu cap proposta sobre alguna cosa que us agradaria saber sobre Drupal, digueu-ho i intentarem trobar algú que ho pugui explicar en una sessió.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2010/01/11/drupalcampspain-2010-barcelona/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comprovacions de l&#8217;existència d&#8217;una variable a JavaScript</title>
		<link>http://blog.facilitant.net/2009/12/21/comprovacions-de-lexistencia-duna-variable-a-javascript/</link>
		<comments>http://blog.facilitant.net/2009/12/21/comprovacions-de-lexistencia-duna-variable-a-javascript/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 12:45:38 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=194</guid>
		<description><![CDATA[Quan programem amb JavaScript (o qualsevol altre llenguatge de scripting) és normal haver de fer comprovacions de l&#8217;existència d&#8217;una variable dins de l&#8217;espai de noms.
Si necessitem saber si una variable ha estat declarada però sense valor assignat, podem comparar-la amb el &#8220;valor&#8221; undefined. Així podem veure:
var x;
// x === undefined retornaria cert
x = 5;
// x [...]]]></description>
			<content:encoded><![CDATA[<p>Quan programem amb JavaScript (o qualsevol altre llenguatge de scripting) és normal haver de fer comprovacions de l&#8217;existència d&#8217;una variable dins de l&#8217;espai de noms.</p>
<p>Si necessitem saber si una variable ha estat declarada però sense valor assignat, podem comparar-la amb el &#8220;valor&#8221; <code class="javascript">undefined</code>. Així podem veure:</p>
<pre><code class="javascript">var x;
// x === undefined retornaria cert
x = 5;
// x === undefined retornaria fals</code></pre>
<p>Però si el que de debò volem fer és comprovar si aquesta variable ha estat definida en algun punt del script, no podem fer aquesta comprovació, ja que al intentar cercar el símbol &#8220;x&#8221; a la seva taula de noms, ens donaria un error de referència. Llavors, podem fer-ho o no? La resposta és sí! Només cal comprovar el seu tipus: si no té un tipus definit, vol dir que no està definida dins la taula de noms. Total, que podem fer:</p>
<pre><code class="javascript">// typeof(y) === undefined retornaria cert
var y;
// typeof(y) === undefined retornaria fals</code></pre>
<p>I ja per acabar amb nota: com fer per saber si certa variable està definida directament en l&#8217;àmbit global de l&#8217;script? Doncs bé, com bé sabem, qualsevol variable definida a l&#8217;espai global, està també definida com un camp de l&#8217;objecte global. Llavors, els que ens dediquem a la programació web, i per tant tenim l&#8217;objecte <code class="javascript">window</code> com a objecte global, podem fer la comprovació:</p>
<pre><code class="javascript">window.z === undefined
// retornaria cert si la variable z no ha estat definida</code></pre>
<p>Doncs res, aquest ha estat el truc del dia. Espero que us sigui útil!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/12/21/comprovacions-de-lexistencia-duna-variable-a-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript. The Definitive Guide</title>
		<link>http://blog.facilitant.net/2009/11/17/javascript-the-definitive-guide/</link>
		<comments>http://blog.facilitant.net/2009/11/17/javascript-the-definitive-guide/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 12:10:05 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[llibres]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=184</guid>
		<description><![CDATA[Si alguna vegada esteu interessats en comprar un llibre sobre un llenguatge de programació i descobriu que un autor anomenat David Flanagan n&#8217;ha escrit un, no us ho penseu més: agafeu-lo. No tinc el plaer de conèixer-el en persona, però el que us puc ben assegurar és que aquest home, abans d&#8217;escriure res sobre un [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_186" class="wp-caption alignleft" style="width: 238px"><a href="http://blog.facilitant.net/wp-content/uploads/2009/11/lrg.jpg"><img class="size-medium wp-image-186" title="javascript5ed_comp.indd" src="http://blog.facilitant.net/wp-content/uploads/2009/11/lrg-228x300.jpg" alt="Portada del llibre Javascript. The Definitive Guide" width="228" height="300" /></a><p class="wp-caption-text">Portada del llibre Javascript. The Definitive Guide</p></div>
<p>Si alguna vegada esteu interessats en comprar un llibre sobre un llenguatge de programació i descobriu que un autor anomenat <a title="Pàgina personal d'en David Flanagan" lang="en" xml:lang="en" hreflang="en" href="http://www.davidflanagan.com/">David Flanagan</a> n&#8217;ha escrit un, no us ho penseu més: agafeu-lo. No tinc el plaer de conèixer-el en persona, però el que us puc ben assegurar és que aquest home, abans d&#8217;escriure res sobre un tema, ho estudia tot. I això us ho puc ben assegurar perquè no és pas el primer llibre que llegeixo d&#8217;aquest home i me n&#8217;adono de la minuciositat en que descriu un concepte o com va esfilagarsant un tema fins a deixar-lo tot explicat i ben explicat sobre paper.</p>
<p>El llibre que ens ocupa, <a lang="en" xml:lang="en" hreflang="en" href="http://www.amazon.com/gp/product/0596101996?ie=UTF8&amp;tag=davidflanagancom&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=0596101996">JavaScript. The Definitive Guide</a>, és per definició, el llibre de lectura obligatòria si volem intentar conèixer de debò aquest llenguatge de programació. Aquest llibre ens demostra que JavaScript no és, com la gent pensa, un llenguatge de programació només per la web i que només serveix per a validar formularis, fer menús desplegables i fer que la meva pàgina sigui més <em>molona</em>. No! JavaScript, i més d&#8217;un se sorprendrà al llegir això, és un dels llenguatges de programació més difícils i complexes que existeixen. Tampoc us espanteu, sinó que aquest llenguatge de programació amaga més d&#8217;una sorpresa, i fins que no llegeixes un llibre on s&#8217;explica tot amb pèls i senyals, no te n&#8217;adones de fins a on arriba el seu potencial.</p>
<p>Aquest llibre, com el seu nom indica, vol ser la guia definitiva de JavaScript, i sota el meu punt de vista, ho compleix sense cap tipus de dubte. La seva lectura, salvant la barrera inicial de ser un llibre de quasi bé un miler de pàgines escrites en anglès, es fa molt amena, avançant per tots els conceptes del llenguatge d&#8217;una forma natural i seguint un guió gens qüestionable, que ens durà, a través de centenars d&#8217;exemples, a comprendre parts completament desconegudes per molts.</p>
<p>Només mirant el llom interior del llibre, podem veure que aquest es divideix en quatre parts; encara que el llibre tracta només amb dos grans temes:</p>
<ul>
<li>La primer part, anomenada <span lang="en" xml:lang="en">Core JavaScript</span>, tal i com el seu nom indica, explica el nucli del llenguatge amb un detall excepcional. En aquesta part podem trobar els següents capítols:
<ul lang="en" xml:lang="en">
<li>Lexical Structure</li>
<li>Datatypes and Values</li>
<li>Variables</li>
<li>Expressions and Operators</li>
<li>Statements</li>
<li>Objects and Arrays</li>
<li>Functions</li>
<li>Classes, Constructors, and Prototypes</li>
<li>Modules and Namespaces</li>
<li>Pattern Matching with Regular Expressions</li>
<li>Scripting Java</li>
</ul>
</li>
<li>La segona part, anomenada <span lang="en" xml:lang="en">Client-Side JavaScript</span>, se centra més en el navegador com a plataforma de desenvolupament d&#8217;aplicacions en JavaScript. Hi podem trobar:
<ul lang="en" xml:lang="en">
<li>JavaScript in Web Browsers</li>
<li>Scripting Browser Windows</li>
<li>Scripting Documents</li>
<li>Cascading Style Sheets and Dynamic HTML</li>
<li>Events and Event Handling</li>
<li>Forms and Form Elements</li>
<li>Cookies and Client-Side Persistence</li>
<li>Scripting HTTP</li>
<li>JavaScript and XML</li>
<li>Scripted Client-Side Graphics</li>
<li>Scripting Java Applets and Flash Movies</li>
</ul>
</li>
<li>La tercera part, anomenada <span lang="en" xml:lang="en">Core JavaScript Reference</span>, és una referència completa de totes les classe, objectes, mètodes, propietats i demés del nucli del llenguatge definits per JavaScript 1.5 i ECMAScript versió 3.</li>
<li>La quarta part, anomenada <span lang="en" xml:lang="en">Client-Side JavaScript Reference</span>, és una referència de tots els elements que podem trobar dins d&#8217;aquest tema, des de DOM (nivell 1, 2 i 3), canvas, etc.</li>
</ul>
<p>Què, te&#8217;l compres? T&#8217;he convençut? Fes-ho, veuràs com em dones la raó de que és un llibre d&#8217;aquells que s&#8217;han de tenir sempre a mà.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/11/17/javascript-the-definitive-guide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Renovació de la web del W3C</title>
		<link>http://blog.facilitant.net/2009/10/20/renovacio-de-la-web-del-w3c/</link>
		<comments>http://blog.facilitant.net/2009/10/20/renovacio-de-la-web-del-w3c/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 08:50:23 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Reflexions]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=182</guid>
		<description><![CDATA[Acabo de veure que per fi s&#8217;ha llançat la nova web del W3C, encara que sembla ser que la seva estrena fou el passat 13 d&#8217;octubre. Ha estat el final del camí després que al març del 2009 es va llançar el lloc en beta obert a qualsevol tipus de contribució i comentari.
El nou lloc [...]]]></description>
			<content:encoded><![CDATA[<p>Acabo de veure que per fi s&#8217;ha llançat la <a hreflang="en" href="http://www.w3.org/">nova web del <abbr title="World Wide Web Consortium" lang="en" xml:lang="en">W3C</abbr></a>, encara que sembla ser que <a hreflang="en" href="http://www.w3.org/News/2009#entry-6521">la seva estrena </a>fou el passat 13 d&#8217;octubre. Ha estat el final del camí després que al març del 2009 es va llançar el lloc en beta obert a qualsevol tipus de contribució i comentari.</p>
<p>El nou lloc és força més intuïtiu, amb un disseny lleuger centrant l&#8217;atenció en el contingut i no tant en la forma de mostrar-lo. Al contrari de l&#8217;anterior lloc, sembla que en aquest s&#8217;hagin parat un moment i hagin rumiat l&#8217;arquitectura de la informació, ja que tots els continguts de la web estan categoritzats en diferents seccions de fàcil identificació i la navegació entre els diferents apartats es fa de forma força intuïtiva.</p>
<p>Com a nota irònica,<a hreflang="en" href="http://www.w3.org/QA/2009/10/w3c_site_launch.html"> al seu blog es comenta</a> que el <acronym title="Cascading Style Sheet" lang="en" xml:lang="en">CSS</acronym> usat no passa el seu validador. Segons argumenten, la majoria d&#8217;errors són per temes de hacks, regles pròpies d&#8217;alguns navegadors, <abbr title="etcètera">etc.</abbr></p>
<p>Doncs res, nous aires pel <abbr title="World Wide Web Consortium" lang="en" xml:lang="en">W3C</abbr> que ja tocava!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/10/20/renovacio-de-la-web-del-w3c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protegir pàgines amb l&#8217;event onbeforeunload</title>
		<link>http://blog.facilitant.net/2009/09/09/protegir-pagines-amb-levent-onbeforeunload/</link>
		<comments>http://blog.facilitant.net/2009/09/09/protegir-pagines-amb-levent-onbeforeunload/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 14:30:43 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[usabilitat]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=173</guid>
		<description><![CDATA[No us ha passat mai que mentre esteu acabant d&#8217;omplir un formulari, sense adonar-vos, feu clic allà on no toca i perdeu tot el que heu introduït? Doncs bé, hi ha una senzilla manera per evitar al màxim aquests errors: l&#8217;event onbeforeunload.
Cap allà als mitjans dels noranta, Internet Explorer 4.0 introduí aquest event no estàndard, [...]]]></description>
			<content:encoded><![CDATA[<p>No us ha passat mai que mentre esteu acabant d&#8217;omplir un formulari, sense adonar-vos, feu clic allà on no toca i perdeu tot el que heu introduït? Doncs bé, hi ha una senzilla manera per evitar al màxim aquests errors: l&#8217;event <code class="javascript">onbeforeunload</code>.</p>
<p>Cap allà als mitjans dels noranta, Internet Explorer 4.0 introduí aquest event no estàndard, però a diferència d&#8217;altres ocasions, aquest cop feu una cosa útil i els navegadors amb motor Gecko ho acabaren introduint a la versió 1.7 de Mozilla (Firefox 1.0).</p>
<p>Aquest event, tal i com resa el seu nom, es dispara just <strong>abans</strong> de l&#8217;event <code class="javascript">onunload</code>, és a dir, abans que es descarregui el contingut actual de la pàgina, i per tant, ens permet executar algun tipus d&#8217;acció en aquest moment.</p>
<p>A diferència dels altres events, aquest funciona força diferent: per tal de mostrar un missatge a l&#8217;usuari abans de descarregar la pàgina, el que cal fer és retornar una cadena amb el missatge que es vulgui mostrar. Un exemple podria ser:</p>
<pre><code class="javascript">
window.onbeforeunload = function(e) {
  return "No heu enviat el formulari. Si tanqueu la pàgina perdreu tots els canvis fets fins ara.";
}
</code></pre>
<p>Així, en cas d&#8217;abandonar la pàgina, se&#8217;ns mostraria un quadre amb el missatge:</p>
<blockquote><p>Esteu segur que voleu sortir d’aquesta pàgina?</p>
<p><em>No heu enviat el formulari. Si tanqueu la pàgina perdreu tots els canvis fets fins ara.</em></p>
<p>Premeu D’acord per a continuar, o cancel·la per a romandre a la pàgina actual</p></blockquote>
<p>Les frases que hi ha just abans i després de les nostres les posa el navegador (en aquest cas Firefox) i no es poden eliminar, substituir ni evitar de cap tipus de les maneres.</p>
<p>Val a dir que en cas que el navegador no tingui implementat aquest event, aquests simplement l&#8217;ignoraran i no mostraran pas el missatge a l&#8217;usuari.</p>
<h3>Pàgines protegides</h3>
<p>Recapitulem. La raó principal d&#8217;aquest article és que fa poc a la feina em varen demanar que implementés una funcionalitat per a protegir pàgines: volien poder mostrar un missatge quan un usuari intentés abandonar la pàgina enmig d&#8217;un formulari dins d&#8217;un procés amb un cert flux o bé intentés abandonar una pàgina, la construcció de la qual fos molt costosa. Un exemple ideal per a treure l&#8217;event <code class="javascript">onbeforeunload</code> de la nostra cartera de recursos. Anem a construir-ho.</p>
<p>Per tal de poder marcar si una pàgina la tractem com a protegida o no, és a dir, si registrem l&#8217;event <code class="javascript">onbeforeunload</code> per mostrar un missatge a l&#8217;usuari en cas d&#8217;abandonar la pàgina, afegirem la classe <code>protected</code> a l&#8217;element <code class="html">/body</code> de la pàgina:</p>
<pre><code class="html">&lt;body class="protected"&gt;</code></pre>
<p>Així, si usem jQuery, podem afegir les següents línies de codi per a tenir-ho fet:</p>
<pre><code class="javascript">$('body.protected').each(function () {
  window.onbeforeunload = function(e){
    return "Si abandones, ho perdràs tot per sempre!";
  };
});
</code></pre>
<p>Però tenim un petit inconvenient: si fem clic en un enllaç o si enviem el formulari fent clic a un botó, se&#8217;ns mostrarà el missatge, cosa que volem evitar. Això es pot resoldre inhabilitant l&#8217;event en cas de fer clic a certs elements:</p>
<pre><code class="javascript">$('body.protected p.botons input, body.protected a.sense-onbeforeunload', context).click(function () {
  window.onbeforeunload = null;
});</code></pre>
<p>I així de fàcil obtenim el que busquem. Fàcil, oi? I segur que a més d&#8217;un li sembla útil, i fins i tot, més que necessari en alguna situació quotidiana.</p>
<h3>Recursos</h3>
<ul>
<li><a lang="en" xml:lang="en" hreflang="en" href="http://msdn.microsoft.com/en-us/library/ms536907%28VS.85%29.aspx">Onbeforeunload event. Internet Explorer Developer Center</a></li>
<li><a lang="en" xml:lang="en" hreflang="en" href="https://developer.mozilla.org/en/DOM/window.onbeforeunload">Window.onbeforeunload. Mozilla Developer Center</a></li>
<li><a lang="es" xml:lang="es" hreflang="es" href="http://blog.scriptia.net/articulos/2007/01/onbeforeunload.html">onbeforeunload: tiende una mano al usuario</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/09/09/protegir-pagines-amb-levent-onbeforeunload/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CSS Mastery. Advanced web standards solutions</title>
		<link>http://blog.facilitant.net/2009/08/27/css-mastery-advanced-web-standards-solutions/</link>
		<comments>http://blog.facilitant.net/2009/08/27/css-mastery-advanced-web-standards-solutions/#comments</comments>
		<pubDate>Thu, 27 Aug 2009 14:37:15 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[llibres]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[estàndards]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=165</guid>
		<description><![CDATA[En el seu moment, quan em vaig llegir aquest llibre, va marcar un abans i un després en els meus coneixements sobre maquetació web.
Si en el seu moment vaig recomanar el llibre Bulletproof Web Design per aquells que volen entrar al món de la maquetació web, recomano ara el CSS Mastery per tots aquells que [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.facilitant.net/wp-content/uploads/2009/08/css-mastery.jpg"><img class="alignleft size-medium wp-image-168" title="Portada del llibre CSS Mastery" src="http://blog.facilitant.net/wp-content/uploads/2009/08/css-mastery-250x300.jpg" alt="Portada del llibre CSS Mastery" width="250" height="300" /></a>En el seu moment, quan em vaig llegir aquest llibre, va marcar un abans i un després en els meus coneixements sobre maquetació web.</p>
<p>Si en el seu moment <a hreflang="ca" href="http://blog.facilitant.net/2008/11/30/bulletproof-web-design/">vaig recomanar el llibre <span xml:lang="en">Bulletproof Web Design</span></a> per aquells que volen entrar al món de la maquetació web, recomano ara el <a xml:lang="en" hreflang="en" href="http://www.cssmastery.com/"><acronym title="Cascading Style Sheet">CSS</acronym> Mastery</a> per tots aquells que volen accedir a uns coneixements més avançats d&#8217;aquest món, i poder passar així a fer projectes més complexes.</p>
<p><a xml:lang="en" hreflang="en" href="http://andybudd.com/">Andy Budd</a> ens avisa des d&#8217;un principi: això no és pas un llibre per a novells, sinó que està fet per aquells que vulguin donar una volta més de cargol a la maquetació web. Ho diu amb raó, ja que el llibre comença amb un primer capítol de repàs, però ràpidament accelera per donar pas als següents capítols per entrar en tècniques més complexes, trucs usuals i sobretot, els <span xml:lang="en">hacks</span> que no ens podem treure mai de damunt.</p>
<p>És un llibre fàcil de seguir si tenim uns mínims coneixements de <acronym title="Cascading Style Sheet" lang="en" xml:lang="en">CSS</acronym> i <acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym>, però sobretot, és fàcil aprendre coses noves i fàcil poder-les posar en pràctica, ja que el llibre bé carregat d&#8217;exemples, explicacions de casos d&#8217;ús i amb alguna que altra referència de casos reals disponibles a la xarxa. En definitiva, un llibre molt més que recomanable: imprescindible!</p>
<p>Al revisar una mica l&#8217;índex, podem veure que el llibre està distribuït en onze capítols, nou dels quals són exposició de tècniques (separades per temàtica) i els dos darrers són l&#8217;elaboració de dos exemples o casos d&#8217;estudi amb tota la informació adquirida al llarg del llibre:</p>
<dl>
<dt xml:lang="en">Setting the foundations</dt>
<dd>En aquest capítol, com ja he comentat abans, l&#8217;autor fa una petita introducció repassant conceptes com els d&#8217;especificitat, organització dels documents, els diferents tipus de selectors, <abbr title="etcètera">etc.</abbr> Es recomana una lectura, encara que sigui en diagonal, per tal d&#8217;entrar en matèria.</dd>
<dt xml:lang="en">Visual formatting model recap</dt>
<dd>Repàs als diferents models de caixa, flotats i posicionament absolut/relatiu. Problema del doble marge i d&#8217;altres trucs.</dd>
<dt xml:lang="en">Background images and image replacement</dt>
<dd>Repàs al concepte d&#8217;imatge de fons. Caixes amb cantonades arrodonides, tècniques per a la simulació d&#8217;ombres i repàs a diferents tècniques de reemplaçament d&#8217;imatges.</dd>
<dt xml:lang="en">Styling links</dt>
<dd>Tal i com indica el títol, en aquest capítol es repassen diferents tècniques per a donar estils als enllaços, des d&#8217;estilitzar enllaços externs, tècniques per a l&#8217;ús d&#8217;<span xml:lang="en">sprites</span> com a imatges de fons entre d&#8217;altres coses.</dd>
<dt xml:lang="en">Styling lists and creating nav bars</dt>
<dd>En aquest capítol s&#8217;aborden diferents tècniques per a realitzar barres de navegació, tan verticals com horitzontals (tècnica d&#8217;<a title="Article original que explica la tècnica d'slidding doors" xml:lang="en" hreflang="en" href="http://www.alistapart.com/articles/slidingdoors/">sliding doors</a>). També explica com crear un mapa d&#8217;imatge entre d&#8217;altres temes.</dd>
<dt xml:lang="en">Styling forms and data tables</dt>
<dd>Un dels capítols d&#8217;on vaig treure més suc en el seu moment. No només explica temes de <acronym title="Cascading Style Sheet" lang="en" xml:lang="en">CSS</acronym> sinó que també exposa conceptes sobre el marcat correcte per una taula, estructuració i accessibilitat a formularis i més moltes més coses.</dd>
<dt xml:lang="en">Layout</dt>
<dd>El típic tema de tot llibre de <acronym title="Cascading Style Sheet" lang="en" xml:lang="en">CSS</acronym>: <span xml:lang="en">layout</span> fix, elàstic, líquid i combinat.</dd>
<dt xml:lang="en">Hacks and filters</dt>
<dd>Capítol força interessant on s&#8217;exposen les tècniques per a separar fulls d&#8217;estils per diferents medis o navegadors, trucs per aplicar regles a certs clients,  <abbr title="etcètera">etc.</abbr></dd>
<dt xml:lang="en">Bugs and bug fixing</dt>
<dd>Un altre capítol interessant i força inusual. S&#8217;hi recullen els <span xml:lang="en">bugs</span> més importants dins del món de la maquetació i diferents tècniques per a identificar tant a aquests com d&#8217;altres que no estiguin documentats encara.</dd>
<dt xml:lang="en">Case study 1: More than doodles</dt>
<dd>És el capítol més llarg de tot el llibre. En ell s&#8217;hi descriuen tots els passos que cal seguir per acabar construint la maqueta d&#8217;una pàgina, a simple vista força complexa. S&#8217;usen molts dels conceptes exposats al llibre, i sobretot s&#8217;hi fa especial atenció al tema de les llistes i del model de caixes.</dd>
<dt xml:lang="en">Case study 2: Tuscany luxury resorts</dt>
<dd>Un exemple força interessant de pàgina amb <span xml:lang="en">layout</span> fluid. A més a més, s&#8217;apliquen tècniques de posicionament de caixes força interessants i de reemplaçament de text per imatges que cal tenir força en compte.</dd>
</dl>
<p>En definitiva, i per tancar la ressenya, un llibre que cal <a hreflang="en" href="http://www.amazon.com/CSS-Mastery-Advanced-Standards-Solutions/dp/1590596145">comprar</a> i llegir per ser un bon expert en el tema.</p>
<div class="nota">
<p>Mentre estava acabant de redactar l&#8217;article he vist que tot just demà surt a la venda la <a href="http://www.amazon.com/CSS-Mastery-Advanced-Standards-Solutions/dp/1430223979/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1251376248&amp;sr=1-1" hreflang="en">segona edició d&#8217;aquest llibre</a>. Actualment encara no es pot consultar la taula de continguts del llibre, però segons he pogut llegir, actualitza els seus continguts i exposa nous temes sobre CSS3.</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/08/27/css-mastery-advanced-web-standards-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Com fer un plugin per a jQuery. Contingut tabulat en pestanyes</title>
		<link>http://blog.facilitant.net/2009/07/22/com-fer-un-plugin-per-a-jquery-contingut-tabulat-en-pestanyes/</link>
		<comments>http://blog.facilitant.net/2009/07/22/com-fer-un-plugin-per-a-jquery-contingut-tabulat-en-pestanyes/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 18:53:16 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=148</guid>
		<description><![CDATA[Durant el meu dia a dia professional, treballo (i força) amb jQuery, una meravellosa biblioteca JavaScript (s’entreveuen les meves preferències, oi?). Doncs bé, la segona cosa que cal saber quan s’entra en el món jQuery és desenvolupar, o com a mínim conèixer l&#8217;estructura bàsica, d&#8217;un plugin.
Per a exemplificar la construcció, crearem un petit giny per [...]]]></description>
			<content:encoded><![CDATA[<p>Durant el meu dia a dia professional, treballo (i força) amb jQuery, una meravellosa biblioteca JavaScript (s’entreveuen les meves preferències, oi?). Doncs bé, la segona cosa que cal saber quan s’entra en el món jQuery és desenvolupar, o com a mínim conèixer l&#8217;estructura bàsica, d&#8217;un plugin.</p>
<p>Per a exemplificar la construcció, crearem un petit giny per a construir contingut tabulat en pestanyes.</p>
<p>Partim d’un fragment HTML com el següent:</p>
<pre><code class="html">&lt;div class="pestanyes"&gt;
  &lt;h2&gt;Pestanya 1&lt;/h2&gt;
  &lt;div&gt;
    ...contingut...
  &lt;/div&gt;
  &lt;h2&gt;Pestanya 2&lt;/h2&gt;
  &lt;div&gt;
    ...contingut de la segona...
  &lt;/div&gt;
  &lt;h2&gt;Pestanya 3&lt;/h2&gt;
  &lt;div&gt;
    ...i una mica més...
  &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>Si ens centrem en el giny, podríem redactar una petita explicació funcional com la següent:</p>
<ul>
<li>En estat de repòs, es mostren les pestanyes amb la primera activa i només es mostra el contingut relacionat amb aquesta.</li>
<li>Una vegada cliquem a una pestanya, aquesta passa a ser l’activa i el contingut que es mostra passa a ser el relacionat amb aquesta.</li>
</ul>
<p>Ara només falta traduir això a codi JavaScript.</p>
<p>Comencem creant l&#8217;estructura general del plugin:</p>
<pre><code class="javascript">$('.pestanyes').each(function() {
  ...
});</code></pre>
<p>I les estructures necessàries per a crear el giny. Primer de tot caldrà amagar les capçaleres i el contingut d&#8217;aquestes i crear l&#8217;estructura per a les pestanyes que a nosaltres ens sigui còmode de treballar-hi. Per exemple una d&#8217;ideal seria una senzilla llista <code class="html">&lt;ul&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;</code>.</p>
<p>Anem a passar tot això a codi JavaScript:</p>
<pre><code class="javascript">$('div.pestanyes').each(function () {
  // creem una referència a les capçaleres i al contingut de les pestanyes
  var $headings = $('h2', this);
  var $content = $headings.next();

  // amaguem les capçaleres i els continguts
  $headings.hide();
  $content.hide();

  // creem l'estructura de les pestanyes
  var tabHtml = '';
  $headings.each(function() {
    tabHtml += '&lt;li&gt;' + $(this).text() + '&lt;\/li&gt;';
  });

  // i l'afegim al document
  $(this).prepend('&lt;ul class="tabs"&gt;' + tabHtml + '&lt;\/ul&gt;');
}</code></pre>
<p>Una vegada creada l&#8217;estructura, només queda marcar l&#8217;estat inicial amb la primera pestanya i el seu contingut relacionat com a actius:</p>
<pre><code class="javascript">var $tabs = $('ul.tabs li');
$tabs.eq(0).addClass('active');
$content.eq(0).show();</code></pre>
<p>Ara només ens queda centrar-nos en la interacció amb les pestanyes. Quan un usuari faci clic en una pestanya, cal resetejar l&#8217;estat actual (eliminar la marca d&#8217;actiu) i marcar la pestanya que s&#8217;ha clicat com a activa, juntament amb el seu contingut relacionat.</p>
<pre><code class="javascript">$tabs.click(function() {
  // eliminem la classe i amaguem el contingut
  $tabs.removeClass('active');
  $content.hide();

  // marquem la pestanya activa i mostrem el contingut que calgui
  $(this).addClass('active');
  var tabIndex = $tabs.index(this);
  $content.eq(tabIndex).show();
});</code></pre>
<p>Si ho posem tot junt, podem veure el resultat i una aplicació a un cas a l&#8217;<a href="http://blog.facilitant.net/exemples/plugin-jquery/pestanyes.html">exemple</a>.</p>
<p>Però fins aquí no hem fet res de res per construir un plugin. Posem-nos a treballar-hi.</p>
<h3>Adaptació del codi per a ser un plugin vàlid</h3>
<p>Quan pensem en crear un plugin jQuery, el que ens ve al cap és crear una funcionalitat reutilitzable dins del domini d&#8217;un objecte jQuery, és a dir, estendre l&#8217;objecte. Així, si ens centrem en el nostre exemple, la idea és acabar creant un codi tal que per poder crear un contingut tabulat, hàgim d&#8217;escriure simplement:</p>
<pre><code class="javascript">$('div.pestanyes').tabs();</code></pre>
<p>Si el que volem és estendre l&#8217;objecte jQuery el que haurem de fer, igual que en qualsevol altre objecte JavaScript, és afegir  una nova propietat al seu objecte <code class="javascript">prototype</code>. Així, una cosa d&#8217;aquest tipus seria vàlid:</p>
<pre><code class="javascript">$.prototype.tabs = function () {
  // el nostre codi
}</code></pre>
<p>Però si hagués decidit fer-ho així, ja s&#8217;hauria acabat l&#8217;entrada, i aquesta no és pas la idea.</p>
<p>Si mirem les primeres línies de la biblioteca jQuery, podem veure la creació d&#8217;un alies força interessant:</p>
<pre><code class="javascript">jQuery.fn = jQuery.prototype</code></pre>
<p>Així, si volem usar aquesta notació, podem ampliar directament l&#8217;objecte tot fent:</p>
<pre><code class="javascript">$.fn.tabs = function () {
  // el meu codi
  return this;
}</code></pre>
<p>S&#8217;ha afegit el retorn del propi objecte per a poder permetre l&#8217;encadenament de crides:</p>
<pre><code class="javascript">$('#element')
  .tabs()
  .mesCoses();</code></pre>
<p>El plugin que estem construint és força senzill, però què passaria si tinguéssim variables globals, funcions auxiliars i demés? Alguna cosa com aquesta:</p>
<pre><code class="javascript">var foo = 0;
$.fn.myPlugin = function () {
  foo += 5;
  myMethod();
  return this;
}
function myMethod() {
  ...
}</code></pre>
<p>Amb aquest escenari, algú sense gaires llums (o amb ganes de tocar la pera) podria usar el plugin des la següent forma (i des de l&#8217;espai global de noms):</p>
<pre><code class="javascript">var myMethod = 'bar';
$('#element').myPlugin();
</code></pre>
<p>Però per sort, nosaltres tenim un as sota la màniga anomenat <span lang="en" xml:lang="en">closure. Així, podem englobar <strong>tot</strong> el codi del nostre plugin dins d&#8217;una funció anònima:</span></p>
<pre><code class="javascript">(function () {
  var foo = 0;
  $.fn.myPlugin = function () {
    foo += 5;
    myMethod();
    return this;
  }
  function myMethod() {
    ...
  }
}) ();</code></pre>
<p>Sembla que tot ja està fet, no? Queda un últim punt. Per a assegurar la compatibilitat amb d&#8217;altres biblioteques, no podem usar l&#8217;àlies de l&#8217;objecte jQuery <code class="javascript">$</code> així com així, sinó que hauríem d&#8217;usar <code class="javascript">jQuery</code> com a mètode d&#8217;accés a l&#8217;objecte. Però això no és gaire còmode, no? Tranquils! Aprofitant que tenim la funció anònima englobant el nostre codi, podem crear un àlies segur per a <code class="javascript">jQuery</code> fàcilment passant-lo com a paràmetre d&#8217;aquesta:</p>
<pre><code class="javascript">(function($) {
  ...
})(jQuery);</code></pre>
<p>Ara ja estem en condicions de crear el nostre primer plugin. Podeu veure el codi resultant a l&#8217;<a href="http://blog.facilitant.net/exemples/plugin-jquery/pestanyes-plugin.html">exemple</a>.</p>
<h3>Ampliacions</h3>
<p>Una vegada que tenim el plugin funcionant, ens podem centrar en fer-lo més real. El primer que ens podem preguntar és: què és un plugin sense opcions? Doncs si en volem, només cal donar-li un parell de voltes i fet.</p>
<p>Considerem dues opcions de configuració:</p>
<ul>
<li>Pestanya activada per defecte, que serà un enter (per defecte 0) que indicarà l&#8217;index de la pestanya (<code class="javascript">activatedIndex</code>)</li>
<li>Efecte visual al canviar de pestanya, que serà el nom d&#8217;una funció (per defecte null) dins l&#8217;espai de noms de l&#8217;objecte jQuery (<code class="javascript">animation</code>)</li>
</ul>
<p>I si ho afegim al codi que ja tenim:</p>
<pre><code class="javascript">$.fn.tabs = function (options) {
  var config = $.extend({
    activatedIndex: 0,
    animation: null
  }, options || {});

  ...
}</code></pre>
<p>Ara el mètode <code class="javascript">tabs</code> accepta un paràmetre que és un objecte de configuració. S&#8217;usa el mètode <code class="javascript">$.extend</code> per tal d&#8217;estendre un objecte amb els valors per defecte amb els passats com a paràmetre.</p>
<p>Ara, els únics canvis que cal fer són força trivials. Pel cas de l&#8217;índex de la pestanya a activar:</p>
<pre><code class="javascript">// marquem la pestanya i el contingut desat a la configuració com actiu
var $tabs = $('ul.tabs li');
$tabs.eq(config.activatedIndex).addClass('active');
$content.eq(config.activatedIndex).show();
</code></pre>
<p>I pel cas de l&#8217;animació al canviar de pestanya:</p>
<pre><code class="javascript">if(config.animation) {
  $content.eq(tabIndex)[config.animation]();
} else {
  $content.eq(tabIndex).show();
}</code></pre>
<p>I per acabar, només falta veure-ho tot ajuntat i funcionant al seu <a href="http://blog.facilitant.net/exemples/plugin-jquery/pestanyes-plugin-2.html">exemple</a> corresponent.</p>
<h3>Fonts</h3>
<p>No creieu pas que sóc un geni. Ni molt menys. Aquesta entrada està basada en <a hreflang="es" href="http://blog.scriptia.net/articulos/2008/10/jquery-del-espagueti-al-plugin.html">una</a> de molt millor del meu amic <a hreflang="es" href="http://choangalvez.nom.es/">Choan</a>, el qual em va iniciar en el meravellós món del JavaScript. Només he volgut explicar-ho des de la meva òptica, usant alguna que altra alternativa de notació i amb un exemple ben diferent.</p>
<div class="nota">
<p>Cal deixar ben clar que això no és pas un plugin oficial ni res per l&#8217;estil. El codi el teniu disponible per tocar i jugar, però no s&#8217;acceptaran cap tipus de culpa per l&#8217;ús d&#8217;aquest en algun entorn productiu.</p>
<p>El que sí que s&#8217;accepten són notes, comentaris i tot el que vulgueu fer sobre el que aquí s&#8217;ha exposat.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/07/22/com-fer-un-plugin-per-a-jquery-contingut-tabulat-en-pestanyes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Separar la forma del contingut (nom de les classes)</title>
		<link>http://blog.facilitant.net/2009/06/29/separar-la-forma-del-contingut-nom-de-les-classes/</link>
		<comments>http://blog.facilitant.net/2009/06/29/separar-la-forma-del-contingut-nom-de-les-classes/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 09:01:03 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=136</guid>
		<description><![CDATA[Es ben sabut per tots els que ens dediquem a la programació d&#8217;interfícies web (també anomenats maquetadors o programadors front end) que cal tenir ben present que sempre s&#8217;ha de separar el document (HTML) de la seva presentació en un medi concret (CSS) i dels components amb comportament que pugui tenir (JavaScript). Així, és fàcil [...]]]></description>
			<content:encoded><![CDATA[<p>Es ben sabut per tots els que ens dediquem a la programació d&#8217;interfícies web (també anomenats maquetadors o programadors <span lang="en" xml:lang="en">front end</span>) que cal tenir ben present que sempre s&#8217;ha de separar el document (<acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym>) de la seva presentació en un medi concret (<acronym title="Cascading Style Sheets" xml:lang="en">CSS</acronym>) i dels components amb comportament que pugui tenir (JavaScript). Així, és fàcil veure que el següent fragment d&#8217;un document és completament incorrecte pel que fa a aquests cànons:</p>
<pre><code class="html">
&lt;div style="margin: 5px;"&gt;
    &lt;em&gt;Aquest contingut el vull en lletra cursiva&lt;/em&gt;
    &lt;small&gt;&lt;a onclick="window.location='/lipsum'" href="http://www.example.com"&gt;Lorem ipsum dolor&lt;/a&gt;&lt;/small&gt;
&lt;/div&gt;
</code></pre>
<p>Normalment la majoria de programadors som ben conscients de la incorrecció del fragment anterior, però sovint ens trobem incorreccions d&#8217;aquest tipus completament encobertes, i sempre seguint el mateix patró: el mal ús dels noms de classe dels elements.</p>
<p>Usaré exemples de la xarxa per a il·lustrar el que vull dir. Si anem a la portada de la pàgina d&#8217;una institució molt important del país podem trobar coses així (canvio els texts per centrar l&#8217;atenció):</p>
<pre><code class="html">
&lt;ul id="ul_home"&gt;
	&lt;li&gt;&lt;a class="vermell_nobullet_2" href="http://www.example.com"&gt;Ipse quat erimo&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a class="vermell_nobullet_2" href="http://www.example.com/dog"&gt;Sailer due rit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</code></pre>
<pre><code class="html">
&lt;div class="marge_superior"&gt;
    &lt;h2&gt;&lt;span id="actualitat" class="titol_seccio"&gt;Lorem ipsum&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;div id="altres_serveis" class="border_top"&gt;
    &lt;div class="border_bottom"&gt;
        &lt;a class="text_gris" href="http://www.example.com/bird"&gt;Dolor et sumum&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>El valor de l&#8217;atribut <code class="html">@class</code> d&#8217;alguns dels elements ja ens dóna informació de com s&#8217;estilitzaran al veure-ho associat al seu full d&#8217;estils.</p>
<p>Però sovint no es veu tan fàcilment la incorrecció a l&#8217;assignació dels noms de les classes. Per exemple, és ben normal trobar-nos sempre al fragment de descripció de  l&#8217;organització d&#8217;un document, classes del tipus:</p>
<pre><code class="html">
&lt;body class="3-columnes"&gt;
    &lt;div class="columna-esquerra"&gt;
        Lorem ipsum
    &lt;/div&gt;
    &lt;div class="columna-central"&gt;
        Dolor set
    &lt;/div&gt;
    &lt;div class="columna-dreta"&gt;
        Icse et luopir
    &lt;/div&gt;
&lt;/body&gt;
</code></pre>
<p>Hi veieu res d&#8217;estrany? Per saber si les classes són reveladores de la forma final, només cal que us feu la següent pregunta: podríeu saber quina és la forma final de la pàgina només llegint l&#8217;<acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym>? Si la resposta és sí, les classes són errònies. Si és no, doncs la cosa ja està millor.</p>
<p>Per exemple, una forma correcte de fer la divisió del document podria ser:</p>
<pre><code class="html">
&lt;body class="layout-complet"&gt;
    &lt;div class="contingut-primari"&gt;
        Lorem ipsum
    &lt;/div&gt;
    &lt;div class="contingut-secundari"&gt;
        Dolor set
    &lt;/div&gt;
    &lt;div class="contingut-terciari"&gt;
        Icse et luopir
    &lt;/div&gt;
&lt;/body&gt;
</code></pre>
<p>Oi que ara ja no us espereu com serà el document final?</p>
<p>Per tant, cal anar amb compte a l&#8217;hora d&#8217;assignar els noms a les classes. Sempre cal tenir ben present de separar la forma o presentació del contingut i anar una mica amb peus de plom a l&#8217;hora de cercar els valors. Així aconseguirem que els nostres documents siguin 100% independents de la forma en que es visualitzen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/06/29/separar-la-forma-del-contingut-nom-de-les-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
