Skip to content

Instantly share code, notes, and snippets.

@wilr
Created June 19, 2012 07:49
Show Gist options
  • Save wilr/2952865 to your computer and use it in GitHub Desktop.
Save wilr/2952865 to your computer and use it in GitHub Desktop.
ENHANCEMENT: update module to support 3.0 api. FEATURE: add ability to request extended permissions. ENHANCEMENT: use classes rather than IDs for connect buttons to allow multiple per page.
diff -urN --exclude=.piston.yml --exclude=.git --exclude=.svn /Users/Will/Sites/justsold/.facebook.tmp/Authenticator/LoginForm.php /Users/Will/Sites/justsold/facebook/Authenticator/LoginForm.php
--- /Users/Will/Sites/justsold/.facebook.tmp/Authenticator/LoginForm.php 2012-06-19 19:43:58.000000000 +1200
+++ /Users/Will/Sites/justsold/facebook/Authenticator/LoginForm.php 2012-06-12 20:38:27.000000000 +1200
@@ -1,6 +1,7 @@
<?php
class FacebookLoginForm extends LoginForm {
+
protected $authenticator_class = 'FacebookAuthenticator';
public function __construct($controller, $method, $fields = null, $actions = null, $checkCurrentUser = true) {
@@ -10,15 +11,15 @@
$backURL = Session::get('BackURL');
}
if($checkCurrentUser && Member::currentUser() && Member::logged_in_session_exists()) {
- $fields = new FieldSet(
+ $fields = new FieldList(
new HiddenField("AuthenticationMethod", null, $this->authenticator_class, $this)
);
- $actions = new FieldSet(
+ $actions = new FieldList(
new FormAction("logout", _t('Member.BUTTONLOGINOTHER', "Log in as someone else"))
);
} else {
if(!$fields) {
- $fields = new FieldSet(
+ $fields = new FieldList(
new HiddenField("AuthenticationMethod", null, $this->authenticator_class, $this)
);
if(Security::$autologin_enabled) {
@@ -31,8 +32,8 @@
}
}
if(!$actions) {
- $actions = new FieldSet(
- new ImageFormAction('dologin', 'Sign in with Facebook', 'facebook/Images/signin.png')
+ $actions = new FieldList(
+ FormAction::create('dologin', 'Sign in with Facebook')->setAttribute('src', 'facebook/Images/signin.png')
);
}
}
diff -urN --exclude=.piston.yml --exclude=.git --exclude=.svn /Users/Will/Sites/justsold/.facebook.tmp/Controllers/FacebookCallback.php /Users/Will/Sites/justsold/facebook/Controllers/FacebookCallback.php
--- /Users/Will/Sites/justsold/.facebook.tmp/Controllers/FacebookCallback.php 2012-06-19 19:43:58.000000000 +1200
+++ /Users/Will/Sites/justsold/facebook/Controllers/FacebookCallback.php 2012-06-19 19:36:34.000000000 +1200
@@ -7,6 +7,15 @@
private static $facebook_secret = null;
private static $facebook_id = null;
private static $email_fallback = false;
+ private static $permissions = array();
+
+ public static function set_permissions($perms) {
+ self::$permissions = $perms;
+ }
+
+ public static function get_permissions() {
+ return self::$permissions;
+ }
public static function set_facebook_secret($secret) {
self::$facebook_secret = $secret;
@@ -16,6 +25,14 @@
self::$facebook_id = $id;
}
+ public static function get_facebook_secret() {
+ return self::$facebook_secret;
+ }
+
+ public static function get_facebook_id() {
+ return self::$facebook_id;
+ }
+
public static function get_email_fallback() {
return self::$email_fallback;
}
@@ -64,10 +81,13 @@
public function FinishFacebook($request) {
$token = SecurityToken::inst();
if(!$token->checkRequest($request)) return $this->httpError(400);
- if($this->CurrentMember()->FacebookID) {
+ $member = Member::currentUser();
+
+ if($member && $member->FacebookID) {
return '<script type="text/javascript">//<![CDATA[
opener.FacebookResponse(' . \Convert::raw2json(array(
- 'name' => $this->CurrentMember()->FacebookName,
+ 'name' => $member->FacebookName,
+ 'pages' => $member->getFacebookPages(),
'removeLink' => $token->addToUrl($this->Link('RemoveFacebook')),
)) . ');
window.close();
@@ -84,9 +104,12 @@
public function RemoveFacebook($request) {
$token = SecurityToken::inst();
if(!$token->checkRequest($request)) return $this->httpError(400);
- $m = $this->CurrentMember();
- $m->FacebookID = $m->FacebookName = null;
- $m->write();
+ $m = Member::currentUser();
+
+ if($m) {
+ $m->FacebookID = $m->FacebookName = null;
+ $m->write();
+ }
}
public function connectUser($returnTo = '', Array $extra = array()) {
@@ -116,9 +139,13 @@
if($user && empty($extra)) {
return self::curr()->redirect($callback);
} else {
+ $permissions = array(
+ 'scope' => implode(", ", self::get_permissions())
+ );
+
return self::curr()->redirect($facebook->getLoginUrl(array(
'redirect_uri' => $callback,
- ) + $extra));
+ ) + $extra + $permissions));
}
}
@@ -158,12 +185,16 @@
if($user && empty($extra)) {
return self::curr()->redirect($callback);
} else {
+ $permissions = array(
+ 'scope' => implode(", ", self::get_permissions())
+ );
+
return self::curr()->redirect($facebook->getLoginUrl(array(
'redirect_uri' => $callback,
- ) + $extra));
+ ) + $extra + $permissions));
}
}
-
+
public function index() {
$this->httpError(403);
}
@@ -245,31 +276,29 @@
public function Connect(SS_HTTPRequest $req) {
$token = SecurityToken::inst();
if(!$token->checkRequest($req)) return $this->httpError(400);
+
if($req->getVars() && !$req->getVar('error')) {
$facebook = new Facebook(array(
'appId' => self::$facebook_id,
'secret' => self::$facebook_secret
));
- $user = $facebook->getUser();
- if($user) {
- try {
- $data = $facebook->api('/me');
- if(isset($data->error)) {
- $user = null;
- }
- } catch(FacebookApiException $e) {
- $user = null;
+
+ try {
+ $data = $facebook->api('/me');
+
+ if($m = Member::currentUser()) {
+ $m->FacebookID = $data->id;
+ $m->FacebookName = $data->name;
+ $m->write();
}
- }
- if($user && $m = $this->CurrentMember()) {
- $m->FacebookID = $data->id;
- $m->FacebookName = $data->name;
- $m->write();
- } else {
- Session::set('Facebook' , array(
- 'ID' => $data->id,
- 'Name' => $data->name,
- ));
+
+ if(isset($data->error)) {
+ SS_Log::log($data->error->message, SS_Log::WARN);
+ }
+ } catch(FacebookApiException $e) {
+ $user = null;
+
+ SS_Log::log($e, SS_Log::WARN);
}
}
$ret = $req->getVar('ret');
diff -urN --exclude=.piston.yml --exclude=.git --exclude=.svn /Users/Will/Sites/justsold/.facebook.tmp/Extensions/Identifier.php /Users/Will/Sites/justsold/facebook/Extensions/Identifier.php
--- /Users/Will/Sites/justsold/.facebook.tmp/Extensions/Identifier.php 2012-06-19 19:43:58.000000000 +1200
+++ /Users/Will/Sites/justsold/facebook/Extensions/Identifier.php 2012-06-19 19:43:14.000000000 +1200
@@ -1,20 +1,17 @@
<?php
-class FacebookIdentifier extends DataObjectDecorator {
- public function extraStatics() {
- return array(
- 'db' => array(
- 'FacebookID' => 'Varchar',
- 'FacebookName' => 'Varchar(255)',
- )
- );
- }
+class FacebookIdentifier extends DataExtension {
+
+ public static $db = array(
+ 'FacebookID' => 'Varchar',
+ 'FacebookName' => 'Varchar(255)'
+ );
public function updateMemberFormFields(FieldSet $fields) {
$fields->removeByName('FacebookID');
$fields->removeByName('FacebookName');
- if(Member::CurrentMember() && Member::CurrentMember()->exists()) {
+ if(Member::currentUser() && Member::currentUser()->exists()) {
$fields->push($f = new ReadonlyField('FacebookButton', 'Facebook'));
$f->dontEscape = true;
} else {
@@ -27,14 +24,66 @@
Requirements::javascript(THIRDPARTY_DIR . '/jquery/jquery.js');
Requirements::javascript(THIRDPARTY_DIR . '/jquery-livequery/jquery.livequery.js');
Requirements::javascript('facebook/javascript/facebook.js');
- if($this->owner->FacebookID) {
+
+ if($this->hasFacebook()) {
$token = SecurityToken::inst();
$removeURL = Controller::join_links('FacebookCallback', 'RemoveFacebook');
$removeURL = $token->addToUrl($removeURL);
- return 'Connected to Facebook user ' . $this->owner->FacebookName . '. <a href="' . $removeURL . '" id="RemoveFacebookButton">Disconnect</a>';
+
+ return 'Connected to Facebook user ' . $this->owner->FacebookName . '. <a href="' . $removeURL . '" class="unconnect-facebook">Disconnect</a>';
+
} else {
- return '<img src="facebook/Images/connect.png" id="ConnectFacebookButton" alt="Connect to Facebook" />';
+ return '<img src="facebook/Images/connect.png" class="connect-facebook" alt="Connect to Facebook" />';
}
}
}
+
+ public function hasFacebook() {
+ return ($this->owner->FacebookID);
+ }
+
+ public function isConnected() {
+ $facebook = new Facebook(array(
+ 'appId' => FacebookCallback::get_facebook_id(),
+ 'secret' => FacebookCallback::get_facebook_secret()
+ ));
+
+ $user = $facebook->getUser();
+
+ return ($user);
+ }
+
+ public function getFacebookPages() {
+ if(!$this->hasFacebook())
+ return array();
+
+ $pages = array(
+ 'me/feed' => 'Personal Page'
+ );
+
+ $facebook = new Facebook(array(
+ 'appId' => FacebookCallback::get_facebook_id(),
+ 'secret' => FacebookCallback::get_facebook_secret()
+ ));
+
+ $user = $facebook->getUser();
+
+ if($user) {
+ try {
+ $resp = $facebook->api('/me/accounts', 'GET');
+
+ if(isset($resp->data)) {
+ foreach($resp->data as $app) {
+ if($app->category != "Application") {
+ $pages[$app->id] = $app->name . " <small>(". $app->category .")</small>";
+ }
+ }
+ }
+ } catch(FacebookApiException $e) {
+ SS_Log::log($e, SS_Log::ERR);
+ }
+ }
+
+ return $pages;
+ }
}
diff -urN --exclude=.piston.yml --exclude=.git --exclude=.svn /Users/Will/Sites/justsold/.facebook.tmp/javascript/facebook.js /Users/Will/Sites/justsold/facebook/javascript/facebook.js
--- /Users/Will/Sites/justsold/.facebook.tmp/javascript/facebook.js 2012-06-19 19:43:58.000000000 +1200
+++ /Users/Will/Sites/justsold/facebook/javascript/facebook.js 2012-06-19 19:41:02.000000000 +1200
@@ -2,18 +2,52 @@
(function($){
window.FacebookResponse = function(data) {
if(data.name) {
- $('#ConnectFacebookButton').replaceWith('Connected to Facebook user ' + data.name + '. <a href="' + data.removeLink + '" id="RemoveFacebookButton">Disconnect</a>');
+ $('.connect-facebook').replaceWith('Connected to Facebook user ' + data.name + '. <a href="' + data.removeLink + '" class="unconnect-facebook">Disconnect</a>');
+
+ // add all the possible pages the user could select
+ if(typeof data.pages === "object") {
+ var container = $(".facebook-groups");
+ container.html("");
+
+ var i = 0;
+
+ for(var value in data.pages) {
+ var label = data.pages[value];
+ var name = "PostToFacebookPages["+value+"]";
+ var item = $("<li></li>");
+ i++;
+
+ if(label) {
+ item.append($("<input type='checkbox' />").val(value).attr('name', name).attr('id', 'checkbox-fb-'+i));
+ item.append($("<label></label>").attr('for', 'checkbox-fb-'+i).html(label));
+
+ container.append(item);
+ }
+ }
+ }
}
+
+ $("body").trigger("authchanged");
};
- $('#ConnectFacebookButton').livequery('click', function (e) {
- window.open('FacebookCallback/FacebookConnect').focus();
+ $('.connect-facebook').live('click', function (e) {
+ var url = $("base").get(0).href;
+ url += 'FacebookCallback/FacebookConnect';
+
+ window.open(url).focus();
e.stopPropagation();
+
return false;
});
- $('#RemoveFacebookButton').livequery('click', function (e) {
+
+ $('.unconnect-facebook').live('click', function (e) {
$.get($(this).attr('href'));
- $(this).parent().html('<img src="facebook/Images/connect.png" id="ConnectFacebookButton" alt="Connect to Facebook" />');
- e.stopPropagation();
+
+ $('.unconnect-facebook').each(function(i, elem) {
+ $(elem).parent().html('<img src="facebook/Images/connect.png" class="connect-facebook" alt="Connect to Facebook" />');
+ });
+
+ $("body").trigger("authchanged");
+
return false;
});
}(jQuery));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment