如何使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,[
        'options' => ['value' => $villageName['village'],'id' => $model->village],]); ?>
</div>

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

解决方法

您有你选择的一组数据阵列。

<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,[
    '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(),'village_name')