3

アプリケーションで複数のシナリオを使用していますが、最後のシナリオが最初のシナリオを上書きするたびに問題に直面しています。


モデル:

public function rules()
{
    return array(
      [...]
      array('cost_spares', 'cost_spare_func', 'match',
        'pattern' => '/^[a-zA-Z]+$/',
        'message' => 'Do not enter zero or/and characters for Spare parts!',
        'on' => 'cost_spare_func'),
      array('cost_labour', 'cost_labour_func', 'match',
        'pattern' => '/^[a-zA-Z]+$/',
        'message' => 'Do not enter zero or/and characters for Labour Charges!',
        'on' => 'cost_labour_func'),
    );
}

コントローラー:

public function actionUpdate ($id)
{ 
  if (isset($_POST['TblEnquiry']))
  {
     [...]
     $model->setScenario('cost_spare_func');
     $model->setScenario('cost_labour_func');
  }
}
4

1 に答える 1

9

ドキュメントに関して:

まず、シナリオが割り当てられていないルールはすべてのシナリオに適用されることに注意してください。

したがって、シナリオは必要なく、一般的なルール/検証を使用するだけでよいと思います。

また

次のようなルールのシナリオが 1 つあります。

public function rules()
{
    return array(
      [...]
      array('cost_spares','numerical',
        'integerOnly' => true,
        'min' => 1,
        'max' => 250,
        'tooSmall' => 'You must order at least 1 piece',
        'tooBig' => 'You cannot order more than 250 pieces at once',
        'message' => 'Do not enter zero or/and characters for Spare parts!',
        'on' => 'myScenario'),
      array('cost_labour','numerical',
        'integerOnly' => true,
        'min' => 1,
        'max' => 250,
        'tooSmall' => 'You must order at least 1 piece',
        'tooBig' => 'You cannot order more than 250 pieces at once',
        'message' => 'Do not enter zero or/and characters for Labour Charges!',
        'on' => 'myScenario'),
    );
}

そして、コントローラーで次のように記述します。

public function actionUpdate ($id)
{ 
  if (isset($_POST['TblEnquiry']))
  {
     [...]
     $model->setScenario('myScenario');
  }
}

編集このドキュメント
に関しては、入力のみが必要なことがわかりました。したがって、これはあなたのニーズにより適しているかもしれません。どちらも同じチェックを取得したため、1 つのチェックを実行して、後でメッセージを渡すことができます。しかし、今のところ、これでうまくいくはずです。numerical

エクストラ
あなたが書いたように、あなたのルールには別のバグがあります。

  array('cost_spares', 'cost_spare_func', 'match',
    'pattern' => '/^[a-zA-Z]+$/',
    'message' => 'Do not enter zero or/and characters for Spare parts!',
    'on' => 'cost_spare_func'),

それは不可能です。ルールの検証機能と のようなデフォルトの検証を混在させることはできませんmatch

つまり、次のvalidation functionようにのみ定義できます。

  array('cost_spares', 'cost_spare_func',
    'message' => 'Do not enter zero or/and characters for Spare parts!',
    'on' => 'cost_spare_func'),

または、次のようなデフォルトの検証を使用します。

  array('cost_spares', 'match',
    'pattern' => '/^[a-zA-Z]+$/',
    'message' => 'Do not enter zero or/and characters for Spare parts!',
    'on' => 'cost_spare_func'),
于 2014-04-25T09:05:03.127 に答える