如何在 Yii 中为自定义 CActiveRecord 属性设置验证规则?

Posted

技术标签:

【中文标题】如何在 Yii 中为自定义 CActiveRecord 属性设置验证规则?【英文标题】:How to set validation rules for custom CActiveRecord attributes in Yii? 【发布时间】:2015-07-11 17:39:27 【问题描述】:

我正在开发一个带有数据库的 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>

它有效。但是有多个问题,似乎是由同一件事引起的——他的表单字段没有引用到模型属性/属性:

    当我将字段 foobaz 设为必需时(public function rules() return array(array('foo, baz', 'required')); -- 属性 $foo 已定义)foo 如愿以偿,但 baz 会导致“foo 不能为空”错误。所以我不能将data[*] 设置为required

    如果表单无效并重新加载,则所有 data[*] 字段为空。

    data[*] 字段未标记为必填项。

有没有办法在不改变数据结构的情况下解决这个问题?不会有正确的方法,但可能是一种解决方法。

【问题讨论】:

【参考方案1】:

以这种方式验证字段是不可能的。首先,如果您在模型中使用字段,则它必须在表中定义或存在于活动记录中。所以如果你想验证这样的结构是唯一正确的方法:

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>

【讨论】:

以上是关于如何在 Yii 中为自定义 CActiveRecord 属性设置验证规则?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WooCommerce 中为自定义产品数据选项卡定义图标

如何在 JavaScript 中为自定义对象创建方法?

如何在 iOS 中为自定义属性设置动画

如何在 Angular 中为自定义组件实现伪事件?

如何在 .NET 中为自定义配置部分启用 configSource 属性?

如何在 WooCommerce 中为自定义产品类型启用价格和库存