我有一个模型有两个项目: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_normal
和is_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;
}