OctoberCMS:如何在不知道组件名称

时间:2017-10-27 01:56:24

标签: laravel octobercms

在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”注册类名。检查组件插件。

即使我没有使用其中一个类 许多在线引用此错误消息,但没有一个帮助我。

编辑:进一步说明

(希望)简化了我正在努力实现的目标。

本质上,我想象一个由一系列组件组成的页面过程 每个组件在下一个组件中调用一个函数,直到该过程结束 只需更换组件即可修改整个过程 我猜测连接组件的唯一方法是标准化函数名称。所以这(可能是?)要求组件属于该过程的特定阶段,尽管如果它们中的每一个都可以适合任何阶段(在适当的情况下),那将是理想的。

illustration

2 个答案:

答案 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

http://octobercms.com/docs/plugin/settings#introduction

答案 1 :(得分:0)

  1. 扩展基本组件类并添加您的功能并让组件从此扩展?

  2. 使用该函数创建一个新的辅助类,可以将其称为静态

  3. 添加全局功能 https://octobercms.com/forum/post/global-php-classesfunctions