首页 > 解决方案 > 如何使yii2中表单字段小部件的值(要读取)与用户在输入文本框中看到的不同

问题描述

我正在修改已经在 yii2 框架中开发的系统。

有一个功能,用户可以查看客户列表,并且针对每条记录都有一个用于编辑的按钮。单击时,会显示一个表单,其中会自动为单击“编辑”按钮的客户填写值。现在,这是一个地址字段,其中填充了地址的数据库记录 ID,而不是位置的名称。id 是一个数字,并且在单击“更新”按钮时验证了该字段以检查该值是否为数字。

问题:用户要求我用不是数字的位置名称填写该字段,而不是用数字(即id)填充该字段,因此将违反验证规则。

我希望能够将输入字段的值(即 value 属性)设置为 id -a 数字,这样它就不会违反设置规则 - 但在文本输入中显示位置的名称,以便用户有一个可读的“价值”来查看。

我怎样才能做到这一点?

代码 有这个:

<div class="col-sm-6"> 
    <?= $form->field($model, 'village')->widget(\kartik\widgets\Select2::classname(), [
        'options' => ['value' =>$model->village],
        'pluginOptions' => [
            'allowClear' => true
        ],
    ]); ?>
</div>

$model->village中的值是村庄的 id。这是用户不想要的。

我试过这样做:

<div class="col-sm-6">
  <?php 
  $villageName = Yii::$app->db->createCommand('SELECT village_name FROM v_village WHERE id='.$model->village)->queryOne();
  $streetName = Yii::$app->db->createCommand('SELECT street FROM v_street WHERE street_id='.$model->street)->queryOne();
 
  ?>
    <?= $form->field($model, 'village')->widget(\kartik\widgets\Select2::classname(), [
        'options' => ['value' => $villageName['village'], 'id' => $model->village],
        'pluginOptions' => [
            'allowClear' => true
        ],
    ]); ?>
</div>

但这违反了验证规则,我得到的错误是“村庄必须是一个数字”

标签: formsinputyii2widgetfield

解决方案


您必须设置您选择的数据数组。

<div class="col-sm-6">
  <?php 
  $villageName = Yii::$app->db->createCommand('SELECT village_name FROM v_village WHERE id='.$model->village)->queryOne();
  $streetName = Yii::$app->db->createCommand('SELECT street FROM v_street WHERE street_id='.$model->street)->queryOne();
 
  ?>
    <?= $form->field($model, 'village')->widget(\kartik\widgets\Select2::classname(), [
        'data' => [$model->village => $villageName['village']],
        'pluginOptions' => [
            'allowClear' => true //are you sure you want to be able to clear the option? If you save it empty the query above will break
        ],
    ]); ?>
</div>

我不确定你的目的是什么,但如果你只有这个值,你可以像文本一样显示它。

如果您希望能够更改村庄,您的代码必须是这样的:

<?= $form->field($model, 'village')->widget(\kartik\widgets\Select2::classname(), [
    'data' => ArrayHelper::map(Village::find()->all(), 'id', 'village_name'),
    'pluginOptions' => [
        'allowClear' => true //are you sure you want to be able to clear the option? If you save it empty the query above will break
    ],
]); ?>

您也可以像这样删除查询并设置数据:

'data' => ArrayHelper::map(Village::find()->where(['id' => $model->village])->all(), 'id', 'village_name')

推荐阅读