Sviluppare con Facebook: Open Graph – Intro

Posted: 31st August 2010 by Yari D'areglia in Resource, Tutorials
Tags:

Avviso: Se non hai tempo da perdere e non vuoi leggere una premessa fatta di sfoghi è insulti, passa direttamente al paragrafo “Cos’è l’Open Graph”.

I programmatori che hanno avuto a che fare con lo sviluppo di applicazioni Facebook, sono senza dubbio i possessori del più ricco vocabolario di insulti e bestemmie esistente al mondo!

Le continue modifiche sulle configurazioni, i bug delle API e la disorganizzatissima documentazione messa a disposizione, non sono certo d’aiuto per chi si si avvicina al mondo dello sviluppo in ambito Facebook per la prima volta…ma anche per la seconda e la terza. Mi dispiace iniziare questo articolo con una così triste e negativa premessa, ma devo ammettere che una buona parte dei capelli che ho perso la dedico proprio a questi maledetti bastardi piccoli inconvenienti!!

Fermi tutti però … dal 22 Aprile 2010 la situazione è un pò cambiata, ci sono sempre modifiche sulle configurazioni, le Api hanno ancora Bug e la documentazione è sempre misera…..  ma almeno adesso abbiamo l’Open Graph!

Cos’è l’Open Graph

Il termine “Open Graph” è stato coniato da Facebook all’ F8  in sostituzione del più comune “Social Network”. Il significato di questo termine è, senza troppi giri di parole, “the global mapping of everybody and how they’re related”. Citando sempre quanto detto alla conferenza di San Francisco: “Yelp si occupa di mappare la parte di Graph legata al business, Pandora quello legato alla musica. Se riuscissimo a connetere tutte queste mappe in un unico Graph, creeremo un Web più semplice, più sociale, personalizzato e sematico! Queste connessioni non avvengono solo su Facebook, ma sono presenti in tutto il web e oggi con l’Open Graph siamo in grado di mettere tutte queste cose insieme”. Senza dubbio l’obbiettivo è interessante … la semantica nel web è uno studio ricercato, ma forse ci voleva proprio un colosso per portare più valore a quello che si è iniziato con RDF, OWL, e compagnia bella.

L’Open Graph, ha come scopo quello di diventare uno standard per la descrizione semantica di pagine web. E’ stata creata una vera e propria brand image che darà un marchio al protocollo e una pagina web che descrive le specifiche, il tutto distribuito e approvato dalla open web foundation.

Per trasformare una pagina web in un oggetto consumabile dall’Open Graph, dovremo aggiungere alcuni tag alle nostre pagine e per essere certi che i tag che abbiamo inserito siano corretti potremo utilizzare degli strumenti dedicati alla verifica delle pagine dell’OpenGRaph (urlLinter, og:it, OGraph.in etc). Entrerò nel merito tecnico in un articolo dedicato.

Quindi, un utente su Facebook definisce il suo profilo e il suo “Graph” aggiungendo amici ed esprimendo preferenze quali: politica, situazione sentimentale e descrizione personale; mentre, attraverso L’Open Graph siamo in grado di descrivere una qualsiasi pagina web tramite tag predefiniti, in grado di dare informazioni semantiche al contenuto (potremo per esempio aggiungere un tag che indichi la natura del contenuto della pagina:Un film, organizzazione, Bar, un personaggio pubblico etc … qui la lista completa). Mentre nel primo caso parliamo unicamente di Facebook, nel secondo stiamo parlando dell’intero Web…. …… ^.^  dato che tutto questo è stato creato da Facebook, facendo due conti, realizzerete che esisterà un modo per collegare “Facebook” a “Tutto il Web” e perchè no, viceversa !!

Il Pulsante Like

Non ha bisogno di grandi presentazioni, ma non tutti conosco l’effettivo scopo del famoso pulsantino.

Se voi cliccaste sul like di questa pagina, automaticamente andreste ad esprimere la volontà di collegare in qualche modo il vostro utente Facebook con il contenuto della pagina  e quindi se la pagina fosse corredata dei vari tag dell’Open Graph (e in parte lo è)  questo collegamente esprimerebbe molto più che un link ad un url.

Prendiamo questo esempio: Se cliccaste sul like della pagina  dedicata al film “Full metal Jacket” su Imdb (la pagina è completa di opengraph tag) andreste ad aggiungere questo film alla lista dei vostri interessi su Facebook e se non esistesse ancora una pagina Facebook dedicata a questo specifico contenuto (o meglio alla pagina web che descrive questo contenuto), verrebbe automaticamente creata! (non sto inventando niente eh!). Questa connessione permetterà a chi gestisce la pagina di inviare informazioni sul vostro news feed ma non solo, nell’ottica di un Web perfettamente taggato per l’OpenGraph e di una navigazione fatta di Like intelligenti (e va bhe …poi?) le altre pagine web visitate dal diligente utente Facebook, potrebbero trasformasi in base ai contenuti segnalati tramite i like.

Per rendere possibile questa utopica descrizione, Facebook ha prefabbricato alcuni strumenti …

I Social Plugins

Sono il metodo più semplice per integrare nelle nostre pagine l’Open Graph senza troppi sforzi, dando all’utente l’impressione di avere pagine che si adattino in base ai suoi gusti (dice Facebook). Il pulsante Like stesso è considerato un social Plugin (in realtà viene descritto come il mezzo che permette ai social plugin di presentare contenuti personalizzati).

Uno dei social Plugin è l’Activity Feed, che mostra le attività dei nostri amici (e di altri utenti) legate a un dominio, mentre il plugin Raccomendations lavora in maniera simile ma mostrando contenuti in base ai Like che avete espresso e alle informazioni legate alle vostre connessioni nell’Open  Graph (personalmente non noto grandi differenze di contenuti … ma forse non sono l’utilizzatore Facebook più consigliato avrò dato si e no 5 like sparsi per il web).

Fino a qui abbiamo unicamente parlato di come sia stata ristruttarata la logica di connessioni in Facebook, ma non abbiamo ancora accennato al metodo per interagire direttamente con l’Open Graph tramite codice …

Le Graph API

Sono il nuovo sistema di API che utilizzeremo per accedere all’Open Graph. Tutti metodi sono accessibili tramite chiamate Web e i metodi protetti utilizzano Oauth 2.0 (una versione di Oauth rivisitata e coprodotta da Facebook) per eseguire chiamate autenticate.

La documentazione per ora è un pò scarna ma almeno sembra toccare tutti gli argomenti. Il vecchio sistema per interrogare Facebook (le REST API) continua ad esistere e in alcuni casi sarà l’unico modo per effettuare operazioni non ancora supportate sulle Graph Api (il che contribuirà a migliorare ulteriormente il vostro vocabolario di bestemmie).

Senza dubbio questo nuovo metodo facilità di molto la possibilità di eseguire il famigerato Connect (che Facebook preferisce non vedere più come un elemento distinto dalle API … ma integra pienamente nella logica delle Graph Api come funzionalità per eseguire chiamate che necessitino di un login) e di interagire con i dati residenti nei database di Facebook.

Questo è un esempio di chiamata sul graph api : https://graph.facebook.com/cocacola che riporterà un output simile a questo :

{
   "id": "40796308305",
   "name": "Coca-Cola",
   "picture": "http://profile.ak.fbcdn.net/profile-ak-snc1/object3/1853/100/s40796308305_2334.jpg",
   "link": "http://www.facebook.com/coca-cola",
   "category": "Consumer_products",
   "username": "coca-cola",
   "products": "Coca-Cola is the most popular and biggest-selling ..etc ",
   "fan_count": 11102416
}

Molto semplicemente ogni oggetto del graph è rappresentato da un ID, in questo caso abbiamo interrogato L’ID cocacola. Se volessimo avere informazioni delle connessioni di un oggetto aggiungeremo semplicemente alla chiamata il tipo di connessione che vorremmo analizzare. Per esempio la chiamata https://graph.facebook.com/me/friends dovrebbe mostrare la lista di amici dell’utente collegato all’applicazione.

(questa chiamata potrebbe generare un messaggio d’errore perchè dovremmo essere loggati a facebook e avere un token attivo risultante dal processo di autenticazione tramite OAuth. Entreremo nei dettagli nei prossimi articoli).

Questa veloce panoramica spero possa esservi utile per capire quali sono le novità che vengono introdotte nello sviluppo di applicazioni appoggiate a Facebook, e in generale per avere qualche idea in più sulla direzione verso quale sembrano essersi rivolte le sue mire!

A prestissimo per i prossimi articoli puramente tecnici giuro!

jQuery: Creare un plugin

Posted: 8th July 2010 by Yari D'areglia in Jquery, Tutorials
Tags: , ,

La semplicità di utilizzo di jQuery e la sue potenzialità, fanno di questo framework un indispensabile strumento per ogni Frontend Developer.  Utilizzando questa libreria mi è spesso capitato di avere una spiacevole sensazione di  deja vue, quando nel bel mezzo di una giornata ricca di consegne, mi sono ritrovato ad implementare funzionalità che differivano di poco da qualcosa che avevo già creato… ma che per forza di cose avevano bisogno di qualche ritocchino per funzionare come richiesto dal fantasioso ArtDirector (che quel giorno lasciato dalla ragazza e dall’indiscussa necessità di … va bhe… questa è un’altra storia … ).

Come ogni buono sviluppatore devastato dalla nevrosi :P ho capito che sarebbe stato il caso di affidarmi alla creazione di qualcosa di facilmente riutilizzabile, ma allo stesso tempo flessibile… Qui entrano in gioco i plugin.

Senza dubbio se conoscete jQuery vi sarà capitato di utilizzare un plugin, magari sfogliando la repository presente nel sito di jQuery… o semplicemente cercando su Google.  E’ tremendamente comodo, quanto facile e soddisfacente,  installare e utilizzare questo insieme di funzionalità che possono veramente salvarci dalla scrittura di decine di righe di codice.

Cosa costruiremo:

Lo scopo di questo post,  (oltre che farmi passare la voglia di bere e dimenticare quanto sia triste la nazionale) è la creazione di un semplice plugin per gestire un Toggle. Mi spiego meglio: creeremo una funzionalità che permetta allo sviluppatore di associare  al click di un elemento del DOM (bottone) lo switch  “visibile” <-> “non visibile” di un secondo elemento (contenuto). Tramite il plugin sarà possibile decidere quale cursore associare al bottone, a che velocità nascondere/visualizzare il contenuto e definire se il contenuto deve essere automaticamente nascosto al caricamento della pagina.
Per spiegarmi ancora meglio, vi allego direttamente qui l’esempio finale ottenuto tramite l’utilizzo del plugin e quindi riutilizzabile in mille altre situazione:

Come estendere jQuery:

Abbiamo due possibilità per  poter aggiungere funzionalità al Framework:

1) Estendere l’oggetto jQuery aggiungendo Funzioni
Funzioni che non dipendono da elementi del DOM e vengono richiamate direttamente tramite la sintassi :

$.myFunc();

2) Estendere l’oggetto jQuery.fn aggiungedo Metodi
Possiamo creare dei metodi direttamente legati a elementi del DOM, che vengono quindi richiamate a partire da una selezione. I plugin che scarichiamo dalla rete sono nella maggior parte dei casi strutturati in questo modo, ecco un esempio di chiamata :

$("div.black").myMethod();

In questo Post mi concentrerò sul secondo metodo, dato che è quello che più si addice, a mio parere, alle necessità che vi porteranno a creare il vostro plugin.

Pronti…. via

Estendere jQuery tramite jQuery.fn significa estendere il prototype dell’oggetto jQuery, fn è a tutti gli effetti una scorciatoia per il prototype di jQuery. Detto questo vediamo cosa scrivere nel nostro plugin, tenendo presente che il file nel quale scriveremo il codice deve seguire questa regola per il suo naming :  jquery.[nome_plugin].js (quindi nel nostro caso :jquery.toggler.js).

jQuery.fn.toggler = function() {
    alert("plugin toggler")
    return this;
};

Importando il file jquery.toggler.js nell’html e richiamando il metodo tramite la chiamata:

$(document).ready(function(){
   $().toggler();
});

Apparirà l’alert “plugin toggler” . Ok fino a qui niente di utile… ma potete iniziare a capire come viene semplicemente esteso il prototipo di jQuery e come possiamo richiamare il metodo appena creato.

Opzioni

Dato che il nostro plugin deve essere assolutamente flessibile, dobbiamo fare in modo che chi lo utilizzerà sia in grado di modificare facilmente alcuni parametri che renderemo volutamente accessibili modificando in questo modo il codice :

jQuery.fn.toggler = function(settings) {
    var config = {testo:"ciao"};

    if (settings) jQuery.extend(config, settings);

    alert("plugin toggler dice:\n"+ config.testo);
    return this;
};

Dovreste notare le seguenti differenze :

  • La funzione ora accetta un parametro “settings”
  • Abbiamo aggiunto la variabile config che rappresenta la nostra configurazione di default
  • Tramite la funzione extend andiamo a miscelare config  con quanto eventualmente presente nella variabile settings
  • Richiamiamo il valore di “testo” tramite config.testo

Ora se ricaricate la pagina html che ospita il vostro codice, dovreste notare che si è aggiunta la scritta “ciao” al testo precedentemente stampato nell’alert.

Il nostro obbiettivo però è fare in modo che il plugin sia configurabile…. quindi vediamo in che modo le modifiche fatte renderanno il plugin flessibile e adattabile alle scelte dello sviluppatore che lo utilizzerà.
In questa chiamata andiamo a specificare il parametro “testo”:

$(document).ready(function(){
  $().toggler({testo:"Sono un plugin!!"});
});

E nell’alert apparirà in più quanto scritto nel parametro.

Potete immaginare l’immensa capacità di personalizzazione che possiamo aggiungere ai metodi che crearemo.

Lanciare il metodo su tutti gli elementi selezionati

In questi due esempi non abbiamo selezionato degli elementi del DOM, è abbiamo lanciato direttamente il metodo senza alcun riferimento (per questi scopi avremmo potuto estendere jQuery tramite  il  metodo 1) che vi ho raccontato poco fa).
Ora ipotizziamo di voler lanciare l’alert per ogni elemento P della pagina, modifichiamo quindi la chiamata nel seguente modo :

$(document).ready(function(){
  $("p").toggler({testo:"Sono un plugin!!"});
});

Utilizzando quindi il selettore $(“p”) e modifichiamo il plugin in:

jQuery.fn.toggler = function(settings) {
    var config = {testo:"ciao"};

    if (settings) jQuery.extend(config, settings);
    this.each(function() {
        alert("plugin toggler dice:\n"+ config.testo);
    });
    return this;
};

la funzione this.each farà si che l’alert venga richiamato per ogni elemento identificato tramite il selettore $(“p”), modificate il vostro html aggiungendo dei P e noterete che per ogni P apparirà un message box.

Queste sono le basi da conoscere per poter creare un plugin, ora vi presenterò il codice che come promesso vi permetterà di creare uno slideToggle di un contenuto tramite il click di un elemento.

jquery.toggler.js

jQuery.fn.toggler = function(tog,settings) {
    var config = {
        speed: 'fast',
        cursor: 'pointer',
        hidden: true
    };

    //Modifica le configurazioni di default scelte per il plugin
    if (settings) jQuery.extend(config, settings);

    //Scorre tutti gli elementi presenti nel selettore tramite il quale è stato
    //richiamato il plugin.
    this.each(function() {
        //Modifica il cursore del item selezionato
        jQuery(this).css("cursor",config.cursor);

        //Nasconde o meno il contenuto dell'elemento "tog"
        if(config.hidden){
            jQuery(tog).css("display","none");
        }

        //Intercetta l'evento "click" sul item selezionato
        jQuery(this).click(function(){
            jQuery(tog).slideToggle(config.speed);
        });
    });

    return this;

};

Dovrebbe essere facilmente comprensibile, dato che è composto unicamente da quanto abbiamo visto poco fa. L’unica differenza sostanziale è dalla dal fatto che la funzione toggler accetta due parametri:
Il parametro tog, rappresenta il selettore per l’elemento che dovrà essere “nascosto/visualizzato” mentre settings identifica gli eventuali parametri decisi dall’utente. Di seguito è mostrata la chiamata e la porzione di html interessante per l’esempio:

<script type="text/javascript">
  $(document).ready(function(){
    $("#btn").toggler("#toggle");
  });
</script>

<p id="btn">Click Me</p>
<div id="toggle">Questo contenuto viene nascosto e visualizzato cliccando sulla voce ClickMe</div>

Viene chiamato il metodo toggler per l’elemento con ID #btn, il quale evento “click” verrà intercettato e gestito definendo l’apertura o chisura dell’elemento con ID #toggle.

Ecco il risultato, provate a cliccare su “click me”:

A questo punto, potete provare a modificare la chiamata html aggiungendo dei settings personalizzati per vedere come si comporta il metodo :

$(".btn").toggler(".toggle",{speed:"slow",cursor:"move"});

Grazie per essere arrivati fino a qui :D

Alla prossima!

PHP registry pattern con magic method

Posted: 3rd July 2010 by Yari D'areglia in PHP, Tutorials
Tags: , ,

Il registry Pattern viene principalmente utilizzato come store di oggetti o variabili.
Il motivo che potrebbe portare ad utilizzare un Registry è la necessità di passare oggetti tra classi, utilizzando quindi il pattern come sostituto delle tanto discusse variabili globali.
Il Registry Pattern che implementeremo utilizza un singleton per assicurare che esista un unico oggetto registry e sfrutta i magic methods __set e __get per salvare e restituire le informazioni.

Andremo a sviluppare prima la classe che implementerà il registry pattern e infine un metodo per vederlo all’opera.

Implementazione

Qui il codice della classe Registry:

/*
 * REGISTRY CLASS
 * implement registry pattern
 */
Class Registry {
    //Array dove vengono salvati i dati
    private $_data = array();

    //Istanza statica per implementazione il singleton
    private static $_instance;

    //Costruttore reso private
    private function __construct(){}

    //Generatore di istanza
    public static function getInstance(){
        if(self::$_instance === null){
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    //Metodo set (magic method)
    public function __set($key,$obj){
        if(!isset($this->_data[$key])){
            $this->_data[$key] = $obj;
        }
    }

    //Metodo get (magic method)
    public function  __get($key) {

        if($this->_data[$key]!== null){
            return $this->_data[$key];
        }
        else {
            return false;
        }
    }

    //Blocchiamo la clonazione
    public function  __clone() {

    }

    //funzione dump
    public function dump(){
        print_r($this->_data);
    }

}

Abbiamo detto che lo scopo del registry è quello di registrare informazioni. La variabile _data sarà il punto dove verranno salvati fisicamente tutti gli elementi passatti all’istanza di registry, come vedrete non si tratta che di un semplice array che avrà come chiave un nome da noi deciso e come valore il riferimento all’oggetto passato. Questa variabile non sarà accessibile dall’esterno della classe, viene quindi definita private.

Il parametro __instance viene invece utilizzato per implementare il singleton, qui è dove verrà salvata l’unica instanza della classe.

I metodi __get e __set sono implementati in maniera semplicissima. __set riceve il nome con il quale intendiamo salvare il riferimento ($key) e il riferimento vero e proprio ($obj), tramite queste informazioni andiamo dunque a valorizzare _data con :

$this->_data[$key] = $obj;

Il metodo __get restituisce uno degli oggetti salvati nel registro, richiedendo il nome utilizzato per salvaro tramite la __set.

Vi ricordo che non utilizzerete queste funzioni direttamente, ma verranno chiamate automaticamente quando cercherete di salvare un parametro nell’oggetto register e quando ne richiamerete uno, per intenderci :

$myregister->a = $obja; // richiama automaticamente __set("a",$obja);
$obja_ref = $myregister->a; //richiama automaticamente __get("a");

L’implementazione del pattern attraverso i magic methods è veramente semplicissima. ( può essere migliorata naturalmente aggiungendo eccezioni e controlli… ma per questo post vorrei mantenere l’attenzione sulla logica del pattern).

Utilizzo pratico

Per testare la classe ho creato 3 classi di supporto, A e B che non faranno assolutamente niente di utile… se non che fare da prototipo per le istanze di oggetti, e la classe Reader che ospiterà al suo interno un riferimento all’oggetto registry creato nel main del programma. Quello che voglio dimostrarvi tramite questo esempio è la comodità dell’utilizzo del registry per avere accesso ad un oggetto salvato in un qualsiasi punto dello script.

//Istanza di register
$registry = Registry::getInstance();

//Creiamo due oggetti A e B
$a = new A();
$b = new B();

//Crea una classe reader
$reader = new Reader();

//Aggiunge i due oggetti A e B nel Register sfruttando i magic Method
$registry->a = $a;
$registry->b = $b;

//Stampa il contenuto del registro passando dalla classe reader
$reader->printRegistry();

//Classi di test
class A{
    private $created;

    public function  __construct() {
        $this->created = date("Y-m-d H:i:s");
    }
}

class B{
    private $created;

    public function  __construct() {
        $this->created = date("Y-m-d H:i:s");
    }
}

//Classe che contiene un riferimento al register attivo
class Reader {
    private $registry;

    public function __construct(){
        $this->registry = Registry::getInstance();
    }

    public function printRegistry(){
        $this->registry->dump();
    }

}

Come prima cosa creiamo un riferimento ad un oggetto di tipo registry tramite :

$registry = Registry::getInstance();

creando per la prima (e unica) volta l’istanza di tipo Registry.
Dopo aver istanziato le altre classi andiamo a salvare le due istanze di A e B all’interno di registry:

$registry->a = $a;
$registry->b = $b;

Ora dando una veloce occhiata alla classe Reader notiamo che nel costruttore andiamo a richiamare getInstance per avere un riferimento all’oggetto registry (questa volta già creato), questo fa si che dall’interno della classe  possiamo accedere direttamente a tutti gli oggetti salvati nel Register . In questo caso tramite la funzione printRegistry che si occupa nient’altro che di lanciare la funzione Dump per stampare tutti gli oggetti salvati in _data.

L’output del codice sarà banalmente :

Array ( [a] => A Object ( [created:private] => 2010-07-02 23:41:36 ) [b] => B Object ( [created:private] => 2010-07-02 23:41:36 ) )

Che dimostra l’avvenuto accesso all’oggetto $registry aggiornato, che comprende i dati di a e b creati in precedenza.

E con questo abbiamo concluso l’implementazione del pattern Registry sfruttando i magic method __get e __set.

Ciao! alla prossima :D