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
    }
}

これにアプローチする最良の方法は何ですか?

ありがとう

4

5 に答える 5

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

于 2012-05-02T02:06:56.103 に答える
11
class LoginForm extends CFormModel
{
    public $username;
    public $password;
}

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

$form には 2 つの必須フィールドがあります。

于 2013-03-12T09:13:25.480 に答える
4

1 つのアプローチは、カスタム検証規則を使用することです。たとえば、ルールは次のとおりです。

array('colour', 'requiredOnHasColour'),

そして、同じモデル クラスのバリデータ メソッド:

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

詳細:独自の検証ルールを作成する

于 2012-05-02T02:21:19.917 に答える
1

より複雑なロジックを実行したい場合、シナリオではニーズが満たされない可能性があります。次に、メソッド init をオーバーライドし、そこで検証ルールを定義するすべてのロジックを実行して、結果を $validationRules 配列に追加できます。そして、in rules() メソッドでは、その配列を返すだけです。そんな感じ:

 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;
    }
}
于 2014-04-26T10:25:35.560 に答える