validar validacion vacios formularios formulario enviar ejemplos ejemplo crear con campos antes javascript jquery ruby-on-rails ruby-on-rails-3 facebook

javascript - validacion - Facebook cómo comprobar si el usuario le ha gustado la página y mostrar el contenido?



validar formulario javascript html5 (6)

Estoy tratando de crear una aplicación iFrame de Facebook. La aplicación primero debe mostrar una imagen y si al usuario le gusta la página, obtendrá acceso a cierto contenido.

Uso RoR, por lo tanto, no puedo usar el SDK de Facebook PhP.

Aquí está mi HTML iFrame cuando el usuario no le ha gustado la página:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <link rel="stylesheet" type="text/css" href="style.css" /> <style type="text/css"> body { width:520px; margin:0; padding:0; border:0; font-family: verdana; background:url(repeat.png) repeat; margin-bottom:10px; } p, h1 {width:450px; margin-left:50px; color:#FFF;} p {font-size:11px;} </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <div id="container"> <img src="welcome.png" alt="Frontimg"> </div>

Y, si al usuario le ha gustado la página:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <link rel="stylesheet" type="text/css" href="style.css" /> <style type="text/css"> body { width:520px; margin:0; padding:0; border:0; font-family: verdana; background:url(repeat.png) repeat; margin-bottom:10px; } p, h1 {width:450px; margin-left:50px; color:#FFF;} p {font-size:11px;} </style> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <div id="container"> <img src="member.png" alt="Frontimg"> <p>You liked this page</p>


Aquí hay un ejemplo de trabajo, que es una bifurcación de esta respuesta :

$(document).ready(function(){ FB.login(function(response) { if (response.status == ''connected'') { var user_id = response.authResponse.userID; var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola var fql_query = "SELECT uid FROM page_fan WHERE page_id="+page_id+" and uid="+user_id; FB.api({ method: ''fql.query'', query: fql_query }, function(response){ if (response[0]) { $("#container_like").show(); } else { $("#container_notlike").show(); } } ); } else { // user is not logged in } }); });

Usé el método FB.api (JavaScript SDK), en lugar de FB.Data.query, que está en desuso. O puede usar Graph API como en este ejemplo:

$(document).ready(function() { FB.login(function(response) { if (response.status == ''connected'') { var user_id = response.authResponse.userID; var page_id = "40796308305"; // coca cola page https://www.facebook.com/cocacola var fql_query = "SELECT uid FROM page_fan WHERE page_id=" + page_id + " and uid=" + user_id; FB.api(''/me/likes/''+page_id, function(response) { if (response.data[0]) { $("#container_like").show(); } else { $("#container_notlike").show(); } }); } else { // user is not logged in } }); });​


Con Javascript SDK, puede cambiar el código de la siguiente manera, esto debe agregarse después de la llamada de FB.init.

// Additional initialization code such as adding Event Listeners goes here FB.getLoginStatus(function(response) { if (response.status === ''connected'') { // the user is logged in and has authenticated your // app, and response.authResponse supplies // the user''s ID, a valid access token, a signed // request, and the time the access token // and signed request each expire var uid = response.authResponse.userID; var accessToken = response.authResponse.accessToken; alert(''we are fine''); } else if (response.status === ''not_authorized'') { // the user is logged in to Facebook, // but has not authenticated your app alert(''please like us''); $("#container_notlike").show(); } else { // the user isn''t logged in to Facebook. alert(''please login''); } }); FB.Event.subscribe(''edge.create'', function(response) { alert(''You liked the URL: '' + response); $("#container_like").show(); }



Necesita escribir un pequeño código PHP. Cuando el usuario hace clic primero en la pestaña puede verificar si le gusta la página o no. A continuación se muestra el código de muestra

include_once("facebook.php"); // Create our Application instance. $facebook = new Facebook(array( ''appId'' => FACEBOOK_APP_ID, ''secret'' => FACEBOOK_SECRET, ''cookie'' => true, )); $signed_request = $facebook->getSignedRequest(); // Return you the Page like status $like_status = $signed_request["page"]["liked"]; if($like_status) { echo ''User Liked the page''; // Place some content you wanna show to user }else{ echo ''User do not liked the page''; // Place some content that encourage user to like the page }


Se requieren algunos cambios en el código de JavaScript para manejar el renderizado según el gusto del usuario o si no le gusta la página ordenada por Facebook para pasar a la autorización Auth2.0.

El cambio es bastante simple:

sesiones debe ser reemplazado por authResponse y uid por ID de usuario

Además, dado el requisito del código y algunos problemas que enfrentan las personas (incluido yo) en general con FB.login, el uso de FB.getLoginStatus es una mejor alternativa. Guarda la consulta a FB en caso de que el usuario haya iniciado sesión y haya autenticado su aplicación.

Consulte la sección Objeto de respuestas y sesiones para obtener información sobre cómo esto podría guardar la consulta en el servidor FB. http://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/

Problemas con FB.login y sus soluciones utilizando FB.getLoginStatus. http://forum.developers.facebook.net/viewtopic.php?id=70634

Aquí está el código publicado arriba con cambios que funcionó para mí.

$(document).ready(function(){ FB.getLoginStatus(function(response) { if (response.status == ''connected'') { var user_id = response.authResponse.userID; var page_id = "40796308305"; //coca cola var fql_query = "SELECT uid FROM page_fan WHERE page_id =" + page_id + " and uid=" + user_id; var the_query = FB.Data.query(fql_query); the_query.wait(function(rows) { if (rows.length == 1 && rows[0].uid == user_id) { $("#container_like").show(); //here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page. } else { $("#container_notlike").show(); //and here you could get the content for a non liker in ajax... } }); } else { // user is not logged in } }); });


ACTUALIZACIÓN 21/11/2012 @ALL: He actualizado el ejemplo para que funcione mejor y toma en cuenta las observaciones de Chris Jacob y FB Best practices, eche un vistazo al ejemplo de trabajo here

Hola, como prometí aquí está mi respuesta usando solo javascript:

El contenido del CUERPO de la página:

<div id="fb-root"></div> <script src="http://connect.facebook.net/en_US/all.js"></script> <script> FB.init({ appId : ''YOUR APP ID'', status : true, cookie : true, xfbml : true }); </script> <div id="container_notlike"> YOU DONT LIKE </div> <div id="container_like"> YOU LIKE </div>

El CSS:

body { width:520px; margin:0; padding:0; border:0; font-family: verdana; background:url(repeat.png) repeat; margin-bottom:10px; } p, h1 {width:450px; margin-left:50px; color:#FFF;} p {font-size:11px;} #container_notlike, #container_like { display:none }

Y finalmente el javascript:

$(document).ready(function(){ FB.login(function(response) { if (response.session) { var user_id = response.session.uid; var page_id = "40796308305"; //coca cola var fql_query = "SELECT uid FROM page_fan WHERE page_id = "+page_id+"and uid="+user_id; var the_query = FB.Data.query(fql_query); the_query.wait(function(rows) { if (rows.length == 1 && rows[0].uid == user_id) { $("#container_like").show(); //here you could also do some ajax and get the content for a "liker" instead of simply showing a hidden div in the page. } else { $("#container_notlike").show(); //and here you could get the content for a non liker in ajax... } }); } else { // user is not logged in } }); });

Entonces, ¿qué hace?

Primero inicia sesión en FB (si ya tiene la ID de usuario, y está seguro de que su usuario ya inició sesión en Facebook, puede omitir el inicio de sesión y reemplazar response.session.uid con YOUR_USER_ID (de su aplicación de rieles, por ejemplo)

Después de eso realiza una consulta FQL en la tabla page_fan , y el significado es que si el usuario es un fan de la página, devuelve el id de usuario y de lo contrario devuelve una matriz vacía, después de eso y dependiendo de los resultados, muestra un div o el otro.

También hay una demostración en funcionamiento aquí: http://jsfiddle.net/dwarfy/X4bn6/

Está usando la página de coca-cola como ejemplo, pruébala y haz clic en Me gusta / a diferencia de la página de coca cola y ejecútala de nuevo ...

Finalmente algunos documentos relacionados:

FQL page_fan table

FBJS FB.Data.query

No lo dude si tiene alguna pregunta ..

Aclamaciones

ACTUALIZACIÓN 2

Como lo afirmó alguien, se requiere jQuery para que la versión de JavaScript funcione, PERO se puede eliminar fácilmente (solo se usa para el documento. Listo y mostrar / ocultar).

Para el documento. body onload="your_function" , podría envolver su código en una función y usar body onload="your_function" o algo más complicado como aquí: Javascript - Cómo detectar si el documento se ha cargado (IE 7 / Firefox 3) para que reemplacemos el documento Listo.

Y para el espectáculo y ocultar cosas, podría usar algo como: document.getElementById("container_like").style.display = "none" or "block" y para obtener más cross browser de técnicas confiables, consulte aquí: http://www.webmasterworld.com/forum91/441.htm

Pero jQuery es muy fácil :)

ACTUALIZAR

Relativamente al comentario que publiqué aquí a continuación, hay un código ruby ​​para decodificar el "signed_request" que facebook POST tiene para su URL de CANVAS cuando lo busca para mostrarlo dentro de Facebook.

En tu controlador de acción:

decoded_request = Canvas.parse_signed_request(params[:signed_request])

Y luego es cuestión de verificar la solicitud decodificada y mostrar una página u otra ... (No estoy seguro de esto, no me siento cómodo con el rubí)

decoded_request[''page''][''liked'']

Y aquí está la clase Canvas relacionada (de la biblioteca fbgraph ruby ):

class Canvas class << self def parse_signed_request(secret_id,request) encoded_sig, payload = request.split(''.'', 2) sig = "" urldecode64(encoded_sig).each_byte { |b| sig << "%02x" % b } data = JSON.parse(urldecode64(payload)) if data[''algorithm''].to_s.upcase != ''HMAC-SHA256'' raise "Bad signature algorithm: %s" % data[''algorithm''] end expected_sig = OpenSSL::HMAC.hexdigest(''sha256'', secret_id, payload) if expected_sig != sig raise "Bad signature" end data end private def urldecode64(str) encoded_str = str.gsub(''-'',''+'').gsub(''_'',''/'') encoded_str += ''='' while !(encoded_str.size % 4).zero? Base64.decode64(encoded_str) end end end