我正在與數據庫中的Yii的項目,包含一個表,其中幾乎所有它的數據保存在一個字段作爲JSON(它的瘋狂,但它是如此,因爲它是):如何在Yii中爲自定義CActiveRecord屬性設置驗證規則?
id INTEGER
user_id INTEGER
data LONGTEXT
這種「JSON場」 data
具有以下結構,並含有特別的圖像:
{
"id":"1",
"foo":"bar",
...
"data":{
"baz":"buz",
...
}
}
顯示它是沒有問題的,但現在我想以使數據ediable。我的表單看起來像這樣:
<?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
bahaves如所願,但baz
導致「foo不能爲空」錯誤。所以我不能將data[*]
設置爲required
。如果表單無效並被重新加載,則所有
data[*]
字段爲空。data[*]
字段未按要求標記。
有沒有解決這個問題而不改變數據結構?這不會有一個正確的方法,但也許是一種解決方法。