加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

CakePHP – 保存一个会话变量会删除另一个

发布时间:2020-12-13 17:08:32 所属栏目:PHP教程 来源:网络整理
导读:我在Cake PHP中使用会话变量来存储我的相关用户Twitter和Facebook数据,当用户登录时,如果他已经链接了他的Twitter和FB帐户,则该信息被保存在我自己的用户数据旁边的会话变量中. 我有一个用户可以链接和取消链接所述社交网络数据的屏幕,问题如下: 假设我已连
我在Cake PHP中使用会话变量来存储我的相关用户Twitter和Facebook数据,当用户登录时,如果他已经链接了他的Twitter和FB帐户,则该信息被保存在我自己的用户数据旁边的会话变量中.

我有一个用户可以链接和取消链接所述社交网络数据的屏幕,问题如下:

假设我已连接两个网络,我决定断开与Facebook的连接,删除Facebook的会话变量.现在我希望重新连接到Facebook,我点击Connect按钮,Facebook数据被保存但由于某种原因它删除了Twitter变量.

我的流程的工作方式如下:

1)用户点击连接按钮.
2)用户被引导到社交网络身份验证.
3)用户被引导到一个获取所需数据的函数,将其保存在名为NetworkData的会话变量中,并被引导回他点击该按钮的页面.
4)提取NetworkData,在会话中设置为相应的社交网络(Facebook或Twitter)并从会话中删除.

代码如下:

这是用户登录Twitter或FB后的指示功能:

function retrieve_network($page) {
      $networkData = null;
      $this->autoRender = false;
      $this->layout = 'ajax';
      if(isset($_GET['oauth_token'])) {
        $token = $this->TwitterHelper->setOAuthToken($_GET['oauth_token']);
        $userinfo = $this->TwitterHelper->getTwitterUserInfo();
        $networkData = array(
          'TwitterData' => array(
            'username' => $userinfo['username'],'name' => $userinfo['name'],'token' => $token->oauth_token,'token_secret' => $token->oauth_token_secret
          )
        );
      } else if (isset($_GET['code'])) {
        $token = $this->FacebookHelper->facebook->getAccessToken();
        $userinfo = $this->FacebookHelper->getUserInfo();
        $networkData = array(
          'FacebookData' => array(
            'username' => $userinfo['username'],'email' => $userinfo['email'],'token' => $token,'link' => $userinfo['link'],)
        );
      }

      $this->Session->write('NetworkData',$networkData);

      if($page == 'settings') {
        $this->redirect(array('controller' => 'fonykers','action' => 'settings/networks'));
      }
    }

这是检索网络数据中的内容并将其设置为会话的函数:

function settings($tab) {
      $this->layout = 'frontend';  
      $this->Fonyker->recursive = -1;
      $this->TwitterData->recursive = -1;
      $this->FacebookData->recursive = -1;

      if(!$this->checkSessionCookie()) {
        $this->redirect(array('controller' => 'pages','action' => 'home'));
      }

      $fields = array(
        'Fonyker.id','Fonyker.username','Fonyker.name','Fonyker.email','Fonyker.gender','Fonyker.birthdate','Fonyker.image_url'
      );

      $fonyker = $this->Fonyker->find('first',array(
        'conditions' => array(
          'Fonyker.fonykid' => $this->Session->read('Fonyker.Fonyker.fonykid')
        ),'fields' => $fields
      ));


      $this->Fonyker->set($fonyker);

      $this->data = $fonyker;

      if($this->Session->read('NetworkData')) {
        $networkData = $this->Session->read('NetworkData');
        $this->Session->delete('NetworkData');  

        if($networkData['TwitterData']) {
          $networkData['TwitterData']['fonyker_id'] = $fonyker['Fonyker']['id']; 
          if($this->TwitterData->save($networkData)) {
            $this->Session->write('TwitterData',$networkData['TwitterData']);
          }
        } else if($networkData['FacebookData']) {
          $networkData['FacebookData']['fonyker_id'] = $fonyker['Fonyker']['id']; 
          if($this->FacebookData->save($networkData)) {
            $this->Session->write('FacebookData',$networkData['FacebookData']);
          }
        }
      }

      pr($this->Session->read());

      if(!$this->Session->read('TwitterData')) {
        $this->TwitterHelper->setTwitterObj();
        $this->set('twitterUrl',$this->TwitterHelper->twitterObj->getAuthorizeUrl(null,array('oauth_callback' => 'http://127.0.0.1/fonykweb/pages/retrieve_network/settings')));
      } else {
        $this->set('twitterUrl','#');
      }


      if(!$this->Session->read('FacebookData')) {
        $this->set('facebookUrl',$this->FacebookHelper->facebook->getLoginUrl(array('redirect_uri' => 'http://localhost/fonykweb/pages/retrieve_network/settings','scope' => 'email,user_birthday,publish_stream,offline_access')));
      } else {
        $this->set('facebookUrl','#');
      } 

      $this->set('tab',$tab);
    }

如果用户希望,这是删除网络的功能:

function remove_network($network) {
      $this->autoRender = false;
      $this->Fonyker->recursive = -1;
      $this->TwitterData->recursive = -1;
      $this->FacebookData->recursive = -1;
      $response = null;

      if($network == 'twitter') {
        $twitterData = $this->TwitterData->find('first',array(
          'conditions' => array(
            'TwitterData.fonyker_id' => $this->Session->read('TwitterData.fonyker_id')
          )
        ));

        if($this->TwitterData->delete($twitterData['TwitterData']['id'],false)) {
          $this->TwitterHelper->setTwitterObj();
          $twitterUrl = $this->TwitterHelper->twitterObj->getAuthorizeUrl(null,array('oauth_callback' => 'http://127.0.0.1/fonykweb/pages/retrieve_network/settings'));
          $this->Session->delete('TwitterData');
          $response = json_encode(array('ok' => true,'url' => $twitterUrl));
        } else {
          $response = json_encode(array('ok' => false)); 
        }
      }

      if($network == 'facebook') {
        $facebookData = $this->FacebookData->find('first',array(
          'conditions' => array(
            'FacebookData.fonyker_id' => $this->Session->read('FacebookData.fonyker_id')
          )
        ));

        if($this->FacebookData->delete($facebookData['FacebookData']['id'],false)) {
          $facebookUrl = $this->FacebookHelper->facebook->getLoginUrl(array('redirect_uri' => 'http://localhost/fonykweb/pages/retrieve_network/settings',offline_access'));
          $this->Session->delete('FacebookData');
          $response = json_encode(array('ok' => true,'url' => $facebookUrl));
        } else {
          $response = json_encode(array('ok' => false)); 
        }

      }

  echo $response; 
}

查看代码:

<script type="text/javascript">
  $(document).ready(function() {
    var splitUrl = window.location.href.split('/');
    $('#' + splitUrl[splitUrl.length - 1] + '-tab').addClass('active-tab');
    $('#' + splitUrl[splitUrl.length - 1] + '-tab').children().addClass('active-tab');
  });
</script>
<div class="prepend-1 prepend-top span-23">
<div class="tabs span-22">
  <ul>
    <li id="account-tab">
      <a href="<?php echo $html->url(array('controller' => 'fonykers','action' => 'settings'),true); ?>/account">
        Account
      </a>
    </li>
    <li id="password-tab">
      <a href="<?php echo $html->url(array('controller' => 'fonykers',true); ?>/password">
        Password 
      </a>
    </li>
    <li id="notifications-tab">
      <a href="<?php echo $html->url(array('controller' => 'fonykers',true); ?>/notifications">
        Notifications 
      </a>
    </li>
    <li id="networks-tab">
      <a href="<?php echo $html->url(array('controller' => 'fonykers',true); ?>/networks"> 
       Social Networks 
      </a>
    </li>
  </ul>
</div>
<div class="tab-content prepend-top prepend-1">
  <?php 
    if($tab == 'account') {
      echo $this->element('settings/account');
    } else if ($tab == 'password') {
      echo $this->element('settings/password');
    } else if ($tab == 'notifications') {
      echo $this->element('settings/notifications');
    } else {
      echo $this->element('settings/networks');
    }
  ?>
</div>
</div>

元素代码:

<script type="text/javascript">
  $(document).ready(function(){

    var deleteNetwork = function(network,button) {
      $.ajax({
        url: '<?php echo $html->url('/fonykers/remove_network/',true); ?>' + network,dataType: 'json',type: 'POST',success: function(response) {
          if(response.ok) {
            button.replaceWith('<a id="'+network+'-connect" class="connect-button connect" href="'+response.url+'" class="span-3">Connect</a>');
          }
        }
      });  
    }

    if($('#twitter-connect').attr('href') == '#'){
      $('#twitter-connect').addClass('connected');
      $('#twitter-connect').html('Connected');
    } else {
      $('#twitter-connect').addClass('connect');
      $('#twitter-connect').html('Connect'); 
    }

    if($('#facebook-connect').attr('href') == '#'){
      $('#facebook-connect').addClass('connected');
      $('#facebook-connect').html('Connected');
    } else {
      $('#facebook-connect').addClass('connect');
      $('#facebook-connect').html('Connect'); 
    }

    $('.connected').hover(
      function() { 
        $(this).removeClass('connected');
        $(this).addClass('disconnect');
        $(this).html('Disconnect')
      },function() {
        $(this).removeClass('disconnect');
        $(this).addClass('connected');
        $(this).html('Connected')
      }
    );

    $('#twitter-connect').click(function(event) {
      if($(this).attr('href') == '#') {
        event.preventDefault();
        deleteNetwork('twitter',$(this));
      }
    });

    $('#facebook-connect').click(function(event) {
      if($(this).attr('href') == '#') {
        event.preventDefault();
        deleteNetwork('facebook',$(this));
      }
    });

  });
</script>
<div class="span-4 prepend-top">
<div class="span-4">
  <div class="span-1">
    <?php echo $html->image('twitter-connect.png',array('alt' => 'Twitter','class' => 'span-1','style' => 'height:40px;width:40px')); ?>
  </div>
  <div class="span-3 last">
    <a id="twitter-connect" class="connect-button" href="<?php echo $twitterUrl; ?>" class="span-3"></a>
  </div>
</div>
<div class="span-4 prepend-top">
  <div class="span-1">
  <?php echo $html->image('facebook-connect.png','style' => 'height:40px;width:40px')); ?>
  </div>
  <div class="span-3 last">
    <a id="facebook-connect" class="connect-button" href="<?php echo $facebookUrl; ?>"></a>
  </div>
</div>
</div>

对不起,很长的帖子.

解决方法

在您假设在用户重新连接到特定服务时调用的retrieve_network操作中,您将覆盖NetworkData会话变量
如果您发现1个特定服务已连接到:

if(isset($_GET['oauth_token'])) {...}

要么

if(isset($_GET['code'])) {...}

您将$networkData设置为返回的服务对象,然后通过以下方式覆盖整个会话:

$this->Session->write('NetworkData',$networkData);

在您的代码之后,我将始终检查现有服务当前是否在会话中,如果不是,则不会覆盖整个会话,只需将特定数据添加到现有NetworkData会话数组:

if($this->Session->read('NetworkData.TwitterData')){
    $facebookData = array(
                'username' => $userinfo['username'],);
    $this->Session->write('NetworkData.FacebookData',$facebookData);
}

注意:这只是一个示例,说明如何实现这一目标.对于这种特殊情况,我会用更好的逻辑重构该方法,可能将TwitterData和FacebookData存储在它们自己的独立数组中,而不是更大的更复杂的NetworkData数组.此外,您可以通过$this-> params [‘url’] [‘paramname’]访问$_GET参数来维护cakePHP约定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读