在OctoberCMS中,我想通过附加不同的插件组件来更改页面进程。
我有一个插件组件(makeform
),它插入一个表单(在数据库表中定义)
点击表单的submit
按钮即可调出onSubmit()
process()
process()
是另一个插件组件中定义的函数。
i)我可以在process()
内调用makeform
而不知道其他插件或其组件的名称吗?也就是说,无需use 'Acme\Plugin\Components\ProcessForm', 'processForm';
ii)或者,我可以以编程方式发现其他附加组件的名称及其插件,然后以某种方式指定它的process()
函数吗?
iii)或是使用静态properties
下拉列表来选择哪个进程,然后动态添加组件。总是假设我可以$this->addComponent('Acme\Plugin\Components\ProcessForm', 'processForm');
超过init()
。
编辑:实验
我希望动态addComponent()
无论我放在哪里,在init()
或其他地方,我都会收到错误:
未为组件“Acme \ Plugin \ Components \ ProcessForm”注册类名。检查组件插件。
即使我没有使用其中一个类 许多在线引用此错误消息,但没有一个帮助我。
编辑:进一步说明
(希望)简化了我正在努力实现的目标。
本质上,我想象一个由一系列组件组成的页面过程 每个组件在下一个组件中调用一个函数,直到该过程结束 只需更换组件即可修改整个过程 我猜测连接组件的唯一方法是标准化函数名称。所以这(可能是?)要求组件属于该过程的特定阶段,尽管如果它们中的每一个都可以适合任何阶段(在适当的情况下),那将是理想的。
答案 0 :(得分:0)
我认为最好的方法是定义另一个属性,在其中设置插件的命名空间。
app_eval {
while 1 {puts -nonewline .;after 100}
}
app_cancel
-
public function defineProperties(){
'pluginName' => [
'label' => 'Plugin Namespace to call process method from',
'type' => 'text'
]
}
通过这种方式,您可以保持组件逻辑不受任何硬编码插件名称的影响。
编辑:30/10/17
我不确定是否有办法列出应用程序中的所有可用组件。另一种方法是设置一个public function onSubmit(){
$plugin = $this->property('pluginName');
$plugin::process($formData);
}
页面,其中Settings
个类别可以在其中声明所有可用的名称空间组件。
您可以将其解析为repeater
方法中的数组并将其返回到下拉列表。
onSubmit
/Models/Settings/fields.yaml
public function defineProperties(){
'components' => [
'label' => 'Plugin Namespace to call process method from',
'type' => 'dropdown',
'options' => 'getComponentsOptions' // optional but easier to understand
]
}
public function getComponentsOptions(){
$components = Settings::get('components');
$options = [];
foreach ($components as $component)
{
$options[$component['namespace']] = $component['name'];
}
return $options;
}
/Models/Settings.php
fields:
components:
type: repeater
form:
fields:
name:
placeholder: My Component Name
span: left
namespace:
placeholder: Acme\Name\Components\MyComponent;
span: right
答案 1 :(得分:0)
扩展基本组件类并添加您的功能并让组件从此扩展?
使用该函数创建一个新的辅助类,可以将其称为静态
添加全局功能 https://octobercms.com/forum/post/global-php-classesfunctions