[Aporte]Integrar Facebook SDK PHP con CodeIgniter

Iniciado por [u]nsigned, 9 Mayo 2012, 18:51 PM

0 Miembros y 1 Visitante están viendo este tema.

[u]nsigned

Para los que no saben, CodeIgniter es un framework php.

Estoy empezando con el desarrollo de una aplicacion en Facebook (modo iframe) utilizando el SDK para php.

Pero se me ocurrio no hacerlo cpn php 'puro', sino usar CodeIgniter. El problema fue la integracion de SDK de Facebok con este framework. Luego de buscar mucho en internet, probrar librerias de 3ros y hasta una version de CI adaptada para aplicaciones Facebook, finalmente me decidi por integrarlo yo mismo.

Lo primero logicamente es descargar y subir CodeIgniter a nuestro servidor web, dentro del directorio raiz del mismo. Luego descargar el SDK PHP de facebook, y subir solo la carpeta 'src' tambien a la raiz de nuestro servidor web, y renombrarla como 'fb_libs'.

Una vez que hallamos subido todo lo necesario, pasaremos a crear una libreria para manejar la clase Facebbok. En el directorio 'applicationlibraries'  creamos el archivo 'fb.php' con el siguiente contenido:

Código (php) [Seleccionar]
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class 
FB {
private $o;
var $user;

public function __construct()
{
require 'fb_libs/facebook.php';
$this->= new Facebook(array(
 'appId'  => 'api_key_de_tu_aplicacion',
 'secret' => 'codigo_secreto_de_tu_aplicacion',
));
// See if there is a user from a cookie
$this->user $this->o->getUser();
if (!$this->user)
{
$params = array(
'scope' => 'read_stream',
'redirect_uri' => 'https://apps.facebook.com/PAGINA_DE_TRABAJO/'
);
die('<script>window.top.location="'.$this->o->getLoginUrl($params).'"</script>');
}
}

public function api($query){
return $this->o->api($query);
}
}
?>


Prestando atencion en poner los datos de nuestra aplicacion. (api_key, codigo_secreto y pagina_trabajo).

Por ejemplo, para usarla creamos un controlador llamado 'welcome.php' (que es el controlador por defecto) y ponemos el siguiente codigo:

Código (php) [Seleccionar]
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class 
Welcome extends CI_Controller {

public function __construct()
{
parent::__construct();
$this->load->library('fb');
$this->user_profile $this->fb->api('/me');
}

public function index()
{
$data['name'] = $this->user_profile['first_name'];
$data['location'] = $this->user_profile['location']['name'];
$this->load->view('welcome_message'$data);
}
}


Y luego creamos la vista 'welcome_message.php' con el siguiente codigo:

Código (php) [Seleccionar]
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>Usando FB en CI by Unsigned</title>
</head>
<body>
Nombre: <?=$name?><br />
Ciudad: <?=$location?>
<p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p>
</body>
</html>


No voy a entrar mucho en detalles, calculo que quien lee esto es porque minimamente conoce CodeIgniter, y probablemente este empezando o conozca la el SDK de Facebook para PHP. :P

Lo unico que quiero aclara son dos cosas:

1) Debemos cargar la libreria en todos nuestros controladores, o ponerla en auto load. Si lo hacemos a mano, se debe cargar justo despues de llamar al constructor padre.

2) La libreria se encarga automaticamente de redirigir a los usuarios al link de O Auth. Esto es en caso de que sea la primera vez que el usuario la usa, o dicho de otra forma, si el usuario no la tiene instalada en su perfil de facebook, automaticamente se lo re dirige.

3) Por ultimo, para usar la API del sdk desde nuestro controladores basta con llamar a la funcion api() del objeto $this->fb, ejemplo:


Código (php) [Seleccionar]
$foto_perfil_url = $this->fb->api('/me/picture');

Espero les sea util.

Saludos

PD: estoy en laburo, luego arreglo y aplio mas el post, quizas termine siendo un tutorial xD.

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

EFEX

Si para mi fue un poco dolor de cabeza utilizar esta api :P, hace un tiempo atras un cliente que tengo me pidió que queria actualizar una sub pagina de su perfil de facebook (promociones de productos y cuando se agregan nuevos productos al sitio) desde el panel de control de su sitio. Esta fue la forma que puedo hacerlo funcionar...

fb_connect.php
Código (php) [Seleccionar]

<?php
include(APPPATH.'libraries/facebook/facebook.php');
class 
Fb_connect extends Facebook{

public $user NULL;
public $user_id FALSE;

public $fbLoginURL "";
public $fbLogoutURL "";

public $fb FALSE;
public $fbSession FALSE;
public $appkey 0;

public $fbmessage = array();


public function __construct()
{
$CI = & get_instance();
$CI->config->load("facebook",TRUE);
$config $CI->config->item('facebook');
parent::__construct($config);
$this->user_id $this->getUser(); // New code
//$me = null;
// login or logout url will be needed depending on current user state.
//(if using the javascript api as well, you may not need these.)
//if ($me)
//{
//    $this->fbLogoutURL = $this->getLogoutUrl();
//} else {
//    $this->fbLoginURL = $this->getLoginUrl();
//}
}

public function saveDataParam($data)
{
$this->fbmessage $data;
if ($this->user_id)
{
try {
//$me = $this->api('/me');
//$this->user = $me;
$page_id '123654789156245';  // ID de la subpagina del perfil.
$page_info $this->api("/$page_id?fields=access_token");
if( !empty($page_info['access_token']) )
{
$args = array(
'access_token'  => $page_info['access_token'],
'message'       => $this->fbmessage['fbmessage']['message'],
'caption'       => $this->fbmessage['fbmessage']['caption'],
'link'          => $this->fbmessage['fbmessage']['link'],
'name'          => $this->fbmessage['fbmessage']['name'],
'description'   => $this->fbmessage['fbmessage']['description']
//'picture' => $this->fbmessage['fbmessage']['image']
//'actions' => array(array('name' => 'Get Search',
);
$post_id $this->api("/$page_id/feed","post",$args);

}
} catch (FacebookApiException $e)
{
error_log($e);
}
}
}

// end class


controlador
Código (php) [Seleccionar]

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class 
Shopcontroller extends CI_Controller {

public function addproduct()
{
//. . .
$fbmessage = array("fbmessage" => 
array(
'message' => 'Mensaje',
'description' => 'Descripción del mensaje',
'caption' => 'Titulo',
'link' => 'htttp://www.enlace.com',
'name' => 'Nombre',
'image' => 'http://www.enlace.com/img/imagen.jpg'
)
);
$this->loginByFacebook($fbmessage);
//. . .
}

private function loginByFacebook($fbmessage)
{
$this->load->library('fb_connect');
$param['redirect_uri'] = site_url("usercontroller/facebook"); //Redireccionar a ...
$param['scope'] = 'email, publish_stream,manage_pages,user_birthday,offline_access';
$this->fb_connect->saveDataParam($fbmessage);
redirect($this->fb_connect->getLoginUrl($param));
}

private function loginOutFacebook()
{
$this->load->library('fb_connect');
$this->fb_connect->logout();
}
}


Luego en la carpeta de tu aplicación config/facebook.php(lo creas)
Código (php) [Seleccionar]

<?php
$config
['appId'] = 'MY_ID';
$config['secret'] = MY_ID_SECRET';



También para actualizar tu perfil. (Enlace)
Espero que se entienda saludos  ;D
GITHUB