Facebook & CodeIgniter – Definitive Guide

I spent more hours than the expected starting a simple development for a new Facebook application that runs on top of CodeIgniter. First I read A LOT, then I checked for solutions and, of course, I read a little bit more. After several hours reading and coding I knew it wasn’t good at all so I decided to start a new integration method from the scratch using only the code I found as guide. Here’s the result:

0. Environment

Before you get excited just review a few things before spent time reading another useless post :-)

  • PHP Version 5.2.6
  • MySQL 5 (It doesn’t affect Facebook integration at all but it is good to know)
  • HostMonster is my hosting provider (it is not a marketing initiative, just they have a nice environment set up for PHP)
  • Facebook platform 5 – I upload a copy of it to ensure you get the same copy I used.
  • CodeIgniter 1.6.3 – latest version available at the time of this post.

1. Do not hack CodeIgniter

I found a lot of solutions about hacking CodeIgniter by overriding functions or classes. NO, YOU DO NOT HAVE TO DO IT.

2. Install facebook library as plugin

  • Download the facebook platform ZIP
  • Unzip the files wherever you want -outside your Code Igniter application
  • Copy the WHOLE content under /php folder (under means files inside the folder and not with the container folder) to yout ./system/plugins folder inside Code Igniter application -Note: Yes, you have to include the jsonwrapper folder.
  • Rename the facebook.php file to facebook_pi.php

It is done! You already have installed facebook framework as plugin.

3. Autoload facebook plugin [optional]

To avoid the need of including the “load plugin” sentence inside every controller/class you can modify the ./system/config/autoload.php to include facebook plugin as required. It is almost a requirement for Facebook applications. Add to your $autoload['plugin'] array the facebook plugin. It could look like this:

$autoload['plugin'] = array('facebook');

Note: If you skip this step you will have to include the following line every time you need facebook functionality available.

$this->load->plugin('facebook');

4. Setup your application [updated]

Update your configuration file and set the ./system/application/config/config.php and change it as follows:

$config['uri_protocol'] = "PATH_INFO";
$config['base_url'] = "APPLICATION_URL";

Note: If you want to test your application locally, you can set base_url to http://127.0.0.1/path_to_your_app/

5. Extend your Controller class

Because I’m building a 100% facebook application, all my controllers require facebook API available. So I decided to extend my main Controller class as follows – BTW: By the date of this post the CodeIgniter documentation WAS WRONG about how to extend the core classes (CodeIgniter User Guide Version 1.6.3 – Creating Core System Classes). It is not true -i.e. it is false- that you have to extend the CI_ClassName. At least it didn’t work for me at all. Extend the ClassName directly.

Facebook Controller class should be placed under ./system/application/libraries folder.

Filename: XX_Controller.php (where “XX_” is the prefix you set on your ./system/application/config/config.php file – subclass_prefix parameter)

class FB_Controller extends Controller {
 
	// Facebook application key
	var $API_KEY = 'YOUR_API_KEY';
 
	var $facebook;
	var $uid;
 
	/*
	 * Custom Controller constructor.
	 * Adds Facebook support.
	 *
	 */
	function FB_Controller() {
 
		parent::Controller();
 
		// Authentication key
		$secret = 'YOUR_SECRET_KEY'; 
 
		// Prevent the 'Undefined index: facebook_config' notice from being thrown.
		$GLOBALS['facebook_config']['debug'] = NULL;
 
		// Create a Facebook client API object.
		$this->facebook = new Facebook($this->API_KEY, $secret);
		$this->uid = $this->facebook->require_login();
	}
}

Note: Inside the facebook application I built I always require an authenticated users, so that’s why I do have the require_login() call. However you can also validate if the user already have the application added. You should do this manually inside controller classes because there are a few exceptions where it is needed that user is authenticated but without adding the application.

6. Create your own controllers

Now you can extend your controllers from your Custom Controller. Note: You do not have to add any include or require sentence in your other classes, CodeIgniter will load directly your XX_Controller.php file -if it doesn’t load please check the config.php file and validate the subclass_prefix parameter.

Below you will find an example of a Controller that will validate if the user has the application added in his/her profile.

class Welcome extends XX_Controller {
 
	function Welcome() {
 
		parent::XX_Controller();
 
		// Check if the application has been added by the user
		try {
			if (!$this->facebook->api_client->users_isAppAdded()) {
				$this->facebook->redirect($this->facebook->get_add_url());
				return;
			}
		}
		catch (Exception $x) {
			// Clear cookies for your application and redirect them to a login prompt
			$this->facebook->expire_session();
			$facebook->redirect($this->facebook->get_login_url());
		}
	}
 
	// You should place your Controller's methods below.
 
}

7. Get out and celebrate

CodeIgniter is running as cleaner as you expected and Facebook API was included nicely!

I hope you find this post useful as I said at the beginning.

  PHP Client Library (34,3 KiB, 2.935 hits)


Si yo fuera el CEO

Esta entrada esta directamente relacionada con la entrada Las Agencias y su problema con Digital.

Si yo fuera el CEO de una agencia de publicidad que quiere entender y aprehender la cuestión “Digital” pensaría en lo siguiente – y lo digo con pleno conocimiento de Ingeniero de Sistemas obtuso y cuadriculado.

Digital no es una página Web

La diferencia entre una verdadera agencia digital y una empresa “hacedora” de páginas Web hace la diferencia. Las Agencias comprenden que la verdadera ventaja esta en el diferencial, en el Big Idea. Soporte sus ideas con verdaderas estrategias digitales, no piense en la página Web.

Digital requiere skills

No es llamar a dos “pelaos” para que le saquen “la” página Web. Su estrategia requiere verdaderos expertos. Si su empresa no esta en capacidad de contratarlos y mantenerlos contentos, busque aliados. Empresas dedicadas al desarrollo de software hay cientos de miles, así que busque bien. Entienda lo que significan los SLA -acuerdos de nivel de servicios. Busque profesionales certificados -no sólo en programación también en dirección y coordinación de proyectos, en procesos de software como CMM o Scrum.

Digital esta asociado a productos de software

Los productos TIENEN UN CICLO DE VIDA DIFERENTE AL DE LA CAMPAÑA O INICIATIVA O ACTIVACIÓN. Muchas empresas no comprenden esto, y creen que lo que se dice es broma. Los productos de software son productos, y por lo tanto su ciclo de vida no puede -en beneficio del negocio y su relación comercial a largo plazo- estar ligado a una campaña. Lo bello de esto es que demuestra 100% de los casos que el ser humano es el único animal que repite sus errores siguiendo los mismos pasos.

Hace poco leí en un libro algo similar a “si quieres que tu vida cambie, ¿por qué sigues haciendo lo mismo cada día? ¿acaso esperas un resultado diferente?”. Que cierto es, y para apropiar este concepto a la idea general de los productos de software, lo simplificaré a: “si su campaña no tiene presupuestado el desarrollo de un producto de software ¿por qué insiste en desarrollarlo?”.

El 110% de las necesidades de software están resueltas para esta industria. ¿Por qué insisten las Agencias, que no tienen la capacidad ni la experiencia para desarrollar productos de software, como un MMOG o un CMS. ¿Quién sabe? Seguramente se debe a la matemática veloz del vendedor: más horas de trabajo significan más dinero para la empresa. Claro, este vendedor no comprende, y no lo culpo por que nadie lo ha definido en el modelo de negocio, que el cliente paga por la campaña, no por el producto asociado.

Capacite a su equipo y de paso a usted mismo

Si sigue en su empeño de desarrollar software, mantenga el esfuerzo lo más bajo posible, recuerde que NO ES SU NEGOCIO desarrollar software. Tenga verdaderos expertos en los temas que usted requiere. Siempre es mejor un experto que 100 buenos programadores.

Capacite a su equipo de coordinación y dirección, capacítese usted en nuevas tecnologías y tendencias, abra sus ojos para ver más allá de “la” página Web.

Defina una estrategia de combate

Por último, pero no menos importante, defina como quiere manejar el negocio. Para eso responda las siguientes preguntas:

  1. ¿Tiene o puede conseguir el equipo para desarrollar software? -líderes, programadores, arquitectos, diseñadores de software, gerentes de proyecto, equipo de soporte, entre muchos otros.
  2. ¿Tiene la infraestructura para soportar un verdadero proceso de software? -servidores, respaldo, continuidad del negocio, recuperación ante fallas, soporte 7×24, control de versiones, sistema de gestión de trabajo, metodología, procesos, entre otros miles.
  3. ¿Quiere lidiar con el tema de calidad del software? -no importa si su campaña es un éxito total, si no ha habido otra iniciativa más exitosa, el ciclo de vida del producto es mayor y por lo tanto puede arruinar su relación comercial en el largo plazo.

Mi recomendación es que, de acuerdo con sus respuestas, evalúe los siguientes modelos.

  1. Productor de software. La empresa está en capacidad de producir productos de software y mantenerlos en el largo plazo -sin depender de los clientes o campañas de turno.
  2. Experto en implementaciones. La empresa no produce software pero ofrece soluciones completas apoyada en el uso de productos de software de terceros. Por ejemplo: Su empresa desarrolla portales corporativos y el producto que soporta su operación es producido por otra compañía. Su empresa se limita a modificar -de forma mínima- y a sacarle el máximo provecho en función de las necesidades de los clientes. Nota: Este es mi modelo favorito, para que reinventar la rueda, si ya la venden en la tienda, y a veces ni siquiera la venden, ES GRATIS!
  3. Aliado. La empresa ofrece soluciones a la medida, pero cuenta con un aliado de negocios que ofrece servicios de desarrollo a la medida. Nota: Este no requiere explicación pero sí una coordinación magistral entre los proveedores para evitar complicaciones durante el desarrollo de los proyectos

¿Qué haría yo para ver resultados rápidamente?

  1. Complementaría mi equipo de creativos tradicionales con expertos en temas digitales, buscaría creativos con pleno conocimiento del tema que me ayudaran a “predicar la palabra”. Los creativos a los que no les interesa el tema digital tienen sus días contados.
  2. Evaluaría el perfil de mis clientes y las necesidades existentes para considerar 2 o 3 -NO MÁS- productos de software que pudieran complementar e integrarse perfectamente a mis iniciativas y propuestas. Por productos me refiero a tipos de producto como un CMS para administrar los contenidos, Blogs para evaluar o resolver esquemas de comunicación directa, Networking para fortalecer relaciones comerciales, MMOG si mis clientes están interesados en los juegos en línea.
  3. Reclutaría expertos en tecnologías asociadas a los productos de software mencionados -en este caso ya hablaríamos de productos, CMS => Drupal, Blog => WordPress, MMOG => DarkStar, Networking => Dolphin. Es curioso pero alguien notó que sólo mencioné software gratuito?
  4. Evaluaría el esfuerzo requierido para implementar las soluciones con el equipo que tengo. Si es posible o si requiero más personas para trabajar, con nuevos skills -considero desde luego que el ciclo de estos productos no es inferior a 2 años y descarto si los clientes y sus campañas perduran el mismo tiempo.
  5. Evaluaría proveedores -incluso cuando ya tengo expertos en esos temas en mi empresa, ellos serán de vital importancia para planear y evaluar el esfuerzo por el que le pagaré a mis proveedores.
  6. Todo esto seguiría un proceso definido, claro y DOCUMENTADO. Para evitar situaciones que de seguro nos pasan a todos: ¿Quién definió esto? ¿Y para qué? ¿El cliente aprobó esto? ¿Esto hay que hacerlo?
  7. Finalmente, ofrecería soluciones completas. Gran parte del dinero presupuestado en un proyecto es gastado en integrar. Las Agencias producen A, el cliente tienen la infraestructura B y queremos que todo funcione sin importar nada. El problema esta en migrar A de un ambiente controlado por la Agencia a B, un ambiente controlado por el cliente. Esto SI que es un VERDADERO dolor de cabeza y, sin importar cuan diligente sea su equipo y proceso, los errores o inconvenientes presentes en el proceso son SU CULPA… o espera que el cliente asuma la responsabilidad? Se imagina a su equipo de IT -que en una agencia es medio personaje que también codifica en su otro medio tiempo- instalando Google Mail? o Facebook? o MySpace? No le haga lo mismo a sus clientes, ofrezca soluciones completas.

Las Agencias y su problema con Digital

La publicidad, es sin lugar a dudas uno de los negocios que mueve la mayor cantidad de dinero en el mundo. Y no hay que ser un erudito en el tema para entender que en un mundo dominado por la oferta y la demanda, todo producto ofrecido debe ser publicitado y anunciado de modo tal que: cree demanda -productos innovadores que satisfacen nuevas necesidades, o modifique las conductas de consumo y gane o amplíe su participación en el mercado -en castellano, se venda más.

La publicidad es a los productos, lo que los abogados a las personas. Son tristemente necesarios. Los consumidores en su mayoría “somos” ignorantes ante nuestras propias necesidades, es decir: necesito un iPhone 3G? CLARO, necesito un iMac de más de 20″? PERO POR SUPUESTO. Quiero un Ferrari y si es posible darle la vuelta al mundo en una visión romántica mediocre WildOn. Simple: La publicidad ha sido eficaz conmigo y lo ha sido con mis padres y con los padres de mis padres.

Si el mundo no tuviera publicidad seguramente Nike y Naik, Diesel y Dyesel, Sony y Coby serían lo mismo a la hora de ir a comprar en el almacén. Pero no!

La revolución de los consumidores

No todo es malo, los consumidores como humanos hacen parte inevitable de la evolución la especie y con la modernidad y el avance tecnológico han descubierto que Internet no es sólo para hacer la tarea, o saber si fulana esta buenísima, o para chismear a través de Carelibro (a.k.a Facebook).

Los consumidores han especializado sus consultas y perfilado sus intereses alrededor de grupos de consumidores y hoy en día la decisión de compra de un producto es alterada incluso por personas al otro lado del planeta.

Hace algunos años, un solo comercial de televisión impactaba directamente a los consumidores, hoy los consumidores ni siquiera vemos televisión, y si lo hacemos, vemos lo que queremos, no lo que nos presentan. El DVR, Apple TV y la televisión por demanda sobre Internet, han modificado radicalmente la percepción del consumidor y por lo tanto la pauta sobre el medio ha sufrido una transformación. James Bond  tomando Coke Zero -increíble, que pasó con el Martini agitado por no revuelto? Llegará el día en que los anuncios sucedan durante los programas como en “The Truman Show”.

Nuevos Medios

Algo deprimente y patético que ocurre en la industria de la publicidad y el mercadeo en Colombia -y por experiencia lo digo, en la región- es que una cosa es la estrategia publicitaria y otro la estrategia digital -vienen a mi mente algunas joyas dichas por directores creativos de agencias reconocidas: “hágame el favor, Internet es para hacer páginas, quién va a entrar a mirar eso… NADIE!”

Digital, es una evolución de medio, como sucedió con la televisión análoga y digital, y la publicidad sufre en nuestros días una transformación similar e IGUALMENTE acelerada. Digital no es algo externo o complementario, es parte intrínseca de la estrategia.

Digital no es Internet, es Internet, móviles, aplicaciones Stand-Alone para experiencias de inmersión, juegos de vídeo, contenidos sobre demanda, todo en nuestros días es digital! -es que tratar de explicar una diferencia cuando para mí no existe es difícil.

El problema de las Agencias

El problema de las Agencias es que si existe un antónimo para Creativo, ese es sin lugar a dudas “Coder” -y mis disculpas a los que se mueven en ambos mundos. Las Agencias, que se limitan a producir algo para excitar los sentidos -comerciales de TV y Radio, pancartas, promociones en PoP, buen lo básico sufren un gran dolor y una gran frustración al encontrar que en digital lo que más vende pero que menos importa en el mantenimiento a largo plazo es precisamente eso que excita a los sentidos.

Un comercial se produce y no tiene nada detrás, una vez ha sido filmado y producido, es almacenado y ejecutado las veces que sea necesario. Una pancarta es producida e instalada y no más fin de la historia.

Digital, supone el 90% de los casos un mantenimiento a largo plazo, control de versiones, bases de datos, servidores de aplicaciones, compilar, pruebas unitarias… en fin… un mundo de complicaciones y obscenidades que hacen felices a los obtusos ingenieros que, claro, como se la pasan en frente del computador y son tan aburridos y sin vida social.

Hace unos días presencié una discusión entre un Gerente de Cuenta de una empresa nacional muy importante y mi jefe donde decían: “es que este no es un cliente típico, tu sabes como son los ingenieros, todo lo quieren explicado, y con detalles, como si ya hubiéramos empezado el proyecto” -yo sólo pensaba, pero como quieren vender una idea si NO saben como la van a ejecutar? Tal vez esa pequeña situación que no duró más de cinco minutos puede explicar donde reside el problema general de la industria de la publicidad y el mercadeo digital.


Hug a Developer Today!

I found this video a month ago, that talks about developers and the change request process. It is all a joke, but a joke based on an absolute and painful truth: Software Project Managers sucks!. I have to say, most of the times, we do.

Every time I present a conference about software development process or software project management I said: It should not be that way. Developers are passionated workers that love coding -otherwise they will not spend such amount of hours in front of a display!! right? – However, corporation era talks about how we can make people do more for less -this is the most awful expression of what corporation era is. However as “The Corporation” films presents, the whole idea is to drain workers capacity until they cannot produce as much as we want.

Bad Project Managers believes that good planning is to execute the project within the schedule -by schedule I meant, keep the deadlines. However, good planners knows that schedule is not about dates, is about effort, that can be translated into work hours -at this point I can include myself as Bad Project Manager. However I do sacrifice the deadline over the developers personal hours. Why? It is a simple thing, I believe that developers have code rush hours. I felt it that way when I was developer. I cannot be 100% of the time thinking on the same thing for more than 4 hours, but if I can concentrate -and the environment lets me- I can just immerse myself into “the matrix” (i.e. the only thing I see is code). Good experienced developers can do it faster and more times in a day than a rookie. Those hours will produce better lines of code and less errors than any other time. So why you push your developers to the edge if you will not have support of the quality of work?

Keep your coders working extra hours will not produce better software, will produce MORE lines of codes, but also, MORE errors, and for sure, MORE stress.

BTW. The link to the video “Hug a Developer Today! @ YouTube


De la compra directa al servicio global

El comercio globalizado ha modificado radicalmente los patrones de producción y servicio, y en general toda la cadena productiva y de consumo de los productos. Hoy, es posible comprar un producto en Colombia, diseñado en Estados Unidos, producido en China, y cuyo servicio al cliente -soporte- se da en México. Es el caso de las impresoras HP (Hewlett-Packard).

HP: La experiencia de Servicio.

No puedo estar más arrepentido, creo que si los consumidores supiéramos el servicio que nos espera, muchos de nosotros no compraríamos la mayoría de productos electrónicos del mercado. Y les cuento mi caso:

  1. Agosto 11 de 2008. Mi esposa ha decidido comprar una impresora multifuncional HP F4280 y este día en la noche hemos adquirido el producto mencionado en un reconocido almacén de cadena.
  2. Agosto 12 a Septiembre 29. El producto funciona perfectamente, incluso he podido instalar el multifuncional en Hardy Heron. Somos felices consumidores.
  3. Septiembre 30. La impresora, sin razón alguna no prende. Aún desconectando, conectando, presionando, moviendo el conector, la impresora no funciona.
  4. Septiembre 30. En el almacén nos dicen que la garantía es directa con HP y nos dan los números erróneos de contacto -viaje perdido, tiempo perdido.
  5. Septiembre 30. Tras una llamada de 30 minutos donde el 90% del tiempo fue respondiendo preguntas como: “ya la prendió?”, “si está conectada?”, “ya intento prender y apagar?” y “seguro que en su casa hay servicio de corriente eléctrica?” el asesor concluye que es necesario un cambio, toma nuestros datos y nos comenta que alguien nos va a llamar. Nota: no dice cuándo, ni quién. Nota 2: El personaje es mexicano. La impresora es Made in China y yo estoy en Colombia.
  6. Octubre 2. Recibimos una llamada que confirma que podemos llevar la impresora a una oficina de correos en un centro comercial relativamente cercano -4 kilómetros- el lunes o martes a determinada hora y que efectuarán el cambio correspondiente. Que llevemos la impresora, ojalá en su caja y empaque original -SI COMO NO! DOS MESES DESPUÉS.
  7. Octubre 6. La impresora NO ES. El modelo entregado en la oficina de envíos -no es una oficina de atención, es un tercero dedicado a la mensajería y transporte de mercancías que no tiene la más mínima idea de lo que está sucediendo.
  8. Octubre 6. La llamada a soporte es un desastre. Las personas INSINÚAN que la impresora que tengo, no es la que digo que es. Sin decirlo, expresan que quiero cambiar mi impresora de HP F4180 a HP F4280. De donde han sacado esto? No sé, según ellos, mi número de serie del producto no coincide. Será que piensan que soy un mafiosito con bozo de lulo paisa tratando de hacerme rico con una impresora? De pronto. Claro, ellos son mexicanos y yo colombiano. No tienen como validar que digo la verdad, y “como soy colombiano, seguro les estoy haciendo trampa”.
  9. Octubre 6. En una nueva llamada a servicio concluyen que la única forma de obtener mi nueva impresora es repetir el proceso, sólo que en este caso debo adjuntar copias de la factura de compra, la lista de chequeó de entrega del almacén donde compré el producto y -OJO CON ESTA- una carta donde la persona de la oficina de mensajería confirma con su firma que la impresora recibida -por ella- es una HP F4280 y no una HP 4180. Esto va a tomar otro tiempo ya que tengo que esperar una nueva llamada de alguien que programará la fecha de cambio. Curioso que alguien ajeno a las partes tenga que mediar en una deficiencia del proceso. No me imagino la cara de la persona que atiende en el local de envíos cuando le explique que me tiene que firmar un documento donde asegura que la F4280 que le estoy entregando si es una F4280!
  10. Octubre 7. Será que me van a llamar? Cuándo? Cuántas impresoras deberé comprar para obtener un servicio decente?

Este proceso no sólo ocurre con las impresoras, les puedo asegurar que los portátiles y otros equipos son la misma vaina -no me refiero a los HP, yo tengo un Dell XPS M1210 al que comprarle una pendejada me significa horas en el teléfono, casi un mes de espera entre el envío y la recepción, y un sobrecosto exagerado.

Esto me lleva a concluir una cosa, si hubiera comprado mis productos en un almacén de contrabando donde, seguramente, el producto es más barato, ya me hubieran cambiado mi impresora, ya habría resuelto mi problema, y no hubiera tenido que hablar con un Mexicano que no me conoce, jamás me ha visto, sobre un producto que no me vendió y que jamás pasará por sus manos.

Lindo esto del servicio global. Será que alguien se le mide a hacer impresoras y a atender a sus clientes? No creo que sea tan difícil, Apple tiene servicio global y me atiende una persona en mi propia ciudad. Será tan difícil? Esto es lo lindo de poner a alguien a reducir costos en los procesos y a centralizar cuanto servicio se le pasa por la cabeza. Será que algún día será lo mismo para comprar un pedazo de pan? Ojalá que no! Se imaginan!