Почему несколько сценариев не работают в Yii?

Я использую несколько сценариев в своем приложении, но сталкиваюсь с проблемой, которая каждый раз, когда последний сценарий отменяет первый.


Модель:

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');
  }
}

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');
  }
}

Редактировать:
Что касается этого документа, я просто вижу, что вы хотите только 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'),
Другие вопросы по тегам