在yii2中显示两个模型项作为单选列表,用户只能选择一个


showing two model items in yii2 as a radio list where a user cannot select both but one

我有一个模型有两个项目:is_normal和is_transporter

我想把这两个都以活动形式显示为单选列表,但是我还不知道怎么做

这是模型:

 public function rules()
{
    return [
        [['reg_no', 'truck_category', 'added_by', 'truck_status', 'driver_name'], 'required'],
        [['truck_category', 'added_by', 'truck_status', 'is_normal', 'is_transporter'], 'integer'],
        [['added_on'], 'safe'],
        [['reg_no'], 'string', 'max' => 50],
        [['driver_name'], 'string', 'max' => 100],
        [['truck_category'], 'exist', 'skipOnError' => true, 'targetClass' => TblChecklistCategory::className(), 'targetAttribute' => ['truck_category' => 'id']],
        [['added_by'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['added_by' => 'id']],
        [['truck_status'], 'exist', 'skipOnError' => true, 'targetClass' => TblTruckStatus::className(), 'targetAttribute' => ['truck_status' => 'id']],
    ];
}

如何使用活动形式的两个模型属性作为radiolist

当一个属性足够时,我会避免使用两个属性,但如果你真的需要,这里有答案。

模型中准备虚拟属性来处理单选按钮。

/**
 * @var boolean
 */
public $normal_or_transporter;

你需要添加到规则:

public function rules()
{
    return [
        // ...
        [['reg_no', 'truck_category', 'added_by', 'truck_status', 'driver_name', 'normal_or_transporter'], 'required'],
        ['normal_or_transporter', 'boolean'],
    ];
}

现在在表单视图添加这个字段(假设是标准的ActiveForm小部件):

<?= $form->field($model, 'normal_or_transporter')->radioList([
    0 => 'Normal truck',
    1 => 'Transporter'
]) ?>

最后一步是处理虚拟属性。您可以再次在模型中执行此操作。我们可以使用beforeSave(),因为is_normalis_transporter不在required规则中,因此验证通过而不设置它们。

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        $this->is_normal = 0;
        $this->is_transporter = 0;
        if ($this->normal_or_transporter) {
            $this->is_transporter = 1;
        } else {
            $this->is_normal = 1;
        }
        return true;
    }
    return false;
}