通过表单微件,您可以向后端表单添加新的控件类型。它们提供用于为模型提供数据的常见功能。表单微件必须在插件注册文件中注册。
` Form Widget 类位于插件的 formwidgets 目录下。内部目录名与 widget 类名(小写)相匹配。Widgets 可以提供资源和局部视图。一个 Form Widget 目录结构示例如下。
├── formwidgets
| ├── colorpicker
| | ├── partials
| | | └── _colorpicker.php ← 局部文件
| | └── assets
| | ├── js
| | | └── colorpicker.js ← JavaScript 文件
| | └── css
| | └── colorpicker.css ← 样式表文件
| └── ColorPicker.php ← 部件类
该 create:formwidget 命令生成一个后端表单部件, 视图 和基本资产文件。第一个参数指定作者和插件名称。第二个参数指定表单部件类名。
php artisan create:formwidget Acme.Blog ColorPicker表单小部件类必须扩展 Backend\Classes\FormWidgetBase 类。 注册的小部件可以在后端 表单字段定义 文件中使用。 示例表单小部件类定义。
namespace Backend\FormWidgets;
use Backend\Classes\FormWidgetBase;
class ColorPicker extends FormWidgetBase
{
/**
* @var string defaultAlias to identify this widget.
*/
protected $defaultAlias = 'colorpicker';
public function render() {}
}表单小部件可能具有可以通过表单字段配置设置的属性。只需在类上定义可配置属性,然后调用 fillFromConfig 方法来在 init 方法定义内部填充它们。
class DatePicker extends FormWidgetBase
{
//
// Configurable properties
//
/**
* @var string mode for display: datetime, date, time.
*/
public $mode = 'datetime';
/**
* @var string minDate is the minimum/earliest date that can be selected.
* eg: 2000-01-01
*/
public $minDate = null;
/**
* @var string maxDate is the maximum/latest date that can be selected.
* eg: 2020-12-31
*/
public $maxDate = null;
//
// Object properties
//
/**
* {@inheritDoc}
*/
protected $defaultAlias = 'datepicker';
/**
* {@inheritDoc}
*/
public function init()
{
$this->fillFromConfig([
'mode',
'minDate',
'maxDate',
]);
}
// ...
}属性值然后变得可从 表单字段定义 设置 当使用该小部件时。
born_at:
label: Date of Birth
type: datepicker
mode: date
minDate: 1984-04-12
maxDate: 2014-04-23插件应通过重写其 插件注册文件 中的 registerFormWidgets 方法来注册表单小部件。该方法返回一个数组,其中键包含小部件类,值包含小部件短代码。示例:
public function registerFormWidgets()
{
return [
\Backend\FormWidgets\ColorPicker::class => 'colorpicker',
\Backend\FormWidgets\DatePicker::class => 'datepicker'
];
}短代码是可选的,并且可以在表单字段定义中引用小部件时使用,它应该是一个唯一值以避免与其他表单字段冲突。
表单部件的主要目的是与您的模型进行交互,这意味着在大多数情况下通过数据库加载和保存值。当表单部件渲染时,它将使用 getLoadValue 方法请求其存储值。getId 和 getFieldName 方法将返回表单中使用的 HTML 元素的唯一标识符和名称。这些值通常在渲染时传递给部件分部。
public function render()
{
$this->vars['id'] = $this->getId();
$this->vars['name'] = $this->getFieldName();
$this->vars['value'] = $this->getLoadValue();
return $this->makePartial('myformwidget');
}从基本层面来看,表单微件可以使用输入元素将用户输入值返回。从上面的示例中,在 myformwidget 分部中,该元素可以使用准备好的变量进行渲染。
<input id="<?= $id ?>" name="<?= $name ?>" value="<?= e($value) ?>" />When the time comes to take the user input and store it in the database, the form widget will call the getSaveValue internally to request the value. To modify this behavior simply override the method in your form widget class.
public function getSaveValue($value)
{
return $value;
}在某些情况下,您有意不希望提供任何值,例如,一个只显示信息而不保存任何内容的表单小部件。返回名为FormField::NO_SAVE_DATA的特殊常量,该常量派生自Backend\Classes\FormField类,以使该值被忽略。
public function getSaveValue($value)
{
return \Backend\Classes\FormField::NO_SAVE_DATA;
}