0

我正在开发一个带有数据库的 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不能为空”错误。所以我不能设置 a data[*]as required

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

  3. 这些data[*]字段未标记为必填项。

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

4

1 回答 1

0

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

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>
于 2015-07-13T08:23:37.110 回答