2012-05-01 27 views
7

मान लें कि मेरे पास एक उत्पाद है जिसमें रंग हो सकता है। उत्पाद प्रकार के आधार पर, रंग फ़ील्ड आवश्यक हो सकता है या नहीं भी हो सकता है।वाईआई - नियंत्रक से नियमों को गतिशील रूप से बदलें

तो रंग हमेशा आवश्यक होता है, मैं उत्पाद मॉडल

public function rules() 
{ 
    return array(
     array('colour', 'required') 
    ); 
} 

हालांकि में निम्नलिखित होंगे, मैं इस उत्पाद प्रकार के आधार पर गतिशील होना चाहता हूँ।

क्या यह नियंत्रक में किया जाना चाहिए?

public function actionOrder() { 
    // .... 
    if ($product->HasColour) { 
     // set the colour validation to be required 
    } else { 
     // set the colour validation to be not required 
    } 
} 

इस दृष्टिकोण का सबसे अच्छा तरीका क्या है: मैं नियंत्रक में निम्नलिखित की तरह कुछ होने कल्पना कर सकते हैं?

धन्यवाद

+0

यदि यह किसी उत्पाद प्रकार के लिए विशिष्ट है, तो मॉडल में ऐसा किया जाना चाहिए, मॉडल में किया जाना चाहिए। – Zombaya

+0

लेकिन यदि आप अपने मान्य फॉर्मिनपुट को अपने नियंत्रक में कर रहे हैं तो भी सही है। तो मुझे लगता है कि आप यहां गलतियां नहीं कर रहे हैं। – Zombaya

+0

मॉडल तब तक उत्पाद को नहीं जानता जब तक actionOrder() निष्पादित नहीं किया जाता है, नहीं? –

उत्तर

15

आप परिदृश्य का उपयोग कर सकते हैं। मॉडल में:

class Model extends CActiveRecord { 
    // .... 
    public function rules() { 
     return array(
      array('colour', 'required', 'on' => 'hasColour') 
     ); 
    } 
    // .... 
} 

और नियंत्रक में:

public function actionOrder() { 
    // .... 
    $model = new Product(); 
    if ($product->HasColour) { 
     $model->setScenario('hasColour'); 
    } 
} 

तो, आवश्यक रंग जब मॉडल के परिदृश्य है hasColour

+1

यह मेरे लिए काम करता है। धन्यवाद! –

+0

केवल समस्या यह है कि यह लेबल पर तारांकन '*' नहीं जोड़ता है :( – user2636556

4

एक दृष्टिकोण सत्यापित किया जाएगा, एक कस्टम सत्यापन नियम का प्रयोग है। उदाहरण के लिए, नियम:

array('colour', 'requiredOnHasColour'), 

और फिर सत्यापनकर्ता विधि एक ही मॉडल कक्षा में:

public function requiredOnHasColour($attribute, $params) { 
    if ($this->hasColour && $this->$attribute == null) 
     $this->addError($attribute, 'Colour is required.'); 
} 

और जानकारी: Create your own validation rule

8
class LoginForm extends CFormModel 
{ 
    public $username; 
    public $password; 
} 

$form = new LoginForm(); 
$form->validatorList->add(
    CValidator::createValidator('required', $form, 'username, password') 
); 

अब $ प्रपत्र दो आवश्यक फ़ील्ड है।

+0

यह वास्तव में प्रश्न को संबोधित नहीं करता है। उपयोगकर्ता उन परिदृश्यों को कैसे संभालने के लिए कह रहा है जहां कुछ डेटा एक में आवश्यक है लेकिन दूसरे में नहीं है और लेने का सबसे अच्छा तरीका क्या है। – Ren

0

यदि आप अधिक जटिल तर्क करना चाहते हैं, तो परिदृश्य आपकी आवश्यकताओं को पूरा नहीं कर सकता है। फिर आप विधि init को ओवरराइड कर सकते हैं और उन सभी तर्कों को कर सकते हैं जो सत्यापन नियमों को परिभाषित करते हैं, परिणाम $ प्रमाणीकरण नियम सरणी में जोड़ते हैं। और नियमों() विधि में आप बस उस सरणी को वापस कर देते हैं। ऐसा कुछ:

class Person extends CActiveRecord 
{ 
    public function init(){ 
     if(TRUE){ 
      $this->validationRules[] = array('first_name','required'); 
      $this->validationRules[] = array('last_name','required'); 
     } 

    } 

    public $validationRules = array(
     array('email', 'required'), 
     array('email, email1, email2, email3', 'email', 'message'=>'Email format is invalid'), 
     array('email, address, email1, email2, email3', 'length', 'max'=>255), 

    ); 

    public function rules() 
    { 
     return $this->validationRules; 
    } 
} 
संबंधित मुद्दे