yii2 自定义字段类型
yii2 custom field type
我正在使用 Yii2,我想创建自定义活动表单字段类型。
例如,创建一个文本输入表单域是这样发生的:
$form = ActiveForm::begin();
$form->field($model, 'attribute_name')->textInput(['maxlength' => true])
我想制作自定义 json 输入字段类型和特殊渲染,并像这样使用它:
$form->field($model, 'attribute_name')->JsonInput(['maxlength' => true]);
而不是这样:
$form->field($model, 'attribute_name')->widget('trntv\aceeditor\Widget','mode'=>'json);
如何扩展 yii\widgets\ActiveForm
以便添加自定义表单字段类型?有可能吗?
我发现的唯一相关信息是在 Yii forum 中,但使用格式不同:
$form->myCheckbox($model, 'attribute_name');
并且我希望用法类似于 yii 表单类型:
$form->field($model, 'attribute_name')->JsonInput(['maxlength' => true]);
您需要创建:
- 使用方法
JsonInput()
自定义 ActiveField
class(使用您的小部件配置调用 widget()
)。
- 自定义
ActiveForm
class 已将 fieldClass
属性 更改为您的自定义 ActiveField
class。您可以将 @method \my\custom\ActiveField field(\yii\base\Model $model, string $attribute, array $options = [])
添加到 ActiveForm
的 PHPDoc 以获得更好的代码完成。
您也可以跳过创建自己的 ActiveForm
并临时更改 fieldClass
:
$form = ActiveForm::begin([
'fieldClass' => \my\custom\ActiveField::class,
])
但是您每次都需要重复它,并且您不会在 ActiveField
.
中获得自定义方法的代码完成
我正在使用 Yii2,我想创建自定义活动表单字段类型。
例如,创建一个文本输入表单域是这样发生的:
$form = ActiveForm::begin();
$form->field($model, 'attribute_name')->textInput(['maxlength' => true])
我想制作自定义 json 输入字段类型和特殊渲染,并像这样使用它:
$form->field($model, 'attribute_name')->JsonInput(['maxlength' => true]);
而不是这样:
$form->field($model, 'attribute_name')->widget('trntv\aceeditor\Widget','mode'=>'json);
如何扩展 yii\widgets\ActiveForm
以便添加自定义表单字段类型?有可能吗?
我发现的唯一相关信息是在 Yii forum 中,但使用格式不同:
$form->myCheckbox($model, 'attribute_name');
并且我希望用法类似于 yii 表单类型:
$form->field($model, 'attribute_name')->JsonInput(['maxlength' => true]);
您需要创建:
- 使用方法
JsonInput()
自定义ActiveField
class(使用您的小部件配置调用widget()
)。 - 自定义
ActiveForm
class 已将fieldClass
属性 更改为您的自定义ActiveField
class。您可以将@method \my\custom\ActiveField field(\yii\base\Model $model, string $attribute, array $options = [])
添加到ActiveForm
的 PHPDoc 以获得更好的代码完成。
您也可以跳过创建自己的 ActiveForm
并临时更改 fieldClass
:
$form = ActiveForm::begin([
'fieldClass' => \my\custom\ActiveField::class,
])
但是您每次都需要重复它,并且您不会在 ActiveField
.