Nel momento in cui lo script conferma.php viene eseguito, abbiamo la possibilità di conoscere l'id dell'utente destinatario del regalo, l'uid di Facebook e l'id del regalo che desideriamo inviare. Entrambi provengono dallo script precedente, scegliRegalo.php, il primo è contenuto nel campo nascosto uid, il secondo ci viene passato dal radio button di nome gid. Queste sono le due righe che ci permetteranno di ricavare queste due informazioni all'interno di conferma.php:
// ...
$uid = $_GET['uid'];
$gid = $_GET['gid'];
// ...
Prima ancora di fare questo però, come consuetudine aggiungeremo in cima allo script le solite istruzioni già viste nei due script precedenti:
<?
require_once '../fb_engine/php/facebook.php';
require_once 'gift.php';
$appapikey = 'MIO_API_KEY';
$appsecret = 'MIO_API_SECRET';
$facebook = new Facebook($appapikey, $appsecret);
$user_id = $facebook->require_login();
// ...
Adesso che abbiamo (quasi) tutto il necessario possiamo iniziare a scrivere il codice che si occuperà della pubblicazione del messaggio-regalo sulla bacheca dell'utente scelto.
Chi ha seguito con attenzione le lezioni precedenti sa già cosa useremo, nella lezione sulle API, è stata infatti presentata una funzione chiamata stream.publish()
specifica per questo utilizzo. Il codice seguente è del tutto simile al codice della lezione 2.3, con l'unica differenza che questa volta alla funzione stream_publish()
passiamo un quarto parametro $uid
(ovvero lo user id dell'utente destinatario del regalo), quindi il messaggio non verrà pubblicato sulla nostra bacheca (come accadeva nell'esempio della lezione 2.3) ma sulla bacheca dell'utente che possiede quel determinato user id.
// ...
$testo = 'Un regalo per te';
$attachment = array(
'name' => 'Regalo del giorno',
'caption' => '{*actor*} ti ha appena regalato:',
'description' => $regalo[$gid]['msg'],
'media' => array
(
array
(
'type' => 'image',
'src' => 'http://www.miohost.it/img/'.$regalo[$gid]['img'],
'href' => 'http://apps.facebook.com/giftoftheday'
)
)
);
$action_links = array(
array(
'text' => 'Vai all'applicazione',
'href' => 'http://apps.facebook.com/giftoftheday'
)
);
// trasforma gli array PHP in oggetti JSON
$attachment = json_encode($attachment);
$action_links = json_encode($action_links);
$facebook->api_client->stream_publish($testo, $attachment, $action_links, $uid);
Chi ha buona memoria ricorderà certamente che nella lezione sulle API abbiamo omesso una parte importante di discorso, ovvero quello riguardante i permessi. Ogni applicazione che vuole pubblicare uno stream in bacheca, infatti, deve avere il consenso esplicito dell'utilizzatore.
Tale precauzione è d'obbligo nel momento in cui tali stream compaiono a nostro nome. Oltre al permesso di pubblicazione ne esistono anche tanti altri, come quello di aggiornamento dello status oppure di invio e lettura email. Affinché la nostra applicazione possa richiedere i permessi necessari al corretto funzionamento è utile inserire all'inizio dello script del codice FBML che si occupi di notificare all'utente la richiesta di autorizzazione:
echo "<fb:prompt-permission perms='publish_stream'>";
echo "Concedi i permessi per la pubblicazione.";
echo "</fb:prompt-permission>";
In questo caso all'interno dell'attributo perms
è presente la sola voce publish_stream
, in quanto siamo interessati soltanto alla pubblicazione di stream in bacheca, se avessimo bisogno di un ulteriore permesso basterà scriverlo sempre all'interno di perms
separandolo con una virgola da quelli già presenti.
Sebbene la richiesta di permessi all'inizio del file è adatta alle nostre esigenze ha un limite molto pesante, dato dal fatto che così facendo verrà mostrato ogni volta il link "Concedi i permessi per la pubblicazione", anche se l'utente li ha già concessi.
Per evitare questo inconveniente, possiamo utilizzare un blocco try/catch. Nel try effettueremo la chiamata all'API di pubblicazione, se non dovessero esserci i permessi questo genererà un'eccezione e allora sarà eseguito il blocco catch, in cui avremo inserito la richiesta di permessi (le tre righe precedentemente in cima allo script). Questo è l'aspetto finale del nostro script, una volta implementato non ci resta altro da fare che chiamarlo tramite l'indirizzo http://apps.facebook.com/giftoftheday.
<?
require_once '../fb_engine/php/facebook.php';
require_once 'gift.php';
$appapikey = 'MIO_API_KEY';
$appsecret = 'MIO_API_SECRET';
$facebook = new Facebook($appapikey, $appsecret);
$user_id = $facebook->require_login();
$uid = $_GET['uid'];
$gid = $_GET['gid'];
$testo = 'Un regalo per te';
$attachment = array(
'name' => 'Regalo del giorno',
'caption' => '{*actor*} ti ha appena regalato:',
'description' => $regalo[$gid]['msg'],
'media' => array
(
array
(
'type' => 'image',
'src' => 'http://www.miohost.it/img/'.$regalo[$gid]['img'],
'href' => 'http://apps.facebook.com/giftoftheday'
)
)
);
$action_links = array(
array(
'text' => 'Vai all'applicazione',
'href' => 'http://apps.facebook.com/giftoftheday'
)
);
// trasforma gli array PHP in oggetti JSON
$attachment = json_encode($attachment);
$action_links = json_encode($action_links);
// effettua chiamata API
try {
$facebook->api_client->stream_publish($testo, $attachment, $action_links, $uid);
}
catch (Exception $e)
{
echo "<fb:prompt-permission perms='publish_stream'>";
echo "Concedi i permessi per la pubblicazione.";
echo "</fb:prompt-permission>";
die("Clicca il link superiore per attivare i permessi necessari, sarà richiesto una sola volta.");
}
echo "Hai regalato ".$regalo[$gid]['msg']." a <fb:name uid=".$uid." firstnameonly='false' />";
?>