小部件是可复用的控件,它们拥有用户界面和一个后端控制器(即小部件类),该控制器负责准备小部件数据并处理由小部件用户界面生成的 AJAX 请求。
小部件是 CMS 组件 的后端等效项。它们很相似,因为它们是模块化的功能包,提供局部视图,并使用别名命名。关键区别在于,后端小部件使用 YAML 标记进行配置,并手动将自身绑定到后端控制器。
小组件类位于插件目录的 widgets 目录中。内部目录名称与以小写形式书写的小组件类的名称匹配。小组件可以提供资产和局部文件。小组件目录结构示例如下所示:
├── widgets
| ├── form
| | ├── partials
| | | └── _form.php ← 局部文件
| | └── assets
| | ├── js
| | | └── form.js ← JavaScript 文件
| | └── css
| | └── form.css ← 样式表文件
| └── Form.php ← 部件类
通用的部件类必须继承 Backend\Classes\WidgetBase 类。与其他插件类一样,通用的部件控制器应属于插件命名空间。以下是一个部件类定义的示例。
namespace Backend\Widgets;
use Backend\Classes\WidgetBase;
class Lists extends WidgetBase
{
/**
* @var string defaultAlias to identify this widget.
*/
protected $defaultAlias = 'list';
// ...
}微件类必须包含一个 render() 方法,用于通过渲染微件局部视图来生成微件标记。示例:
public function render()
{
return $this->makePartial('list');
}若要将变量传递给分部,你可以选择将它们添加到 $vars 属性。
public function render()
{
$this->vars['var'] = 'value';
return $this->makePartial('list');
}或者您也可以将变量作为makePartial()方法的第二个参数传入:
public function render()
{
return $this->makePartial('list', ['var' => 'value']);
}绑定到控制器也是必需的以使 AJAX 处理程序可用。
一个部件应绑定到一个后端控制器,才能开始在后端页面或局部视图中使用它。使用部件的 bindToController 方法来将其绑定到控制器。初始化部件的最佳位置是控制器的 beforeDisplay 方法,该方法从构造函数中调用。
例如,创建一个新的部件实例并将其绑定到控制器。请注意,构造函数将控制器作为第一个参数。
public function beforeDisplay()
{
$myWidget = new MyWidgetClass($this);
$myWidget->alias = 'myWidget';
$myWidget->bindToController();
}绑定微件后,您可以使用 $this->widget 属性,通过其别名在控制器的视图或局部视图中访问它。
<?= $this->widget->myWidget->render() ?>有时您可能希望代码在 AJAX 处理程序执行之前执行。在组件中定义一个 init 方法允许代码在每个 AJAX 处理程序之前运行。
function init()
{
// From a widget class
}