Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: [u]nsigned en 9 Mayo 2012, 18:51 pm



Título: [Aporte]Integrar Facebook SDK PHP con CodeIgniter
Publicado por: [u]nsigned en 9 Mayo 2012, 18:51 pm
Para los que no saben, CodeIgniter (http://codeigniter.com/) es un framework php.

Estoy empezando con el desarrollo de una aplicacion en Facebook (modo iframe) utilizando el SDK para php (https://github.com/facebook/facebook-php-sdk).

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 (https://github.com/deth4uall/facebook-ignited/), 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 (https://github.com/facebook/facebook-php-sdk) 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
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2. class FB {
  3. private $o;
  4. var $user;
  5.  
  6. public function __construct()
  7. {
  8. require 'fb_libs/facebook.php';
  9. $this->o = new Facebook(array(
  10. 'appId'  => 'api_key_de_tu_aplicacion',
  11. 'secret' => 'codigo_secreto_de_tu_aplicacion',
  12. ));
  13. // See if there is a user from a cookie
  14. $this->user = $this->o->getUser();
  15. if (!$this->user)
  16. {
  17. $params = array(
  18. 'scope' => 'read_stream',
  19. 'redirect_uri' => 'https://apps.facebook.com/PAGINA_DE_TRABAJO/'
  20. );
  21. die('<script>window.top.location="'.$this->o->getLoginUrl($params).'"</script>');
  22. }
  23. }
  24.  
  25. public function api($query){
  26. return $this->o->api($query);
  27. }
  28. }
  29. ?>

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
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Welcome extends CI_Controller {
  4.  
  5. public function __construct()
  6. {
  7. parent::__construct();
  8. $this->load->library('fb');
  9. $this->user_profile = $this->fb->api('/me');
  10. }
  11.  
  12. public function index()
  13. {
  14. $data['name'] = $this->user_profile['first_name'];
  15. $data['location'] = $this->user_profile['location']['name'];
  16. $this->load->view('welcome_message', $data);
  17. }
  18. }
  19.  

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

Código
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Usando FB en CI by Unsigned</title>
  6. </head>
  7. <body>
  8. Nombre: <?=$name?><br />
  9. Ciudad: <?=$location?>
  10. <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p>
  11. </body>
  12. </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
  1. $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.


Título: Re: [Aporte]Integrar Facebook SDK PHP con CodeIgniter
Publicado por: EFEX en 10 Mayo 2012, 06:23 am
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
  1. <?php
  2. include(APPPATH.'libraries/facebook/facebook.php');
  3. class Fb_connect extends Facebook{
  4.  
  5. public $user = NULL;
  6. public $user_id = FALSE;
  7.  
  8. public $fbLoginURL = "";
  9. public $fbLogoutURL = "";
  10.  
  11. public $fb = FALSE;
  12. public $fbSession = FALSE;
  13. public $appkey = 0;
  14.  
  15. public $fbmessage = array();
  16.  
  17.  
  18. public function __construct()
  19. {
  20. $CI = & get_instance();
  21. $CI->config->load("facebook",TRUE);
  22. $config = $CI->config->item('facebook');
  23. parent::__construct($config);
  24. $this->user_id = $this->getUser(); // New code
  25. //$me = null;
  26. // login or logout url will be needed depending on current user state.
  27. //(if using the javascript api as well, you may not need these.)
  28. //if ($me)
  29. //{
  30. //    $this->fbLogoutURL = $this->getLogoutUrl();
  31. //} else {
  32. //    $this->fbLoginURL = $this->getLoginUrl();
  33. //}
  34. }
  35.  
  36. public function saveDataParam($data)
  37. {
  38. $this->fbmessage = $data;
  39. if ($this->user_id)
  40. {
  41. try {
  42. //$me = $this->api('/me');
  43. //$this->user = $me;
  44. $page_id = '123654789156245';  // ID de la subpagina del perfil.
  45. $page_info = $this->api("/$page_id?fields=access_token");
  46. if( !empty($page_info['access_token']) )
  47. {
  48. $args = array(
  49. 'access_token'  => $page_info['access_token'],
  50. 'message'       => $this->fbmessage['fbmessage']['message'],
  51. 'caption'       => $this->fbmessage['fbmessage']['caption'],
  52. 'link'          => $this->fbmessage['fbmessage']['link'],
  53. 'name'          => $this->fbmessage['fbmessage']['name'],
  54. 'description'   => $this->fbmessage['fbmessage']['description']
  55. //'picture' => $this->fbmessage['fbmessage']['image']
  56. //'actions' => array(array('name' => 'Get Search',
  57. );
  58. $post_id = $this->api("/$page_id/feed","post",$args);
  59.  
  60. }
  61. } catch (FacebookApiException $e)
  62. {
  63. error_log($e);
  64. }
  65. }
  66. }
  67.  
  68. } // end class
  69.  

controlador
Código
  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Shopcontroller extends CI_Controller {
  4.  
  5. public function addproduct()
  6. {
  7. //. . .
  8. $fbmessage = array("fbmessage" =>
  9. 'message' => 'Mensaje',
  10. 'description' => 'Descripción del mensaje',
  11. 'caption' => 'Titulo',
  12. 'link' => 'htttp://www.enlace.com',
  13. 'name' => 'Nombre',
  14. 'image' => 'http://www.enlace.com/img/imagen.jpg'
  15. )
  16. );
  17. $this->loginByFacebook($fbmessage);
  18. //. . .
  19. }
  20.  
  21. private function loginByFacebook($fbmessage)
  22. {
  23. $this->load->library('fb_connect');
  24. $param['redirect_uri'] = site_url("usercontroller/facebook"); //Redireccionar a ...
  25. $param['scope'] = 'email, publish_stream,manage_pages,user_birthday,offline_access';
  26. $this->fb_connect->saveDataParam($fbmessage);
  27. redirect($this->fb_connect->getLoginUrl($param));
  28. }
  29.  
  30. private function loginOutFacebook()
  31. {
  32. $this->load->library('fb_connect');
  33. $this->fb_connect->logout();
  34. }
  35. }
  36.  

Luego en la carpeta de tu aplicación config/facebook.php(lo creas)
Código
  1. <?php
  2. $config['appId'] = 'MY_ID';
  3. $config['secret'] = MY_ID_SECRET';
  4.  


También para actualizar tu perfil. (Enlace (https://gist.github.com/1856811))
Espero que se entienda saludos  ;D