2013-11-21 4 views
6

अपडेट करने से कुछ विशेषताओं को छोड़ दें, मुझे कुछ मूल्य अपडेट करना बंद करना होगा, यहां तक ​​कि वे पोस्ट सरणी पर सेट हैं। ऐसा करने के लिए मैं yii नियमों में असुरक्षित उपयोग कर रहा हूँ।अपडेट पर, yii

array('id', 'unsafe', 'on'=>'update'), 

अभी भी इसके साथ, मैं आईडी को अद्यतन करने से छोड़ने में असमर्थ हूं।

यह yii के साथ कैसे किया जा सकता है?

नीचे

मेरे नियमों समारोह ..

public function rules() 
{ 
    // NOTE: you should only define rules for those attributes that 
    // will receive user inputs. 
    return array(
     array('name, body, created_date', 'required'), 
     array('name', 'length', 'max'=>128), 
     array('body', 'length', 'max'=>512), 
     array('id', 'unsafe', 'on'=>'update'), 
     // The following rule is used by search(). 
     // @todo Please remove those attributes that should not be searched. 
     array('id, name, body, created_date', 'safe', 'on'=>'search'), 
    ); 
} 

अद्यतन है 1

$ मॉडल> ​​गुण = $ _POST [ 'उपयोगकर्ता'];

और मैं जब बचत, कुछ विशेषताओं को छोड़ने के लिए की जरूरत है।

$ मॉडल-> सहेजें();

+1

क्या आप अपना अपडेट फ़ंक्शन जोड़ सकते हैं? – secretlm

+0

@secretlm यह एक समारोह नहीं है। यह एक परिदृश्य है। – dev1234

+0

"मुझे कुछ मूल्य अपडेट करने की आवश्यकता है, यहां तक ​​कि वे पोस्ट सरणी पर सेट हैं" => मैं उस कोड को देखना चाहता हूं जिसे आपने "अपडेट" एक्शन में मॉडल के गुणों के लिए मान सेट किया है। – secretlm

उत्तर

2

आप अपने नियंत्रक में नए मॉडल उदाहरण बना रहे हैं आप अगर अपने घोषणा इस

$myModelInstance = new MyModel(); 

की तरह कुछ आप

के लिए इसे बदल करने की आवश्यकता होगी था उदाहरण के लिए परिदृश्य घोषित करने के लिए की आवश्यकता होगी
$myModelInstance = new MyModel('update'); 

हालांकि यदि आप इसे सहेजने के लिए सक्रिय रिकॉर्ड्स के किसी भी खोज विधियों का उपयोग कर रहे हैं तो यह स्वचालित रूप से यहां "अपडेट" पर सेट हो जाता है: http://www.yiiframework.com/doc/api/1.1/CActiveRecord#save-detail

अगर आप मॉडल आप बस setScenario समारोह

$myModel->setScenario("update"); 
1

Manquer से उल्लेख किया है, अपने परिदृश्य शायद अद्यतन करने के लिए सेट नहीं है का उपयोग कर सकते घोषित करने के लिए कुछ अन्य तर्क का प्रयोग कर रहे हैं। एक सही अद्यतन अनुक्रम में मौजूदा ऑब्जेक्ट इंस्टेंस को लोड करना, चर निर्दिष्ट करना और फिर उन्हें सहेजना शामिल होगा। मैं व्यक्तिगत रूप से किसी ऑब्जेक्ट को तुरंत चालू नहीं करता और इसे एक अलग परिदृश्य नहीं देता, मुझे लगता है कि मुद्दों के लिए पूछ रहा है।

// Load the existing object first 
$user = User::model()->findByPk(..); 
// Assign everything that has either a validation rule or is added as "safe" 
$user->attributes = $_POST['User']; 
// Save the updated version 
$user->save(); 

वाईआई 'आईडी' को अपडेट नहीं करना जानता है (यदि इसे आपके डेटाबेस में प्राथमिक कुंजी के रूप में सही ढंग से परिभाषित किया गया है)। इसे असुरक्षित के रूप में चिह्नित करने की आवश्यकता नहीं है। तो: सुनिश्चित करें कि उदाहरण डीबी से लोड किया गया था ($ user-> isNewRecord गलत होना चाहिए) और तालिका में एक पीके है। और उसके बाद इच्छित गुणों को अपडेट करें।

आप केवल $ _POST को "सफाई" करके विशिष्ट विशेषताओं को अपडेट कर सकते हैं या जब आप कॉल को कॉल करते हैं तो इसे केवल $ user-> save (true, array ('name', 'body') के रूप में कॉल करें) केवल अपडेट करने के लिए उदाहरण के लिए नाम और शरीर।

+0

तो वहाँ कोई दूसरा रास्ता नहीं की तरह, एक असुरक्षित सरणी असुरक्षित ('आईडी', 'CREATED_DATE') चल रहा है और विशेषताओं को असुरक्षित सरणी में हैं जोड़ा नहीं किया जाएगा या अपडेट किए गए और पुराने के साथ रहेगा डीबी में मूल्य। ऐसा कुछ भी जो मॉडल स्तर से किया जाता है? – dev1234

+1

चूंकि आपने "अपडेट" परिदृश्य पर असुरक्षित सत्यापनकर्ता जोड़ा है, इसलिए आपको यह सुनिश्चित करना होगा कि आपका मॉडल उस परिदृश्य में है, जिस तरह से मैनकर ने आपको दिखाया था। मैं वास्तव में ActiveRecord पैटर्न का उपयोग करके आप का बिंदु नहीं देखता (जैसा कि आप सबकुछ बाधित कर रहे हैं :))। आप बस डीएओ एक्सेस का उपयोग करना चाहते हैं (Yii :: ऐप() -> डीबी-> createCommand आदि) – Blizz

+0

धन्यवाद। इस सवाल पर कुछ कहना है? http://stackoverflow.com/questions/20142553/model-exist-or-not-in-yii-using-a-custom-function-performance – dev1234