<?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>Staicu Ionuţ-Bogdan &#187; JSON</title>
	<atom:link href="http://www.iamntz.com/category/json/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.iamntz.com</link>
	<description>the Frontend Developer</description>
	<lastBuildDate>Mon, 23 Jan 2012 04:55:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Afișează update-urile Twitter într-un widget</title>
		<link>http://www.iamntz.com/655/frontend-developer/afiseaza-update-urile-twitter-la-tine-pe-site/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/655/frontend-developer/afiseaza-update-urile-twitter-la-tine-pe-site/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 21:20:06 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=655</guid>
		<description><![CDATA[Cred că un feature destul de… căutat este „cum pun un widget de twitter pe blog/site?” Și oarecum pe bună dreptate, deoarece twitterul capătă din ce în ce mai multă atenție și pe … hai să zicem piața din Ro. Cea mai simplă metodă – dar nu neapărat și cea mai bună – ar fi [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/655/frontend-developer/afiseaza-update-urile-twitter-la-tine-pe-site/'>Afișează update-urile Twitter într-un widget</a>. <br/>
	<a href='http://www.iamntz.com/655/frontend-developer/afiseaza-update-urile-twitter-la-tine-pe-site/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>Cred că un feature destul de… căutat este „cum pun un widget de twitter pe blog/site?” Și oarecum pe bună dreptate, deoarece twitterul capătă din ce în ce mai multă atenție și pe … hai să zicem piața din Ro. Cea mai simplă metodă – dar nu neapărat și cea mai bună – ar fi folosidea widget-ului <a href="http://twitter.com/goodies/widget_profile">oficial</a>. Dar hei, unde ar mai fi distracția? Incluzi aproximativ 30kb doar pentru twitter? Uhm… Mie nu mi se pare cea mai fericită alegere.</p>
<p>Prin urmare, dacă ai deja inclus jQuery în pagină (sau orice altă librărie), poți încropi un astfel de widget în câteva linii de cod. Să vedem despre ce este vorba!<span id="more-655"></span></p>
<h3>Codul html</h3>
<p>Codul <acronym title="Hyper Text Markup Language - http://w3.org">HTML</acronym> este foarte simplu: o listă:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;ul id=&quot;twitterUpdates&quot;&gt;
	&lt;li&gt;Loading...&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>Acel <code>li</code> este necesar din două motive: 1) un <code>ul</code> gol nu ar fi valid; 2) trebuie să înștiințăm utilizatorul cumva că se întâmplă&#8230; ceva <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Următoarele bucăți de cod sunt furate de undeva, dar&#8230; Nu prea mai știu de unde. Deși am vaga bănuială că direct de la twitter.</p>
<p>Funcția următoare transformă data din forma „Thu Jun 10 12:00:33 +0000 2010” în ceva mult mai drăguț, de genul „X hours ago”</p>
<pre class="brush: jscript; title: ; notranslate">
function relative_time(time_value) {
  var values = time_value.split(&quot; &quot;);
  time_value = values[1] + &quot; &quot; + values[2] + &quot;, &quot; + values[5] + &quot; &quot; + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length &gt; 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);

  if (delta &lt; 60) {
    return 'less than a minute ago';
  } else if(delta &lt; 120) {
    return 'about a minute ago';
  } else if(delta &lt; (60*60)) {
    return (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta &lt; (120*60)) {
    return 'about an hour ago';
  } else if(delta &lt; (24*60*60)) {
    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta &lt; (48*60*60)) {
    return '1 day ago';
  } else {
    return (parseInt(delta / 86400)).toString() + ' days ago';
  }
}
</pre>
<p>Funcția următoare prelucrează răspunsul JSON venit de la twitter și îl injectează în lista de care am pomenit puțin mai sus.</p>
<pre class="brush: jscript; title: ; notranslate">
function twitterCallback2(twitters) {
  var statusHTML = [];
  for (var i=0, len=twitters.length; i&lt;len; i++){
    var username = twitters[i].user.screen_name;
    var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^&quot;\s\&lt;\&gt;]*[^.,;'&quot;&gt;\:\s\&lt;\&gt;\)\]\!])/g, function(url) {
      return '&lt;a href=&quot;'+url+'&quot;&gt;'+url+'&lt;/a&gt;';
    }).replace(/\B@([_a-z0-9]+)/ig, function(reply) {
      return  reply.charAt(0)+'&lt;a href=&quot;http://twitter.com/'+reply.substring(1)+'&quot;&gt;'+reply.substring(1)+'&lt;/a&gt;';
    });
    statusHTML.push('&lt;li&gt;&lt;span&gt;'+status+'&lt;/span&gt; &lt;a style=&quot;font-size:85%&quot; href=&quot;http://twitter.com/'+username+'/statuses/'+twitters[i].id+'&quot;&gt;'+relative_time(twitters[i].created_at)+'&lt;/a&gt;&lt;/li&gt;');
  }
  document.getElementById('twitterUpdates').innerHTML = statusHTML.join('');
}
</pre>
<p>Nu uita să schimbi <code>USER_ID</code> cu user-ul tău de twitter. De asemenea, acel „3” din coadă reprezintă câte twit-uri vrei să afișezi.</p>
<pre class="brush: jscript; title: ; notranslate">
$('#twitterUpdates').rdy(function() {
	$.getScript(&quot;http://twitter.com/statuses/user_timeline/USER_ID.json?callback=twitterCallback2&amp;count=3&quot;);
});
</pre>
<p>Despre funcția <code>rdy</code> am povestit un pic <a href="http://www.iamntz.com/657/frontend-developer/verifica-daca-un-element-este-disponibil/">aici</a>.<br />
Și gata.</p>
<p>Demo poți vedea în sidebar-ul blogului <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' /> </p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/655/frontend-developer/afiseaza-update-urile-twitter-la-tine-pe-site/'>Afișează update-urile Twitter într-un widget</a>. <br/>
	<a href='http://www.iamntz.com/655/frontend-developer/afiseaza-update-urile-twitter-la-tine-pe-site/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/655/frontend-developer/afiseaza-update-urile-twitter-la-tine-pe-site/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Sistem simplu de votare (rating)</title>
		<link>http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/?utm_source=subscriber&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 11:53:45 +0000</pubDate>
		<dc:creator>Staicu Ionuț-Bogdan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.iamntz.com/?p=100</guid>
		<description><![CDATA[În urmă cu câţiva ani s-a făcut mare tam tam cu web 2.0. Internetul s-a reinventat, gradul de implicare al utilizatorului a crescut, iar tehnologiile au început să fie folosite la adevărata loc capacitate. Dacă înainte de 2003-2004 termenul de aplicaţie web nu exista decât pe hârtie (probabil), după 2004 google a dat startul cu [...]
	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/'>Sistem simplu de votare (rating)</a>. <br/>
	<a href='http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/#postcomment'>Adaugă un comentariu!</a>]]></description>
			<content:encoded><![CDATA[<p>În urmă cu câţiva ani s-a făcut mare tam tam cu web 2.0. Internetul s-a reinventat, gradul de implicare al utilizatorului a crescut, iar tehnologiile au început să fie folosite la adevărata loc capacitate. Dacă înainte de 2003-2004 termenul de aplicaţie web nu exista decât pe hârtie (probabil), după 2004 google a dat startul cu binecunoscutul gmail, ducând web mailul la un nivel la care hotmail sau yahoo! nici nu visau (începând de la organizarea mesajelor &#8211; care între noi fie vorba, a fost preluată de microsoft în office 2010 &#8211; şi terminând cu capacitatea de stocare).</p>
<p>Ce a reprezentat această revoluţie 2.0? În principiu, modul în care utilizatorul final interacţionează cu un site. Astfel au apărut wikipedia (un site unde utilizatorii pot scrie articole), youtube (unde utilizatorii generează conţinutul) sau blogurile (unde vizitatorii pot comenta pe marginea unui articol). O altă funcţie care a apărut pe multe site-uri sunt voturile. Steluţele alea mici prin care apreciezi calitatea articolului sau a filmului postat. Şi cum sunt mulţi care nu ştiu să le folosească, m-am hotărât să scriu un mic articol. Metoda mea mi se pare cea mai curată (din punct de vedere al codului folosit) <a href="http://www.komodomedia.com/blog/2006/01/css-star-rating-part-deux/">din</a> <a href="http://www.search-this.com/2007/05/23/css-the-star-matrix-pre-loaded/">cele</a> <a href="http://www.henryhoffman.com/css-star-rating-tutorial.html">existente</a>. De asemenea, îţi voi arăta şi cum să faci un request ajax (se poate să vorbim de web 2.0 fără să amintim de ajax? <img src='http://www.iamntz.com/wp-includes/images/smilies/biggrin.gif' alt=':D' class='wp-smiley' />  ) pentru a trimite serverului ce a votat utilizatorul şi să returnezi un mesaj din partea serverului folosindu-te de <a href="http://en.wikipedia.org/wiki/JSON">JSON</a>. Desigur, va trebui să faci procesarea voturilor pe server, cu limbajul preferat (php, asp, ruby etc) deoarece cunoştinţele mele de programare server side sunt destul de limitate.</p>
<p><img alt="" src="http://www.iamntz.com/demos/stars/images/stars_mici.png" class="alignleft" />Avem nevoie de o imagine cu „stările” steluţelor (pot fi frunze, pisici, pahare, etc). De ce trei? Una pentru background (cea albă), una pentru hover (cea galbenă) şi una pentru a arăta votul curent (cea roşie). Desigur, dimensiunile rămân la discreţia fiecăruia, ajustându-le în funcţie de necesităţi. De asemenea, se pot folosi şi trei imagini separate, chiar dacă <a href="http://developer.yahoo.com/performance/rules.html#num_http">nu este recomandat</a>.</p>
<p>Folosind această imagine (şi încă una, <a href="http://www.iamntz.com/demos/stars/images/stars.png">mai mare</a>), îţi voi arăta cum să încropeşti rapid un sistem de vot foarte simplu.</p>
<h3>Markup</h3>
<p>Fie că vrei să faci un sistem de votare, fie că vrei doar să afişezi media voturilor, markup-ul e acelaşi: două <code>span</code>-uri :<br />
<span id="more-100"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;span class=&quot;rating&quot;&gt;&lt;span style=&quot;width:25%&quot;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;rating small&quot;&gt;&lt;span style=&quot;width:52%&quot;&gt;&lt;/span&gt;&lt;/span&gt;
</pre>
<p>Am specificat <code>width</code> inline din motive de&#8230; afişare. Fiecare stea înseamnă 20%. Astfel, trei stele înseamnă 60%, patru 80%, două 40% şamd.</p>
<p>Css-ul în schimb, e un pic mai lung de atât:</p>
<pre class="brush: css; title: ; notranslate">
.rating,
.rating span {
	float:left;
	height:64px;
	width:320px;
	background:url(../images/stars.png) repeat-x left top;
	margin-right:1em;
}
.rating.small,
.rating.small span {
	height:16px;
	width:80px;
	background-image:url(../images/stars_mici.png)
}
	.rating span,
	.rating.small span {
		float:none;
		display:block;
		height:64px;
		background-position:left -129px
	}
	.rating.small span {
		height:16px;
		background-position:left -32px
	}
</pre>
<p>Ce se întâmplă?</p>
<ol>
<li><code>.rating &amp; .rating span</code>:</li>
<li>Setăm fie <code>float </code>fie <code>display:block</code> pentru elementul ce conţine stelele. Astfel, putem specifica şi dimensiunile elementului</li>
<li>Setăm înalţimea unei stele şi lăţimea a cinci stele.</li>
<li>Setăm imaginea de fundal</li>
<li><code>.rating.small &amp; .rating.small span</code></li>
<li>Fiind vorba de stele ceva mai mici, specificăm alte dimensiuni şi altă imagine</li>
</ol>
<div class="demoDownload"><a href="http://www.iamntz.com/demos/stars" class="demoLink">Demo</a></div>
<h3>Cum votăm?</h3>
<p>Avem două posibilităţi:<br />
1) ne complicăm cu ceva cod html<br />
2) ne complicăm cu ceva cod js ce injectează html</p>
<p>Mie îmi place mai mult cea de-a doua variantă. Prin urmare, modificăm puţin markup-ul iniţial în:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;span class=&quot;rating&quot; id=&quot;stars-1&quot;&gt;&lt;span style=&quot;width:25%&quot;&gt;&lt;/span&gt;&lt;/span&gt;
</pre>
<p>S-a aduăugat <code>id</code>-ul din motive de&#8230; identificare. Vrem să trimitem serverului ce ID are fiecare stea. De aici, începe distracţia cu javascript <img src='http://www.iamntz.com/wp-includes/images/smilies/biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<pre class="brush: jscript; title: ; notranslate">
var removeThanks ='';
$('.rating:not(.ignore)').each(function(){
	var t = $(this);
	for(var i=1;i&lt;=5;i++){
		$(document.createElement('a')).attr('href', '#').addClass('vot-'+i).appendTo(t);
	}
	t.addClass('active').find('a').click(function(){
		$.ajax({
			type: &quot;GET&quot;,
			url: &quot;vot.php&quot;,
			data: { nota:t.find('a').index(this), id:t.attr('id') },
			dataType:'json',
			cache: false,
			success: function(data){
				t.addClass('votat').find('span').width(data.votNou+'%');
				window.clearTimeout(removeThanks);
				$('.thanksForVoting').remove();
				$(document.createElement('div')).addClass('thanksForVoting').css({
					left:t.offset().left+t.width(),
					top:t.offset().top
				}).text(data.raspuns).appendTo('body');
				removeThanks = window.setTimeout(function(){
					$('.thanksForVoting').fadeOut(function(){$(this).remove()})
				}, 2000);
			}
		});
		return false;
	});
});
</pre>
<h4>Explicaţii</h4>
<ul>
<li>Iterăm fiecare element cu clasa <code>rating</code> dar fără clasa <code>ignore</code>. Astfel putem avea şi doar stelele afişate, fără să se întâmple nimic la click (de exemplu, stelele votate)</li>
<li>În fiecare element <code>rating</code> injectăm cinci link-uri</li>
<li>La fiecare link ataşăm un event click ce va face un request ajax spre server. Deoarece linkul de vot nu variază (sau cel puţin aşa ar fi normal), acesta este specificat direct în codul JS (vot.php)</li>
<li>Trimitem către server <code>ID</code>-ul şi nota (de la 0 la 4) pe care s-a făcut click şi specificăm să primim datele înapoi în format <code>json</code></li>
<li>Actualizăm nota curentă (lăţimea span-ului) şi afişam noua notă (dacă s-a modificat)</li>
<li>Dacă nu vrei să afişezi niciun mesaj, te poţi opri aici, <strong>ai terminat</strong> <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' />  </li>
<li>Pentru a afişa un mesaj, cea mai la îndemână soluţie (de care poţi fi sigur că nu-ţi strică layout-ul) este de a insera un mic tooltip la sfârşitul documentului şi a-l poziţiona absolut. Prin urmare, îl construim, îl umplem (cu text, desigur), îl injectăm şi îl ascundem (şi ştergem) după X secunde. În cazul de faţă două</li>
</ul>
<h5>document.createEle&#8230; ce?</h5>
<p>Folosind jQuery ai trei posibilităţi de a include elemente în DOM:</p>
<ol>
<li>$(&#8216;&lt;a&gt;&lt;/a&gt;&#8217;).appendTo(element)</li>
<li>$(&#8216;&lt;a/&gt;&#8217;).appendTo(element)</li>
<li>$(document.createElement(&#8216;a&#8217;)).appendTo(element)</li>
</ol>
<p>Chiar dacă cea de-a treia variantă pare mai lungă, este un pic mai rapidă. Am listat metodele în funcţie de viteză, prima fiind cea mai înceată.</p>
<p>Deoarece injectăm cod <code>html</code> nou, trebuie să-l stilizăm cu puţin CSS suplimentar (ce nu cred că are nevoie de explicaţii suplimentare):</p>
<pre class="brush: css; title: ; notranslate">
.rating.active {
	position:relative;
}
	.rating.active a {
		position:absolute;
		left:0;
		top:0;
		height:100%;
		background:url(../images/stars.png) repeat-x left -999px;
	}
	.rating.active a:hover {
		background-position:left -64px
	}
	.rating.small.active a {
		background:url(../images/stars_mici.png) repeat-x left -999px;
	}
	.rating.small.active a:hover {
		background-position:left -16px;
	}
	.rating.active a.vot-1 {
		width:20%;
		z-index: 10;
	}
	.rating.active a.vot-2 {
		width:40%;
		z-index: 9;
	}
	.rating.active a.vot-3 {
		width:60%;
		z-index: 8;
	}
	.rating.active a.vot-4 {
		width:80%;
		z-index: 7;
	}
	.rating.active a.vot-5 {
		width:100%;
		z-index: 6;
	}
.thanksForVoting {
	position:absolute;
	background:#fbffde;
	z-index: 11;
	white-space:nowrap;
	border: 1px solid #999;
	-moz-border-radius:3px;
	-webkit-border-radius: 3px;
	border-radius:3px;
	padding:3px;
	font-weight:700;
	font-size:10px;
}
</pre>
<p>Răspunsul de la server (care am zis la început că este json) :</p>
<pre class="brush: jscript; title: ; notranslate">
({
	raspuns : 'Mulţumim pentru vot',
	votNou	:	'50' // în procente
})
</pre>
<p><strong>Atenţie!</strong> Nu uita să faci escape la ghilimelele din text (dacă foloseşti).</p>
<div class="demoDownload"><a href="http://www.iamntz.com/demos/stars/index2.html" class="demoLink">Demo</a></div>
<p>Cam asta e tot. Ţi-am arătat cum poţi face un simplu sistem de vot cu câteva linii (şi jQuery, desigur), fără să încarci inutil codul HTML. Dezavantajul <strong>MAJOR</strong> al acestei metode este că, în cazul în care nu se încarcă vreun fişier javascript, votul NU va funcţiona. Soluţia? Pui codul (da, cel pe care îl injectăm) direct în html <img src='http://www.iamntz.com/wp-includes/images/smilies/smile.gif' alt=':)' class='wp-smiley' /> </p>

	<br/>

	Ai terminat de citit postul <a href='http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/'>Sistem simplu de votare (rating)</a>. <br/>
	<a href='http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/#postcomment'>Adaugă un comentariu!</a>]]></content:encoded>
			<wfw:commentRss>http://www.iamntz.com/100/frontend-developer/sistem-simplu-de-votare-rating/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

