2012-11-18 13 views
14

जब मैं उपयोगकर्ता मॉडल में डेटा अपडेट करता हूं, तो ऑथ डेटा अपडेट नहीं होता है।केकफ़्पी 2.0 ऑथ डेटा कैसे अपडेट करें?

मैं इस डेटा को "रीफ्रेश" कैसे कर सकता हूं-> Auth-> उपयोगकर्ता() जब मैं उपयोगकर्ता मॉडल अद्यतन कर रहा हूं?

और मैं

$ this-> Auth-> लॉगिन ($ डेटा) का उपयोग नहीं करना चाहते हैं,

$this->Session->write('Auth.User', $data); 

CakePHP 2.x इससे पहले कि आप मॉडल में ऐसा नहीं कर सकते बिना ढांचे डिजाइन को तोड़ने:

मेरे उपयोगकर्ता तालिका

उत्तर

24

मैंने निम्न पंक्ति की कोशिश की। इसका काम करता है अच्छी तरह से मुझे फार्म के बाद संशोधित उपयोगकर्ता डेटा मैं निम्न पंक्ति

$this->Session->write('Auth', $this->User->read(null, $this->Auth->User('id'))); 
+1

आपको ऑथ घटक के आसपास काम करने की कोशिश नहीं करनी चाहिए। यदि वहां सत्र सत्र बदल जाएंगे, तो आप तुरंत समाधान करेंगे। – func0der

+0

डाउन-वोट क्योंकि कुछ ऐसा करने का सही तरीका यह है: '$ this-> Auth-> लॉगिन ($ newUserData);' func0der का उत्तर देखें। –

+0

इसकी कुछ चीज फिर से उपयोगकर्ता को प्रमाणीकृत करने की आवश्यकता है, पहले से ही उपयोगकर्ता लॉग इन है, तो क्या यह अनुशंसित तरीका है कृपया मुझे बताएं @deceze [~ deceze] – AnNaMaLaI

7

अद्यतन करने सत्र जैसे के लिए अद्यतन डेटा लिखें के बाद ।

केकपीएचपी 2.x के साथ आप मॉडल से सत्र घटक लोड कर सकते हैं और इसे अपडेट कर सकते हैं।

+1

मैं उपयोगकर्ता कि नीचे इस मतदान से एक टिप्पणी प्राप्त करना चाहते हैं। कोई प्रतिक्रिया क्यों न दें। –

+0

मैंने ऐसा नहीं किया, लेकिन यह वही जवाब है, मैंने @ अन्नामलाई को सोमासुंदरम को दिया है: http://stackoverflow.com/questions/13440820/cakephp-2-0-how-to-update-auth- डेटा/13443607 # टिप्पणी 63042801_13559136 – func0der

5

evert0ns उत्तर सही है। लेकिन आपको AuthComponent :: लॉगिन() का उपयोग करना चाहिए, क्योंकि डेटा AuthComponent के भीतर भी सहेजा जाता है और हर बार सत्र से नहीं लिया जाता है।

मुझे कुछ दिन पहले समस्या थी।

// AppController.php 
/** 
* Renews current user data, e.g. in case of an email address change while being logged in. 
* 
* @param array $newUserData 
* @return void 
*/ 
    protected function renewUserSession($newUserData){ 
      if(!isset($newUserData) || empty($newUserData)){ 
        return; 
      } 

      // We need to fetch the current user data so custom indexes are copied 
      $currentUserData = $this->Auth->user(); 
      if(!isset($currentUserData) || empty($currentUserData)){ 
        return; 
      } 

      // Merge old with new data 
      $newUserData = array_merge($currentUserData, $newUserData); 

      // Login with new data 
      $this->Auth->login($newUserData); 
    } 

स्रोत: my paste

अपने AppController में इस रखो। यह तरीका मौजूदा कस्टम इंडेक्स को रखने के लिए वर्तमान और नए उपयोगकर्ता डेटा को मर्ज करने के लिए विशिष्ट है जो आपने प्रदान किया हो। मुझे इसकी ज़रूरत थी, लेकिन आप इसे छोड़ सकते हैं। अद्यतन उपयोगकर्ता डेटा को विधि के पैरामीटर के रूप में दें। मॉडल में फॉर्म नहीं है। ईजी .:

$data = array(
    'User' => array(
     'username' => 'bla', 
     'passwort' => 'fu', 
     'email' => '[email protected]' 
    ) 
); 

// Wrong 
$this->renewUserSession($data); 

// Right 
$this->renewUserSession($data['User']); 
+0

'array_merge()' हाइलाइट होना चाहिए। – Fr0zenFyr

+0

@ Fr0zenFyr मुझे यह नहीं मिलता कि आप यहां से क्या चाहते हैं। ^^ – func0der

+0

मुझे कुछ भी नहीं चाहिए, बस यह इंगित कर रहा था कि 'session_merge()' वास्तविक सत्र को जोड़ने के लिए उपयोग किया जाता है और नए मान किसी भी ओवरराइटिंग से बचने के लिए आपके समाधान का नायक है। चीयर्स! – Fr0zenFyr

0

मैं इस समस्या User मॉडल में afterSave समारोह का उपयोग कर हल लिखा। अगर हम किसी भी क्षेत्र से उपयोगकर्ता मॉडल अपडेट करते हैं तो यह ठीक काम कर रहा है। मेरे कोड के रूप में नीचे था:

class User extends AppModel { 
    ... ... ... 
    public function afterSave($created, $options = array()){ 
     parent::afterSave($created,$options); 

     //updating authentication session 
     App::uses('CakeSession', 'Model/Datasource'); 
     CakeSession::write('Auth',$this->findById(AuthComponent::user('id'))); 

     return true; 
    } 
    ... ... ... 
} 
+1

क्या होगा यदि उपयोगकर्ता मॉडल ब्राउज़र सत्र से बाहर संशोधित किया गया था? एक शेल स्क्रिप्ट या cronjob में पसंद है? –

+1

@ अन्नामलाई। सोमासुंदरम उत्तर पर टिप्पणी देखें। सत्र को सीधे संशोधित न करें। – func0der

0

मुझे लगता है कि func0der का जवाब अच्छा है, लेकिन यह सुधार किया जा सकता है:

protected function renewLogin() { 
    if(!empty($this->Auth->user())) { 
     $this->loadModel('User'); 
     $this->User->contain(false); 
     $user = $this->User->read(null, $this->Auth->user('id'))['User']; 
     unset($user['password']); 
     $this->Auth->login($user); 
    } 
} 

आप अपने AppController.php को यह जोड़ सकते हैं और संशोधित करने के बाद किसी भी नियंत्रक से उपयोग कर सकते हैं लॉग इन उपयोगकर्ता।

मुझे विश्वास है कि यह बहुत साफ है और भले ही यह डेटाबेस तक पहुंच का तात्पर्य है, मुझे लगता है कि यह अक्सर एक मुद्दा होने के लिए निष्पादित नहीं किया जा रहा है।

आपको हमेशा "केक" तरीके से काम करने की कोशिश करनी चाहिए। और एक सत्र चर संपादन जैसे शॉर्टकट से बचें। यह लंबे समय तक आपके लिए चीजों को आसान बना देगा।

टिप्पणी और जोड़ें अपनी राय :)

0

मुझे लगता है कि यह करने के लिए आसान तरीका है:

$user = $this->Auth->user(); 
$user['attribute'] = $newValue; 
$this->Auth->setUser($user); 
+0

यह 2.x नहीं है! – mark

संबंधित मुद्दे