1

これは一見奇妙に見えるかもしれません。

一部の必須フィールドが欠落している場合でも、ユーザーがデータベースに保存できるようにする必要があります。

次に、ユーザーがそれらのレコードを公開したい場合、それらの必須フィールドが欠落しているため、許可されるべきではありません。

おそらく、次のような必要なバリエーションを作成します。公開には必要ですが、挿入には必要ありません。

Yiiの知識を考慮して、この場合に使用する必要のあるパターンはありますか?

アップデート

シナリオは優れたアプローチのようですが、ドキュメントでは次のように追加することを提案しています。

$model = new MyActiveRecord('Inserting');

私たちのコントローラーで。

ただし、私のコントローラーには、次のようなものがあります。

public function actionCreate()
{
  $this->layout = 'admin';

  $model=new HsGuestbook;

  $localized[] = $this->getExtraModelGuestTr();

  if(isset($_POST['HsGuestbook']))
  {
   ...

だから、私はやろうとしました:

  if(isset($_POST['HsGuestbook']))
  {
     //check validation scenarios
     if ($model->status === 0) { //if publish isn't set:
          $model->setScenario('Insert'); 
     } elseif ($model->status === 1){
           $model->setScenario('Publish'); 
     }

そして私のモデルでは:

public function rules()
{
    return array(
         array('name, category', 'required', 'on'=>'Insert'),
         array('name, category, image', 'required', 'on'=>'Publish'))

検証が表示されませんでした。

4

3 に答える 3

3

Yiiのシナリオを使用できます。「挿入」のような1つのシナリオと、「公開」のような別のシナリオを宣言します。

モデルのルールには、次のものがあります。

array('username, password, all your required attibutes', 'required', 'on'=>'Publishing'), 
// You defined with the "on" the scenario(s) in which the rule must apply

そして、コントローラーで次のように呼び出します。

挿入する必要がある場合は、シナリオを「挿入」に設定します

$model = new MyActiveRecord('Inserting');

公開する必要がある場合は、シナリオを「公開」に設定します

$model = new MyActiveRecord('Publishing');

リンク:シナリオを理解する

于 2012-06-21T12:02:43.627 に答える
2

必須フィールドを許可しないための制限は、yiiではなくデータベースに由来することに注意してください。モデルは、データベースに配置されているスキーマに基づいています。モデルクラスのルールを安全に変更した場合でも、必須フィールドが欠落しているため、データベースは挿入を通過できません。

データベースから制限を削除することはお勧めしません。エントリを公開可能または非公開としてマークする別のフィールドをテーブルに追加するのはどうでしょうか。デフォルト値を指定し、公開フラグをfalseに設定することで、不足している必須エントリを克服できます。

于 2012-06-21T11:41:46.923 に答える
1

編集はまったく別の質問なので、新しい応答を作成しています

シナリオを割り当てる前に、モデルに投稿値を入力する必要があります

   <?php if(isset($_POST['HsGuestbook'])) {
         //Assign the post value to your model
         $model->attributes =  $_POST['HsGuestbook'];          
         //check validation scenarios 
          if ($model->status === 0) 
          { 
            //if publish isn't set: 
            $model->setScenario('Insert');
           } 
          elseif ($model->status === 1)
          { 
            $model->setScenario('Publish');
              }
         //Here you should validate/save the datas
        } ?>

そして、あなたはデータを検証することができます

$model->validate();

Wichはtrueまたはfalseを返します。または、データを保存しながら検証することもできます。

$model->save(); // will validate the datas then save them

また、trueまたはfalseを返します

于 2012-09-12T14:00:07.917 に答える