组件是可复用的控件,它们具有用户界面和后端控制器(即组件类),该控制器准备组件数据并处理由组件用户界面生成的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 方法,它从构造函数中调用。
例如,创建一个新的 widget 实例并将其绑定到控制器。请注意,构造函数将控制器作为第一个参数。
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
}