簡體   English   中英

如何在Yii中為自定義CActiveRecord屬性設置驗證規則?

[英]How to set validation rules for custom CActiveRecord attributes in Yii?

我正在一個帶有數據庫的Yii項目上工作,該數據庫包含一個表,其中幾乎所有數據都以JSON格式保存在字段中( 這很瘋狂,但事實如此 ):

id      INTEGER
user_id INTEGER
data    LONGTEXT

此“ JSON字段” data具有以下結構,並且除其他外包含圖像:

{
   "id":"1",
   "foo":"bar",
   ...
   "data":{
      "baz":"buz",
      ...
    }
}

顯示它沒問題,但是現在我想使數據可編輯。 我的表格如下所示:

<?php
$form = $this->beginWidget('CActiveForm', array(
    'id' => 'my-form',
    'htmlOptions' => array('enctype' => 'multipart/form-data'),
    'enableAjaxValidation'=>false,
));
?>
<div class="row">
    <?php echo $form->labelEx($model, 'foo'); ?>
    <?php
    echo $form->textField($model, 'foo', array(...));
    ?>
    <?php echo $form->error($model, 'foo'); ?>
</div>
<div class="row">
    <?php echo $form->labelEx($model, 'baz'); ?>
    <?php
    echo $form->textField($model, 'data[baz]', array(...));
    ?>
    <?php echo $form->error($model, 'data[baz]'); ?>
</div>

有用。 但是存在多個問題,這似乎是由同一件事引起的-他的表單字段未引用模型的屬性/屬性:

  1. 當我將foobaz必填字段時( public function rules() { return array(array('foo, baz', 'required')); } -定義了$foo屬性) foo表現出了所希望的行為,但baz會導致“ foo不能為空”錯誤。 因此,我無法根據required設置data[*]

  2. 如果表單無效並被重新加載,則所有data[*]字段均為空。

  3. data[*]字段未標記為必填項。

有沒有解決這個問題而無需更改數據結構的方法? 不會有正確的方法,但是可能有解決方法。

以這種方式驗證字段是不可能的。 首先,如果要在模型中使用字段,則必須為活動記錄定義或存在於表中。 因此,如果您想驗證這種結構的唯一正確方法是:

class Model extends CActiveRecord {
  // Define public varialble
  public $data_baz;

  public function rules(){
    return array(
      // Add it to rules
      array( 'data_baz', 'required' )
    );
  }

  public function attributeLabels(){
    return array(
      // Add it to list of labels
      'data_baz' => 'Some field'
    );
  }

  protected function beforeSave(){
    if ( !parent::beforeSave() ) {
      return false;
    }

    // Also you may create a list with names to automate append
    $this->data['baz'] = $this->data_baz;

    // And serialize data before save
    $this->data = serialize( $this->data );

    return true;
  }
}

你的表格應該看起來像

<div class="row">
    <?php echo $form->labelEx($model, 'data_baz'); ?>
    <?php echo $form->textField($model, 'data_baz'); ?>
    <?php echo $form->error($model, 'data_baz'); ?>
</div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM