如何在 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>
它有效。但是有多个问题,似乎是由同一件事引起的——他的表单字段没有引用到模型属性/属性:
当我将字段 foo
和 baz
设为必需时(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 中为自定义产品数据选项卡定义图标