Created
June 19, 2012 07:49
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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