CakePHP – 保存一个会话变量会删除另一个
我在Cake
PHP中使用会话变量来存储我的相关用户Twitter和Facebook数据,当用户登录时,如果他已经链接了他的Twitter和FB帐户,则该信息被保存在我自己的用户数据旁边的会话变量中.
我有一个用户可以链接和取消链接所述社交网络数据的屏幕,问题如下: 假设我已连接两个网络,我决定断开与Facebook的连接,删除Facebook的会话变量.现在我希望重新连接到Facebook,我点击Connect按钮,Facebook数据被保存但由于某种原因它删除了Twitter变量. 我的流程的工作方式如下: 1)用户点击连接按钮. 代码如下: 这是用户登录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约定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |