2012-11-23 10 views
9

enter image description hereमैं वाईआई ढांचे में केवल कुछ फ़ील्ड कैसे अपडेट कर सकता हूं?

मैं अद्यतन करने के लिए पासवर्ड fields.how password.So के लिए md5 एनकोड का उपयोग कर this.Im उपयोग करने के लिए मैं Yii framework.any मदद में पासवर्ड फ़ील्ड अद्यतन करने के लिए सराहना की चाहते हैं न चाहते न ??

उत्तर

5

अपने मॉडल में आप कुछ इस तरह करना चाहिए:

public function rules() { 
    return array(
     array('name, username, email, password', 'required', 'on' => 'create'), 
     array('name, username, email', 'required', 'on' => 'update'), 
    ); 
} 

का कहना है कि परिदृश्य है कि अब आप चलाने के अद्यतन है देता है। इसलिए मुझे वहां पासवर्ड की आवश्यकता नहीं है। मुझे केवल उस परिदृश्य परिदृश्य में इसकी आवश्यकता है जो आपके पास हो।

$model->setScenario('update'); 

तो यह पासवर्ड की आवश्यकता नहीं होगी और यह एक ही रहेगा: क्या आप पासवर्ड फ़ील्ड को हटाने और कार्रवाई है कि आप अंदर आप शामिल इस राशि उस दृश्य फ़ाइल में तो।

पासवर्ड बदलने के लिए आप एक नई क्रिया (उदा। ActionPassChange) बना सकते हैं जहां आपको दो बार नया पासवर्ड टाइप करने की आवश्यकता होगी।

+0

ब्रो आपकी मदद के लिए धन्यवाद। लेकिन यह –

+0

पर काम नहीं कर रहा है यदि आप परिदृश्य विकल्पों का पालन करते हैं तो अब आपके द्वारा चलाए जाने वाले क्रिया के लिए आपको $ मॉडल लोड करने के बाद परिदृश्य सेट करना होगा। दृश्य से पासवर्ड फ़ील्ड को हटाकर सत्यापन को इस विशेषता की आवश्यकता नहीं होगी। अपनी समस्या का बेहतर विचार रखने के लिए कृपया अपनी त्रुटि निर्दिष्ट करें। –

+0

क्या आप मुझे ब्रीफली समझा सकते हैं ?? –

2
$model->attributes=$_POST['JbJsJobResume']; 

असाइन करने के बजाय सभी विशेषताओं सिर्फ आवंटित उन केवल आप सहेजना चाहते हैं रूप

$model->name=$_POST['JbJsJobResume']['name']; 
$model->save(); 
+0

$ model-> name = $ _ POST ['JbJsJobResume' ] [ 'नाम']; चाहे ['name'] डीबी फ़ील्ड नाम या फॉर्म फ़ील्ड नाम है? –

+0

$ मॉडल> ​​नाम यहाँ नाम तालिका स्तंभ नाम और $ _POST [ 'JbJsJobResume'] [ 'नाम'] है; फॉर्म डेटा है। print_r ($ _ POST) और डेटा पोस्ट वैरिएबल में खोजें। – Hemc

7

, मुझे लगता है कि एक बेहतर दृष्टिकोण इस मामले में परिदृश्य का उपयोग नहीं करने के लिए किया जाएगा। नियमों में अगला कोड केवल परिदृश्य को कहता है: अगले फ़ील्ड आवश्यक हैं। लेकिन नहीं: अन्य छोड़ें।

array('name, username, email', 'required', 'on' => 'update'), 

उदाहरण के लिए, अगर हम 32 अक्षर तक पासवर्ड की लंबाई की सीमा है, लेकिन एक डेटाबेस में एक प्रारूप SHA1 (लंबाई 40) में जमा हो जाती है, तो हम एक समस्या है क्योंकि सत्यापनकर्ता डेटाबेस को अवरुद्ध कर देगा है क्वेरी। ऐसा इसलिए है क्योंकि जब आप अपडेट करते हैं, तो "वैध" विधि सभी वर्ग गुणों (डेटाबेस तालिका मैपिंग का संबंध देती है) की जांच करती है, न केवल पोस्ट द्वारा वितरित किए गए नए।

"saveAttributes" विधि का उपयोग कर सकता है, लेकिन फिर मैंने एक और समस्या देखी। यदि कॉलम "ईमेल" डेटाबेस में अद्वितीय है और यदि संपादित ईमेल मौजूदा में से एक डुप्लिकेट करता है, तो नियमों में परिभाषित वाईआई संदेश प्रणाली अधिसूचना नहीं दे सकती है और डेटाबेस क्वेरी के संबंध में त्रुटि कोड फेंकता है।

मुझे लगता है कि सबसे आसान तरीका यह है: इस मामले में परिदृश्य सेट न करें। बस अपनी इच्छित संपत्तियों के तर्क के रूप में भेजें। यह जीआईआई द्वारा बनाई गई सभी सीआरयूडी सुविधाओं को बनाए रखेगा।

public function rules() { 
    return array(
     array('name, username, email, password', 'required'), 
    ); 
} 

(नियंत्रक में)

if($id==Yii::app()->user->id){ 
    $model=$this->loadModel($id); 
    if(isset($_POST['JbJsJobResume'])) { 
     $model->attributes=$_POST['JbJsJobResume']; 
     if($model->save(true, array('name', 'username', 'email'))) 
      $this->redirect(array('view','id'=>$model->id)); 
    } 

    $this->render('update',array('model'=>$model,)); 
} 

(मॉडल में) मैंने देखा है कि आप RBAC का उपयोग नहीं करते:

अपने कोड में यह इस तरह दिखता है। यह बहुत सुविधाजनक और लचीला है - इसे आजमाएं।सेट करने से पहले

http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#role-based-access-control

+0

बस एक सिर ऊपर है कि saveAttributes() के आंकड़ों पर मान्यता नहीं करता है सहेजा जा रहा है। – crafter

+0

आकर्षण +1 की तरह मेरे लिए काम किया :) – Pupil

1

1 विकल्प बस को सेट किए बिना पासवर्ड फील्ड:

function update(){ 
    $model=$this->loadModel($id); 
    unset($_POST['JbJsJobResume']['password']); 
    $model->attributes=$_POST['JbJsJobResume']; 
    $model->save(); 
} 

2 विकल्प: उपयोग अस्थायी चर:

function update(){ 
    $model=$this->loadModel($id); 
    $temPassword = $model->passwrod; 
    $model->attributes=$_POST['JbJsJobResume']; 
    $model->passwrod = $temPassword; 
    $model->save(); 
} 

3 विकल्प: का उपयोग scenarios

1

मैं मुझे यकीन नहीं है कि यह एक समस्या क्यों है, और कुछ कोड ई हमें समझने में मदद कर सकता है क्यों। यदि आप पासवर्ड को कैप्चर/अपडेट नहीं करना चाहते हैं, तो फॉर्म में पासवर्ड फ़ील्ड क्यों है?

यदि आप दृश्य से पासवर्ड फ़ील्ड हटाते हैं, तो पासवर्ड फ़ील्ड का मान वापस नियंत्रक पर पोस्ट नहीं किया जाएगा और फिर इसे अपडेट नहीं किया जाएगा।

यह संभव है कि उपरोक्त विधि काम नहीं करता है और यह हो सकता है कि अपने उपयोगकर्ता मॉडल में, आप afterValidate विधि ?:

protected function afterValidate() 
{ 
    parent::afterValidate(); 
    $this->password = $this->encrypt($this->password); 
} 

public function encrypt($value) 
{ 
    return md5($value); 
} 

इस परिदृश्य में में पासवर्ड को एनक्रिप्ट कर रहे हैं, अगर आप को दूर है दृश्य से पासवर्ड फ़ील्ड, और बस नाम, उपयोगकर्ता नाम या ईमेल अपडेट करें, फिर पासवर्ड का md5 हैश स्वचालित रूप से फिर से धोया जाएगा और आप वास्तविक पासवर्ड खो देंगे।

इसके आसपास जाने का एक तरीका एमडी 5 को बाद में वैध विधि (बनाएं या अपडेट करें) में पासवर्ड है, हालांकि यदि उपयोगकर्ता प्रोफाइल विवरण बदलना चाहता है, तो उसी फॉर्म में, उपयोगकर्ता को अपना पासवर्ड दोबारा सत्यापित करने के लिए कहें।

  1. फार्म: उपयोगकर्ता का नाम बदल कर और पासवर्ड
  2. फार्म तैनात
  3. नियंत्रक प्रमाणित प्रणाली को बुलाती है सत्यापित करता है।
  4. अगर सही प्रमाणित करते हैं, (सत्यापित पीडब्लू सहित) उपयोगकर्ता तालिका में प्रवेश
-1

के ऊपर लिख मुझे लगता है कि @ ग्रेवी के जवाब सही है, धन्यवाद ग्रेवी और निकोस Tsirakis। मैंने @faizphp के रूप में लगभग एक ही समस्या तय की है। मैं उपयोगकर्ता मॉडल के लिए परिदृश्य जोड़ता हूं क्योंकि निकोस सिराकिस ने कहा, लेकिन एक ही समस्या भी मिली। तब मैंने पाया कि मैं User.afterValidate में पासवर्ड एन्क्रिप्ट करता हूं, इसलिए हर बार उपयोगकर्ता मॉडल को अपडेट करते समय, प्रोग्राम गलत पासवर्ड पर डेटाबेस में पासवर्ड एन्क्रिप्ट करता है। तो मैं

protected function afterValidate() 
{ 
     parent::afterValidate(); 
     if (!$this->hasErrors() && $this->scenario==="create") 
      $this->password = $this->hashPassword($this->password); 
} 

को

protected function afterValidate() 
{ 
     parent::afterValidate(); 
     if (!$this->hasErrors()) 
      $this->password = $this->hashPassword($this->password); 
} 
</code> 


से मेरी समारोह बदल दिया है। यह काम लगता है।

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