Cakephp Facebook插件 - 通过动作分享

时间:2012-05-04 16:50:23

标签: facebook cakephp cakephp-1.3 sharing

我正在使用Nick Baker的(webtechnick)CakePHP / Facebook插件,该插件非常棒且效果很好,但我有一个问题,我似乎无法接近回答。

如何绕过使用共享按钮并直接通过操作共享?

例如,我通过我的网站发帖,帖子就像应该添加到数据库中,它还通过动作向登录用户的Twitter帐户发送帖子。如何将此操作句柄共享到我的FB帐户(已建立连接)。我尝试了第一件事,我认为任何人都会在行动中直接尝试$ this-> Facebook-> share(),也无济于事......

任何想法或解决方案都会有很大的帮助......

更新后更新

Thx for the help spooney。我投了你的答案,因为你可以从我所知道的100%看到。我正在加载JS SDK。

    function init($options = null, $reload = true) {
        if (empty($options)) {
            $options = array();
        }
        if ($appId = FacebookInfo::getConfig('appId')) {
            $session = json_encode($this->Session->read('FB.Session'));
            if ($reload) {
                $callback = "FB.Event.subscribe('auth.login',function(){window.location.reload()});";
            } else {
                $callback = "if(typeof(facebookReady)=='function'){facebookReady()}";
            }
            $callback .= "FB.Event.subscribe('auth.logout',function() {window.location = '/bastards/users/logout'});";
            $init = '<div id="fb-root"></div>';
            $init .= $this->Html->scriptBlock(
<<<JS
window.fbAsyncInit = function() {
    FB.init({
        appId : '{$appId}',
        status : true, // check login status
        cookie : true, // enable cookies to allow the server to access the session
        xfbml : true, // parse XFBML
        oauth : true // use Oauth
    });
    {$callback}
};
(function() {
    var e = document.createElement('script');
    e.src = document.location.protocol + '//connect.facebook.net/{$this->locale}/all.js';
    e.async = true;
    document.getElementById('fb-root').appendChild(e);
}());
JS
            , $options);
            return $init;
        } else {
            return "<span class='error'>No Facebook configuration detected. Please add the facebook configuration file to your config folder.</span>";
        }
    }

我可以毫不费力地提取用户信息并处理所有这些信息。我已经完成了从我的网站发布到FB,但它只是通过链接,使用FB.ui ...

    <a href="#" onClick="publishStory();" class="sendFeed"><br><font style="color:#FFF; text-decoration:none;padding-left:27px;">post to wall</font></a><br>
<script>
function publishStory() {
  FB.ui({
    method: 'feed',
    name: 'message name',
    caption: 'message caption ',
    description: 'description goes here',
    link: 'the url current page',
    picture: 'if you want to add an image'
  }, 
  function(response) {
    console.log('publishStory response: ', response);
  });
  return false;
}
</script>

我尝试用...替换上面的代码。

    <a href="#" onClick="publishStory();" class="sendFeed"><br><font style="color:#FFF; text-decoration:none;padding-left:27px;">post to wall</font></a><br>
<script>
function publishStory() {
  var body = 'Reading JS SDK documentation';
FB.api('/me/feed', 'post', { message: body }, function(response) {
  if (!response || response.error) {
    alert('Error occured');
  } else {
    alert('Post ID: ' + response.id);
  }
});
}
</script>

但每次都会出错。

我还应该在那里说,用户FB墙上的帖子并不真正来自网站persay,这是用户在自己墙上的帖子基本上说明,“我在ladala.com上发了帖子,你应该去看看。“

所以现在我需要弄明白如何通过提交帖子的动作来运行FB.ui。

1 个答案:

答案 0 :(得分:1)

根据我们的谈话,我想我会在答案中加上更完整的描述。

您可以使用JavaScript SDK发起共享呼叫。

首先,您需要按https://developers.facebook.com/docs/reference/javascript/的“加载”部分所述加载JavaScript SDK。

加载到您的页面后,您要查看的两个调用是FB.getLoginStatus和FB.api。 FB.getLoginStatus将返回一个回复,告诉您用户是否已登录到Facebook,以及他们是否已批准您的应用程序。 This link将描述getLoginStatus的功能,但简而言之,您需要检查response.connected(如果需要,可能会再次调用以确认用户的权限)。

如果用户已登录并已批准您的应用,则可以尝试使用FB.api拨打API。请记住,您可能需要用户允许publish_stream权限。

您的代码看起来像这样:

//Do FB initialization
FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    FB.api('/me/feed', 'post', { message: body }, function(response) {
      if (!response || response.error) {
        //Post was successful
      }
    });
  }
});

这可以按照您想要的任何方式触发。在页面加载,点击,完成其他一些事件等

请记住,这只是实现此目的的一种方法。此外,如果您尝试与FB应用程序共享某些内容并且它无法正常工作,则应确认您具有执行此操作所需的所有权限。